0

我正在尝试实现 android SQLite 使用设计模式,以确保每个应用程序打开一个 SQLiteDatabase 实例。

public class BaseDataSource {

    private static final CustomSQLiteHelper dbHelper = CustomSQLiteHelper.getInstance();

    protected static SQLiteDatabase database;

    static {
        //HERE RISES EXCEPTION
        BaseDataSource.database = BaseDataSource.dbHelper.getWritableDatabase();
    }



    private void close() {      
        if(null != BaseDataSource.database && BaseDataSource.database.isOpen()) {
            BaseDataSource.database.close();

            if(null != BaseDataSource.dbHelper) {
                BaseDataSource.dbHelper.close();                
            }
        }
    }

    protected BaseDataSource() {}


    protected void finalize () throws Throwable {
        close();
        super.finalize();       
    }
} 

但是当我的应用程序启动时,我得到了这种异常:

Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.xxx/databases/xxx.db

在创建类之前如何打开和关闭 SQLiteDatabse 数据库?

更新

我发现了自己的错误。它在 CustomSQLiteHelper 类中。在onCreate我关闭数据库的方法中。我尝试了在互联网上找到的所有解决方案,因此我犯了一个错误。

4

3 回答 3

1

如果您要发生任何事情,则首先需要以写入数据库的形式打开。所以为此使用这个方法并像这样调用

openAsWrite();

    public void openAsWrite() throws SQLException {
            db = DBHelper.getWritableDatabase();
        }

        // ---closes the database---
        public void close() throws SQLException {
            DBHelper.close();
        }
于 2013-06-13T09:02:41.543 回答
0

将数据库对象用作静态对象会使您的类表现得像这样。

  • 加载类时创建数据库实例。
  • 调用 finalize 方法时关闭数据库连接。
  • 您的班级将不再获取数据库连接,并且它将拥有已经关闭的数据库实例。
  • 最终,当尝试访问已关闭的实例时,它会向您弹出错误

我认为你应该使用不同的方法会更好。

于 2013-06-13T09:00:29.360 回答
0

获取数据库对象时使用以下模式:

try {
    if (sDatabase != null) {
        if (!sDatabase.isOpen()) {
            sDatabase = sContext.openOrCreateDatabase(DATABASE_NAME, 0, null);
        }
    } else {
        // open database here
        sDatabase = sContext.openOrCreateDatabase(DATABASE_NAME, 0, null);
    }
    Log.d(TAG, "Database successfully opened.");
} catch (SQLException e) {
    Log.e(TAG, "" + e);
}
于 2013-06-13T08:49:27.457 回答