【问题标题】:Android SQLite DB which objects has to be closedAndroid SQLite DB 哪些对象必须关闭
【发布时间】:2019-05-15 12:14:29
【问题描述】:

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

例如这段代码:

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 吗?关闭的顺序重要吗?

【问题讨论】:

    标签: android database sqlite android-sqlite


    【解决方案1】:

    您应该始终在完成后关闭游标,游标还要求数据库处于打开状态。

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

    dbHelper.close 关闭数据库。

    当你调用 getWritableDatabasegetReabableDatabase (这通常会得到一个可写的数据库)时,它会打开数据库并缓存它,所以通常使用相同的打开直到你关闭它。

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

    Cusrors,每个都有一个底层文件槽。文件槽位有限,全部用完会崩溃。

    所以

    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 ;
    }
    

    足够了。

    【讨论】:

      【解决方案2】:

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

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

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

      你应该关闭数据库连接,

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

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-29
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-23
        • 2011-09-26
        相关资源
        最近更新 更多