2013-06-13 57 views
0

我想实现android SQLite使用设计模式,以确保每个应用程序打开SQLiteDatabase实例。无法获得SQLite可写数据库

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方法中,我关闭了数据库。我尝试了所有在互联网上找到的解决方案,并且因为我犯了一个错误。下面让一个数据库对象时模式

+0

极其相似exeption这里http://stackoverflow.com/questions/6535908/android-sqlite-sqliteopenhelper-error-illegalstateexception-db-already-clo 那里也有一个很棒的答案。 –

回答

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); 
} 
+0

这将确保数据库对象是否为null或数据库已关闭,然后只请求获取数据库对象 – Shrikant

+0

openOrCreateDatabase函数如何影响SQLiteHelper原因由于支持数据库创建和升级,我实现了CustomSQLiteHelper? –

0

使用数据库对象为静态,使你的类这样的表现。

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

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

+0

但是,静态块中的异常上升意味着类加载(100%是首次尝试创建数据库对象)。非常逻辑的答案,我同意实现很糟糕。我会尝试重新思考。 :) –

1

如果你要事件的任何事情,然后首先需要打开为写入数据库。因此,对于使用此方法 并呼吁这样

openAsWrite(); 

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

     // ---closes the database--- 
     public void close() throws SQLException { 
      DBHelper.close(); 
     }