安卓SQLite - 更改journal_mode

4
我正在尝试通过代码更改数据库的journal_mode。我尝试了SQLiteDatabase.execSQL("PRAGMA journal_mode=OFF"),但失败了,因为表达式"PRAGMA journal_mode=OFF"返回了一个结果(我从终端验证了这一点),所以Android认为这是一个查询,并抱怨我应该使用execQuery而不是execSQL。但我要执行的不是一个查询。
我还尝试将pragma表达式编译为SQLiteStatement并调用execute方法,但结果相同。
有人可以建议任何替代方案来通过代码解决这个问题吗?
谢谢, Ranjit
2个回答

3
也许你正在遇到这个问题,就像execSQL文档所提到的:
当启用enableWriteAheadLogging()时,journal_mode由该类自动管理。因此,如果您的应用程序正在使用enableWriteAheadLogging(),请勿使用“PRAGMA journal_mode”语句设置journal_mode。
检查一下是否在使用写前日志,然后它可能会起作用。
更新:正如Ranjit在评论中所说,这应该可以工作:
Cursor c1 = db.rawQuery("PRAGMA journal_mode=OFF", null); 
c1.close();

我在我的代码中没有设置这个选项。根据Android文档,enableWriteAheadLogging只在API级别l1或Android 3.0引入(http://developer.android.com/guide/appendix/api-levels.html),而我仍在编译适用于Android 2.1,API级别7的代码。 - Ranjit
7
这样做有效。执行以下代码:Cursor c1 = db.rawQuery("PRAGMA journal_mode=OFF", null); c1.close();注:该代码段是针对数据库操作的,意思是关闭数据库的日志记录功能。 - Ranjit
以防有人需要(Ranjit似乎不太使用SO)...在我的代码中,我尝试执行db.rawQuery("PRAGMA journal_mode=OFF", null); c1.close();,然后如果我查询了pragma(省略=MODE),它会回到持久状态。但是如果我执行c1.moveToNext(); c1.getString(0);,它确实可以工作 :) - helios

0

可以用下一个命令完成:

db.execSQL("PRAGMA journal_mode=OFF;");

不需要创建一个Cursor,因为在Robert's answer的评论中建议了这样做。


根据 https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase?hl=en ,没有 rawExecSql() 方法。 - user149408
@user149408,你是正确的。更改为execSQL -> https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase?hl=en#execSQL(java.lang.String) - Oleksandr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接