【问题标题】:SQLite VACUUM CommandSQLite VACUUM 命令
【发布时间】:2014-05-28 00:31:04
【问题描述】:

通常我正在使用我的应用程序,超过 30000 次下载没有问题。但我看到此错误开始出现在 android 开发者控制台(崩溃和 ANRS)

按应用版本 3.1.1 1 100.0%

按 Android 版本 Android 2.3.3 - 2.3.7 1 100.0%

按设备刀片(blade)

这是我的代码:

public  void deletetable(String Tablename){
    SQLiteDatabase db = mContext.openOrCreateDatabase(DB_NAME,
            Context.MODE_PRIVATE, null);
    db.delete(Tablename, null, null);
    db.execSQL("VACUUM"); 
}

这是报告:

java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: android.database.sqlite.SQLiteDiskIOException: disk I/O error: VACUUM
at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1763)
at com.restroomgames.kpss.TestAdapter.deletetable(TestAdapter.java:194)
at com.restroomgames.kpss.TrGenelSinavAnasayfa.yenile(TrGenelSinavAnasayfa.java:395)
at com.restroomgames.kpss.TrGenelSinavAnasayfa$refreshyazi.doInBackground(TrGenelSinavAnasayfa.java:381)
at com.restroomgames.kpss.TrGenelSinavAnasayfa$refreshyazi.doInBackground(TrGenelSinavAnasayfa.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
... 4 more

【问题讨论】:

  • 尝试使用 'VACUUM ' 它可以修复错误

标签: java android multithreading sqlite android-asynctask


【解决方案1】:

来自 VACUUM 文档:

VACUUM 命令通过将数据库内容复制到 一个临时数据库文件,然后用 临时文件的内容。覆盖原件时, 回滚日志或预写日志 WAL 文件的使用方式与以前一样 适用于任何其他数据库事务。 这意味着当 VACUUMing 一个数据库,其大小是原始数据库文件的两倍 需要可用磁盘空间。

可能是磁盘上没有足够的可用空间来执行 VACUUM 操作。
http://sqlite.org/lang_vacuum.html

【讨论】:

    【解决方案2】:

    该报告可能意味着在该特定用户的设备上写入数据库时​​出现问题(I/O 错误)。

    在 VACCUM 文档中,提到如果有其他 SQL 事务正在进行,VACCUM 将无法工作,因此这可能是最初的原因。

    除了我想用 try/catch 语句围绕该事务之外,这里没有什么可以做的。

    附带说明,VACCUM 不接受任何参数,至少在旧版本中是这样。较新的 sqlite3 版本在尝试运行 VACCUM 时抱怨语法错误。

    VACCUM 文档可以在这里找到:http://sqlite.org/lang_vacuum.html

    “如果有一个打开的事务,或者当它运行时有一个或多个活动的 SQL 语句,一个 VACUUM 将失败。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多