【发布时间】:2015-11-23 07:16:26
【问题描述】:
我有一个插入语句,我的应用大约需要 25 秒才能插入约 1000 行。我正在尝试使用Transactions 来加快我的处理时间,但我无法实现它。
这是我在DatabaseHandler 中对inserting 的方法:
public boolean insertQuestions(String gid, String qid, String qname) {
SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();
try {
ContentValues contentValues = new ContentValues();
contentValues.put(KEY_GID, gid);
contentValues.put(KEY_QID, qid);
contentValues.put(KEY_QNAME, qname);
long result = db.insert(TABLE_QUESTIONS, null, contentValues);
db.setTransactionSuccessful();
if (result == -1) {
db.close();
return false;
} else {
db.close();
return true;
}
} finally {
db.endTransaction(); //Error is here
}
}
当我尝试运行上述方法时出现以下错误:
08-28 15:50:40.961 20539-20539/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.murrion.navigationdrawer, PID: 20539
java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /storage/emulated/0/testapp3.db
at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:522)
at com.murrion.navigationdrawer.utils.DatabaseHandler.insertQuestions(DatabaseHandler.java:197)
该语句正在我的 Activity 中的 Asynctask 方法中运行。
【问题讨论】:
-
我认为当 db 在几行之前关闭时,您正试图在 db 中执行订单。你不能调用 db.endTransaction();调用后 db.close();尝试将 if/else 放在 db.endTransaction() 之后并告诉我们。希望对你有帮助
-
抱歉,我的措辞不好。它在一个循环中,所以它被执行了大约 1000 次。非常低效..我知道
标签: android sqlite android-asynctask android-sqlite