【问题标题】:SQLiteDatabase DROP TABLE IF EXISTS not workingSQLiteDatabase DROP TABLE IF EXISTS 不工作
【发布时间】:2018-11-22 15:09:27
【问题描述】:

情况
我需要删除数据库中特定表的所有条目,所以我想我会删除它。

DROP TABLE IF EXISTS LogEntry

我尝试使用SQLiteDatabase#execSql(String) 和SQLiteDatabase#rawQuery(String, String[]) 运行sql。我在执行之前启动一个事务,并在使用SQLiteDatabase#beginTransaction() 和SQLiteDatabase#endTransaction() 执行它之后结束它。

问题
在这两种情况下,SQL 都在没有抛出异常的情况下执行,但表仍然存在。我在 drop 之后立即运行了一个 SELECT 语句以查看它是否有效,并且它的结果与 drop 之前相同。

【问题讨论】:

  • 为什么不只是delete from LogEntry。那么你不需要重新创建它
  • @juergend 这将是一种可能的解决方法,但是一旦桌子空了,我就不需要桌子了。我最感兴趣的是 drop 语句执行但没有任何效果的原因。
  • beginTransaction() 必须在执行 SQL 命令之前调用。 rawQuery() 仅用于运行查询,而不用于运行命令。实际上是execSql(),而不是executeSql()
  • 您的交易具体在哪里?注意@MikeT 的回答中关于嵌套事务的引用 - SQLiteOpenHelper 生命周期回调已经在事务中运行。
  • @Basti 您更改了数据库版本?

标签: android database sqlite


【解决方案1】:

我相信,假设 # 是 . 的,原因是你省略了 setTransactionSuccessful,没有这个 endTransaction 会回滚(撤消事务中所做的一切)。

根据:-

事务可以嵌套。当外部事务结束时,所有 在该事务和所有嵌套事务中完成的工作 将被提交或回滚。 如果出现以下情况,更改将被回滚 任何事务在没有被标记为干净的情况下结束(通过调用 setTransactionSuccessful)。否则他们将被提交。

beginTransaction

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2021-04-18
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多