这是导入预制数据库并打开和关闭的正确方法吗?

时间:2015-09-21 13:57:19

标签: android android-sqlite

好的,所以我在这里使用http://mobisys.in/blog/2012/01/tutorial-using-database-in-android-applications/本教程创建了一个预制数据库。我一直在收到有关“数据库未关闭异常”的错误。以及一些错误发送到我的openDatabase。我的数据库类有什么问题吗?

     public void openDataBase() throws SQLException{

            //Open the database
            String myPath = DB_PATH + DB_NAME;
            myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
        }

     //*Kalikot Delete pag may problema*//
        public DbHerbs openWritable()throws SQLException{
        //  ourHelper = new DbHelper(ourContext);
            myDatabase = this.getWritableDatabase();
            return this;
        }

        public DbHerbs openReadOnly()throws SQLException{
            myDatabase = this.getReadableDatabase();
            return this;
        }



     public void close() {
         if (myDatabase != null) {
          myDatabase.close();


         }
        // super.close();
        }

以下是我如何在不同的片段上打开课程,

    private void openDb() {

    myDb = new DbHerbs(this.getActivity());
    try {

       myDb.createDataBase();

       } catch (IOException ioe) {

        throw new Error("Unable to create database");
       }

        try {

           myDb.openReadOnly();

        }catch(SQLException sqle){

         throw sqle;

         }

     private void closeDb()
      {
        myDb = new DbHerbs(this.getActivity());
        myDb.close();
       }

这就是我对日志猫的错误。 http://www.directupload.net/file/d/4117/usgahftz_jpg.htm

1 个答案:

答案 0 :(得分:1)

您不是在这里关闭数据库:

private void closeDb()
{
    myDb = new DbHerbs(this.getActivity());
    myDb.close();
}

您正在用新的数据库替换现有的数据库实例并关闭新数据库。旧的将在打开状态下进行垃圾收集。所以实际上closeDb()并没有做任何事情。

为什么每次需要读取权限时都尝试创建数据库实例?

private void openDb() {

   myDb = new DbHerbs(this.getActivity());
   try {

      myDb.createDataBase();

   } catch (IOException ioe) {

      throw new Error("Unable to create database");
   }

   try {

       myDb.openReadOnly();

   }catch(SQLException sqle){

       throw sqle;

   }

如果您要做的是复制放置在assets文件夹中的预制数据库,建议的方法是https://github.com/jgilfelt/android-sqlite-asset-helper

当你需要读取或写入数据库时​​,你应该在SQLiteOpenHelper上调用getReadableDatabase()和getWritableDatabase()。你会在android样本中找到完整的工作代码。