Sqlite 大数据量删除问题

不知道大家有没有尝试过在Sqlite数据库中一次性删除上千条数据。你会发现删除函数返回后,但是数据并未删除。这是怎么回事喃?正是Sqlite这个轻量级数据库本身的缺陷,无法高速处理大数据量操作。不信引用一段Android源码你们看看Google是如何写Sqlite删除语句的。
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) {
                }
            }
看出来没有,两个sleep。采用的是循环删除,每次只处理100条记录,每次删除操作间需要休息100ms。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: SQLite是一种轻级的数据库管理系统,它提供了删除和恢复数据方法。 在SQLite中,可以通过执行DELETE语句来删除数据。DELETE语句使用WHERE子句来指定要删除数据行。例如,可以使用以下语句删除名为"students"的表中学号为101的学生记录: ``` DELETE FROM students WHERE 学号 = 101; ``` 执行该语句后,学号为101的学生记录将被从表中删除。 如果在删除数据之前需要备份数据或者希望在删除之后进行撤销操作,可以使用事务。SQLite支持事务的回滚操作,可以通过BEGIN、ROLLBACK和COMMIT语句来控制事务的开始、回滚和提交。 如果希望恢复已经删除数据,可以使用备份文件进行恢复。SQLite数据库可以通过将其文件复制到其他位置来进行备份。在需要恢复数据时,只需将备份文件复制回原位置即可恢复数据。 另外,SQLite还提供了其他一些备份和恢复数据方法。可以使用导出和导入工具,如SQLite的命令行工具或可视化工具,将数据导出到文件中,并在需要时将数据重新导入到数据库中。 总结起来,SQLite提供了删除和恢复数据的方式。删除数据可以使用DELETE语句,而恢复数据可以通过备份文件或使用导入工具来实现。 ### 回答2: 在SQLite中,我们可以使用DELETE语句来删除数据删除数据的过程是永久性的,一旦删除之后无法直接恢复。因此,在进行数据删除操作之前,请务必进行备份以防止意外删除。 如果您在进行数据删除后发现需要恢复数据,有几种途径可以尝试恢复数据: 1. 从备份中还原:如果您之前已经进行了数据备份,可以通过将备份的数据还原到数据库中来恢复被删除数据。这需要您在删除数据之前,定期创建并保存数据库备份文件。 2. 通过日志回滚:SQLite具有事务日志功能,可以记录在事务中进行的所有更改操作,包括数据删除。通过使用事务日志进行回滚操作,可以恢复到删除操作之前的数据状态。但是这种方法只适用于在进行删除操作之前,事务日志已经完整记录了该删除操作。 要使用日志回滚恢复数据,可以执行以下步骤: - 打开数据库连接,并将其设置为WAL模式(Write-Ahead Logging)。 - 执行ROLLBACK命令,回滚到适当的事务状态。 - 关闭数据库连接并重新打开。 需要注意的是,这种方法只适用于在删除操作之前,事务日志已经完整记录了该删除操作。如果删除操作发生在未记录事务日志的情况下,这个方法将无法恢复数据。 总而言之,SQLite数据删除是一个永久性的操作,一旦删除无法直接恢复。因此,在进行删除操作之前,请确保进行了数据备份,并在可能的情况下使用事务日志来进行回滚操作以恢复数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bluebelfast

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值