【发布时间】:2015-07-20 18:50:47
【问题描述】:
这个问题是这个问题的后续问题:
When should I close a cursor and db?
我正在学习如何在 Android 上使用 SQLite,我正在使用本教程作为示例:
http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/
当他们关闭数据库或游标时,我看不到任何一致性。例如有一个关闭数据库的方法:
public void addContact(Contact contact)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName()); // Contact Name
values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone Number
// Inserting Row
db.insert(TABLE_CONTACTS, null, values);
db.close(); // Closing database connection
}
但是在它之后有一个不会关闭它的方法:
public Contact getContact(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
cursor.getString(1), cursor.getString(2));
// return contact
return contact;
}
关闭光标也是如此。
为什么在添加联系人后关闭数据库是正确的,但在获得联系人后却不正确?调用getWritableDatabase() 或getReadableDatabase() 后总是关闭数据库是一个好习惯吗?另外,如果我想向数据库添加几个项目,保持与数据库的连接打开并一个接一个地插入许多项目是一种好习惯,还是应该以某种方式将它们全部插入到一个查询中?
我还读到你想用AsyncTask 或IntentService 调用getWritableDatabase() 或getReadableDatabase(),但本教程中的方法是连续使用它的。哪种做法更好?
【问题讨论】:
-
第一个 androidhive 是一个糟糕的教程源。关于关闭 SQLiteDatabase:通常,如果您不使用不同的进程,则根本不应该担心关闭 db ... 关于关闭游标:您应该在使用后关闭它(唯一的问题是当您使用 CursorAdapter 时,那么您应该使用旧的 manageQuery(已弃用但仍然)或更好:使用新的 Loaders Api - 这两种方法都将负责关闭游标)...
-
你能不能稍微扩展一下,把它写成答案而不是评论?
-
因为您也在询问 Cursor,所以它不是重复的,但这里是关于关闭数据库的类似问题:stackoverflow.com/questions/6608498/…
标签: android android-sqlite android-cursor