gpt4 book ai didi

android - SQLiteDatabase close() 函数在多个线程时导致 NullPointerException

转载 作者:IT王子 更新时间:2023-10-29 06:27:09 27 4
gpt4 key购买 nike

我在我的项目中发现,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();
}

您可以看到最后调用了 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)

那么我的问题是为什么只有在使用 close() 函数时才会发生此错误?此外,是否可以在更晚的时间使用 close() 或可能永远不使用?

非常感谢有关此问题的任何提示。

最佳答案

我有你的答案!

永远不要关闭数据库。就这么简单。

确保每个应用程序只有一个,重复,*一个 Helper 实例。与所有主题分享。

http://www.touchlab.co/blog/single-sqlite-connection/

这里有一些关于 sqlite 和锁定的更多信息:

http://www.touchlab.co/blog/android-sqlite-locking/

关于android - SQLiteDatabase close() 函数在多个线程时导致 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7999075/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com