当我将值插入 Android 上的 SQLite 表时,我收到 NullPointerException,但我不明白为什么。我正在测试 ContentValues 和数据库实例是否为空。
这是插入代码:
public void insertOrIgnore(ContentValues values) {
SQLiteDatabase db = this.dbHelper.getWritableDatabase();
try {
//I added these null value checks to stop NPE, but doesn't help.
if (values != null && db != null) {
db.insertWithOnConflict(TABLE, null, values, SQLiteDatabase.CONFLICT_IGNORE);
}
} catch (SQLiteException e) {
} finally {
if (db != null) {
db.close();
}
}
}
在哪里
public static final String TABLE = "albums";
大多数情况下,此代码可以按预期处理添加到数据库中的数据。但是,它有时而且很少会产生以下错误。堆栈跟踪来自 ACRA,我无法隔离在什么情况下会发生此错误。我正在寻找关于为什么会发生这种情况以及条件是什么的指针。我对 SQLite 的了解是初级水平。
java.lang.NullPointerException
at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:290)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:96)
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:2025)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1965)
at android.database.sqlite.SQLiteDatabase.beginTransaction(SQLiteDatabase.java:690)
at android.database.sqlite.SQLiteDatabase.beginTransactionNonExclusive(SQLiteDatabase.java:605)
at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:247)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:112)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1844)
at com.mydomain.myapp.albums.AlbumsData.insertOrIgnore(AlbumsData.java:89)
第 89 行是上面显示的 db.insertWithOnConflict(...) 调用。
我不一定要寻找完整代码的答案,而是寻找问题所在的指针和解释,以便我自己开始修复它。
编辑:堆栈跟踪显示 NPE 源自SQLiteStatement (v 4.03) 的第 290 行:
setNativeHandle(mDatabase.mNativeHandle);
所以看起来数据库实例为空。当我在交易开始时测试 null 时,它如何在交易期间变为 null?