Android SQLite DB必须关闭哪些对象

时间:2019-05-15 12:14:30

标签: android database sqlite android-sqlite

我在Android应用中使用 SQLite数据库。我无法100%确定在完成与数据库的读/写操作后必须关闭哪些数据库对象:

例如此代码:

public int getLocalSavedPartsAmount() {
    int partsAmount;
    PartsAppDbHelper dbHelper = new PartsAppDbHelper(context);
    SQLiteDatabase db = dbHelper.getReadableDatabase();

    String[] columns = {...};
    Cursor cursor = db.(...);
    partsAmount = cursor.getCount();

    //which one do I have to close here?
    cursor.close(); //1
    dbHelper.close(); //2
    db.close(); //3

    return partsAmount ;
}

我需要关闭1、2和3吗?关闭顺序重要吗?

2 个答案:

答案 0 :(得分:3)

完成游标后,应始终关闭它,游标还需要打开数据库。

您根本不需要关闭数据库。

dbHelper.close关闭数据库。

当您调用 getWritableDatabase getReabableDatabase (无论如何通常都会获得可写数据库)时,它将打开数据库并对其进行缓存,因此通常使用相同的打开方式,直到您关闭它。

打开数据库可能会非常繁琐,因此您应尽量减少关闭,这样就不必再次打开它。

游标,每个都有一个基础文件槽。文件插槽有限,请全部使用它们,应用程序将崩溃。

所以

public int getLocalSavedPartsAmount() {
    int partsAmount;
    PartsAppDbHelper dbHelper = new PartsAppDbHelper(context);
    SQLiteDatabase db = dbHelper.getReadableDatabase();

    String[] columns = {...};
    Cursor cursor = db.(...);
    partsAmount = cursor.getCount();

    //which one do I have to close here?
    cursor.close(); //1
    return partsAmount ;
}

就足够了。

答案 1 :(得分:0)

您需要关闭游标和数据库连接,它们非常重要。因为这些都会导致应用程序出现内存问题。

操作完成后,应先关闭光标

if(cursor != null)
    {
        cursor.close();
    }

您应该关闭数据库连接,

if(db.isOpen())
    {
        db.close();
    }

希望它会对您有所帮助。