繁体   English   中英

Android中的光标与SqliteDatabase有问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM