SQLite VACUUM命令

时间:2014-04-14 06:36:27

标签: java android multithreading sqlite android-asynctask

通常情况下,我正在使用我的应用程序,下载超过30000没有问题。但我看到这个错误开始出现在 android开发者控制台(Crash& ANRS)

  

按应用版本   3.1.1 1 100.0%

     

Android版Android 2.3.3 - 2.3.7 1 100.0%

     

通过设备刀片(刀片)

这是我的代码:

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

2 个答案:

答案 0 :(得分:1)

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

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

这里可以做的不多,除了围绕使用try / catch语句的事务我想。

另一方面,VACCUM没有采取任何论据,至少在旧版本中是这样。较新的sqlite3版本在尝试运行VACCUM时抱怨语法错误。

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

"如果存在打开的事务,或者在运行时有一个或多个活动的SQL语句,VACUUM将失败。"

答案 1 :(得分:1)

来自VACUUM文档:

  

VACUUM命令的工作原理是将数据库的内容复制到   一个临时数据库文件,然后用。覆盖原始文件   临时文件的内容。当覆盖原件时,a   回滚日志或预写日志WAL文件就像使用一样   用于任何其他数据库事务。 这意味着当VACUUMing时   一个数据库,大小是原始数据库文件的两倍   在可用磁盘空间中需要。   

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