2014-04-14 25 views
3

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

通过应用版本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 
+1

尝试使用“真空”它可以修复错误 – Mert

回答

1

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

在VACCUM文档中,提到如果还有其他SQL事务正在进行,则VACCUM将不起作用,因此可能是原因。

这里没有太多的工作可以完成,除了用try/catch语句环绕这个事务我想。

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

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

“如果有一个打开的事务,或者有一个或多个活动的SQL语句在运行时一个真空将会失败”

1

与真空文档:

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

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