在SQLite中,每次进行数据库操作时,我应该打开和关闭数据库吗?

4

你好,我正在开发Android应用程序。它目前有9个表格,我已经创建了一个实例来打开数据库,并在整个项目中使用相同的实例。我不知道这是否会导致我的UI冻结。我应该在每次进行数据库操作时打开和关闭数据库吗?还是我现在的做法是正确的?

\**   to fetch records**\
public synchronized SQLiteDatabase readDatabase() {
    if(mOpenCounter == 1) {//to open the database only one time
        // Reading
      mDatabase = mDatabaseHelper.getReadableDatabase();

    }
    return mDatabase;
}


\**   to open db **\
public synchronized SQLiteDatabase openDatabase()throws SQLException {

    mOpenCounter+=1;
    if(mOpenCounter == 1) {//to open the database only one tim

        mDatabase = mDatabaseHelper.getWritableDatabase();

    }

    return mDatabase;
}
更新:我已经花了两天时间在这个问题上。在Google上查看了几个链接后,我发现我们需要在单独的线程上进行数据库操作。有人能给我一个如何做到这一点的例子吗?不是像一个查询那样,我有9个表,每个表大约有8个查询。每个查询都应该在单独的线程中运行吗?
我的代码结构是这样的,我为每个表查询创建了一个单独的类,例如对于表A,所有关于这个表的查询都在TableAqueries这里。请给我一个在单独的线程中运行数据库操作的解决方案。请帮助我。
2个回答

3

每次进行数据库操作时,我是否需要打开和关闭数据库?

不需要。

我不知道这是否导致了我的UI冻结。

如果您在主应用程序线程上进行数据库I/O,那么在完成该I/O时,将导致UI冻结。请在后台线程上执行磁盘、数据库和网络I/O。


@SahdevRajput74:CursorLoaderContentProvider 配合使用,而不是直接与 SQLite 数据库配合使用。CursorLoader 没有 doInBackground() 方法。一些数据库访问层(例如 Room)提供后台查询。除此之外,您可以使用 RxJava、普通的 ThreadAsyncTask 和无数其他线程选项。 - CommonsWare

3

频繁打开和关闭数据库更容易引入性能问题,因为关闭数据库需要一个昂贵的调用getWriteableDatabasegetReadableDatabase来重新打开数据库。

由于在数据库关闭时调用getWritableDatabase()getReadableDatabase()是比较昂贵的,所以应该尽可能地保持数据库连接打开的时间长一些,以便访问它。通常,最好在调用Activity的onDestroy()方法中关闭数据库连接。

此外,缓存数据将会丢失,因此可能会对缓存需要重新构建产生影响。

持久化数据库连接

因此关闭数据库不太可能修复冻结问题,反而可能有可能导致冻结的发生。

我建议检查所有的循环结构,如果没有明显的问题,那么建议逐步注释/禁用代码,直到App在不冻结的情况下运行,这样可以找到导致冻结的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接