不知道大家有没有尝试过在Sqlite数据库中一次性删除上千条数据。你会发现删除函数返回后,但是数据并未删除。这是怎么回事喃?正是Sqlite这个轻量级数据库本身的缺陷,无法高速处理大数据量操作。不信引用一段Android源码你们看看Google是如何写Sqlite删除语句的。
看出来没有,两个sleep。采用的是循环删除,每次只处理100条记录,每次删除操作间需要休息100ms。
do
{
currentnumber++;
id = idCursor.getInt(0);
if(iBatchDeleted>1 && !idCursor.isLast())
{
if (sWhere.length() == 0)
{
sWhere.append(Contacts._ID + " IN (" + id);
} else
{
sWhere.append(", " + id);
}
iBatchDeleted--;
} else
{
if (sWhere.length() == 0)
{
sWhere.append(Contacts._ID + "=" + id);
} else
{
sWhere.append(", " + id + ")");
}
ops.clear();
ops.add(ContentProviderOperation.newDelete(RawContacts.CONTENT_URI)
.withSelection(sWhere.toString(),null)
.build());
try {
cr.applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException e) {
e.printStackTrace();
Log.e(tag,"deleteContact: catch exception!");
return false;
} catch (OperationApplicationException e) {
e.printStackTrace();
Log.e(tag,"deleteContact: catch exception!");
return false;
}
iBatchDeleted = 100;
sWhere.delete(0, sWhere.length());
try
{
if(!idCursor.isLast())
{
Thread.sleep(50);
}else {
Thread.sleep(100);
}
}
catch (InterruptedException e) {
}
}