當我打電話SQLiteOpenHelper.setWriteAheadLoggingEnabled導致錯誤日誌行
setWriteAheadLoggingEnabled(true);
我SQLiteOpenHelper子類的構造
,在第一次使用的數據庫,創建後,我可以看到下面的錯誤日誌項:
02-07 18:16:05.131 10426-10426/com.test E/SQLiteLog﹕ (1) no such table: test
當應用程序被殺害,並開始隨後的時間,我得到:
E/SQLiteLog﹕ (283) recovered 10 frames from WAL file /data/data/com.test/databases/test-wal
但是,應用程序工作正常,實際上並沒有發生異常。
當我不啓用WAL時,日誌項不存在。
日誌錯誤是否值得擔心?
編輯:我DbHelper
代碼:
public class DbHelper extends SQLiteOpenHelper {
private static final int DB_VERSION = 1;
public DbHelper(Context context) {
super(context, Db.NAME, null, DB_VERSION);
// setWriteAheadLoggingEnabled(true);
}
@Override
public void onConfigure(SQLiteDatabase db) {
super.onConfigure(db);
db.setForeignKeyConstraintsEnabled(true);
db.enableWriteAheadLogging();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(Db.TestGroup._CREATE_TABLE);
db.execSQL(Db.Test._CREATE_TABLE);
db.execSQL(Db.Task._CREATE_TABLE);
db.execSQL(Db.TaskFullTextSearch._CREATE_TABLE);
db.execSQL(Db.TaskFullTextSearch.Triggers.AFTER_INSERT);
db.execSQL(Db.TaskFullTextSearch.Triggers.BEFORE_UPDATE);
db.execSQL(Db.TaskFullTextSearch.Triggers.AFTER_UPDATE);
db.execSQL(Db.TaskFullTextSearch.Triggers.BEFORE_DELETE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// nothing
}
public int getTestCount() {
Cursor cursor = getReadableDatabase().rawQuery(SELECT_TEST_COUNT, null);
cursor.moveToNext();
int count = cursor.getInt(0);
cursor.close();
return count;
}
}
DB類是「契約」類定義的表類和列一串SQL語句。
數據庫助手是一個自定義的應用程序子類中創建一個單:
public class TestApplication extends Application {
private static DbHelper DB_HELPER;
@Override
public void onCreate() {
super.onCreate();
DB_HELPER = new DbHelper(getApplicationContext());
}
public static DbHelper getDbHelper() {
return DB_HELPER;
}
}
編輯2:我剛剛檢查的時候真的是沒有test
表會發生什麼 - 應用程序崩潰與:
E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.test, PID: 30663
android.database.sqlite.SQLiteException: no such table: test (code 1): , while compiling: select count(*) from test
更改預寫日誌記錄配置應該在'SQLiteOpenHelper'的'onConfigure()'回調方法與所有其他配置更改一起完成。 'SQLiteDatebase'甚至沒有在構造函數中初始化,所以在那裏做不起作用。我不明白爲什麼它應該輸出該日誌。你確定它記錄在_that_點?你有一張名爲「test」的表嗎? – corsair992 2015-02-07 22:09:51
我說的方法是一個SQLiteOpenHelper方法,它有一堆檢查,如果已經打開了一個數據庫,它會應用一個新的設置。最後,它設置其內部字段:mEnableWriteAheadLogging = enabled;這在下次打開數據庫時使用。我想你已經把它與另一種方法混合了:SQLiteDatabase.enable/disableWriteAheadLogging,它需要調用一個數據庫實例。當這個方法被調用的時候,這個文檔沒有任何說明,而且在構造函數中調用時它確實可以工作(禁止日誌錯誤)。 – wujek 2015-02-07 23:05:30
錯誤沒有記錄在啓用WAL的時候,當第一條語句被執行時完成,在我的情況下是'select count(*)from test'。是的,我有一個'測試'表。奇怪的是,儘管錯誤被記錄(只有這一行,沒有堆棧跟蹤沒有),但整個應用程序工作正常。 – wujek 2015-02-07 23:08:06