use*_*181 6 sqlite android nullpointerexception
我在我的项目中发现Android上SQLiteDatabase实现中的close()函数在运行打开数据库,插入数据然后关闭数据库的多个线程时抛出NullPointerException.除非我允许每个线程在插入数据库后关闭(),否则一切都会顺利运行.
以下是其中一个写入线程可能看起来像的示例
ContentValues values = new ContentValues();
values.put(CallDetailsStorageConstants.COLUMN_NAME_REMOTE_NAME_IDX, (String) "");
values.put(CallDetailsStorageConstants.COLUMN_NAME_REMOTE_MEETINGID_IDX, (String) "");
CalculonDatabase callDetailsOpenHelper = CalculonDatabase.getInstance(mContext);
SQLiteDatabase dbw = callDetailsOpenHelper.getWritableDatabase();
long rowid = 0;
try {
rowid = dbw.insertWithOnConflict(CallDetailsTable.CALL_DETAILS_TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_REPLACE);
} catch (SQLiteConstraintException e) {
e.printStackTrace();
} finally {
dbw.close();
}
Run Code Online (Sandbox Code Playgroud)
你可以看到最后调用close().运行多个线程时,我得到此异常.
11-03 03:39:26.128: E/AndroidRuntime(977): FATAL EXCEPTION: Thread-17
11-03 03:39:26.128: E/AndroidRuntime(977): java.lang.NullPointerException
11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:283)
11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:96)
11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1933)
11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1864)
11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.beginTransaction(SQLiteDatabase.java:636)
11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.beginTransactionNonExclusive(SQLiteDatabase.java:551)
11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:240)
11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:111)
11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1737)
11-03 03:39:26.128: E/AndroidRuntime(977): at com.smash.DBWritingThread.run(DBWritingThread.java:50)
Run Code Online (Sandbox Code Playgroud)
那么我的问题是为什么只有在使用close()函数时才会发生这个错误?此外,是否可以在更晚的时间使用close()或者可能永远不会?
任何有关此问题的提示都非常感谢.
Kev*_*gan 14
我有你的答案!
永远不要关闭数据库.就这么简单.
确保每个应用程序只有一个,重复,*一个 Helper实例.与所有线程共享.
http://www.touchlab.co/blog/single-sqlite-connection/
这里有关于sqlite和锁定内部的更多信息:
http://www.touchlab.co/blog/android-sqlite-locking/
| 归档时间: |
|
| 查看次数: |
8189 次 |
| 最近记录: |