[英]Cursor in Android having issues with SqliteDatabase
這是我用來從SQLite數據庫插入或獲取數據的適配器類。 存在用於插入數據的方法和用於獲取數據的方法。
在getData方法中,我返回一個游標並在其他類中處理它,但從我的角度來看,我面臨的問題很難理解。
當我使用SqliteDatabase的查詢函數獲取數據時,它返回一個Cursor,換句話說,游標有一個數據庫內部某個表的子集。 數據庫對象的工作結束了所以我關閉它然后返回Cursor。 該函數沒有任何問題,但在另一側返回的光標是空的。
顯示日志:
java.lang.IllegalStateException:無法執行此操作,因為已關閉連接池。
如果我刪除該行:
db.close();
然后一切正常,但有些時間點,如果我調用getData()函數更多次,它會說數據庫中有泄漏。
public class DatabaseAdapter {
DatabaseHelper helper;
public DatabaseAdapter (Context context) {
helper = new DatabaseHelper(context);
}
public long insertData(String username, String domain, String crypt) {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(DatabaseHelper.USERNAME, username);
values.put(DatabaseHelper.DOMAIN, domain);
values.put(DatabaseHelper.CRYPT, crypt);
long id = db.insert(DatabaseHelper.TABLE_NAME, null, values);
db.close();
return id;
}
public Cursor getData() {
String[] columns = {DatabaseHelper.USERNAME, DatabaseHelper.DOMAIN, DatabaseHelper.CRYPT};
SQLiteDatabase db = helper.getReadableDatabase();
Cursor c = db.query(DatabaseHelper.TABLE_NAME, columns, null, null, null, null, null);
db.close(); // This line is the problem.
return c;
}
public boolean deleteRow(SavedInformation information) {
String[] array = {information.getUsername(), information.getDomainName(), information.getCryptPassword()};
SQLiteDatabase db = helper.getWritableDatabase();
db.delete(DatabaseHelper.TABLE_NAME, "" + DatabaseHelper.USERNAME + " = ? AND " + DatabaseHelper.DOMAIN + " = ? AND " + DatabaseHelper.CRYPT + " = ?", array);
return true;
}
static class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "Data_HASH";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "HASH";
/*DATABASE COLUMNS */
private static final String UID = "_id";
private static final String USERNAME = "username";
private static final String DOMAIN = "domain";
private static final String CRYPT = "crypt";
/*DATABASE CREATE QUERY */
private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + UID + " INTEGER PRIMARY KEY AUTOINCREMENT," + USERNAME + " VARCHAR," + DOMAIN + " VARCHAR," + CRYPT + " VARCHAR);";
public DatabaseHelper (Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(CREATE_TABLE);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
} catch (SQLException e) {
e.printStackTrace();
}
}
}}
如果我沒有弄錯的話,如果您只是從數據庫中獲取數據,則不應該在任何其他類中使用游標。 創建數據模型並從方法返回數據,而不是游標引用。
你應該避免多次調用open / close光標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.