2011-11-04 113 views
8

在Android中,我使用以下方法来查看sqlite数据库是否存在,以及是否可以打开并使用它。在Android中,检查sqlite数据库是否存在失败

如果测试失败,我从资产中复制数据库文件(这应该只发生一次,当用户第一次启动应用程序时)。

/* 
* Check if the database already exist to avoid re-copying the file each time you open the application. 
* @return true if it exists, false if it doesn't 
*/ 
private boolean checkDataBase() { 
    SQLiteDatabase checkDB = null; 

    try { 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    } catch(SQLiteException e) { 
     //database does't exist yet. 
    } 

    if(checkDB != null){ 
     checkDB.close(); 
    } 
    return checkDB != null ? true : false; 
} 

的问题是,我收到来自用户的报告说他们的数据已经被消灭和调查时,我可以看到数据库被替换为资产的数据库。因此,即使用户已有数据库文件,但由于某些原因,SQLiteDatabase.openDatabase()有时会引发错误。我自己无法重现此问题,但似乎发生在某些用户身上。

任何人都有一个想法可能是什么问题在这里?有没有更好的方法来做这个测试?

+0

请与本http://stackoverflow.com/questions/20728808/android-reading-stored-sqlite-database – gandharv09

回答

32

如何检查文件系统以查看数据库是否存在,而不是先尝试打开它?

你可能试图打开一个已经打开的数据库,这会导致你认为它不存在的错误。

File database=getApplicationContext().getDatabasePath("databasename.db"); 

if (!database.exists()) { 
    // Database does not exist so copy it from assets here 
    Log.i("Database", "Not Found"); 
} else { 
    Log.i("Database", "Found"); 
} 
+0

这不会对我的工作帮助!见http://stackoverflow.com/questions/18391820/checking-if-database-exists –

+3

我只是想联系OP,以便他可以帮助我。我确实发布了我自己的问题,上面给出了链接。我不是在“污染”任何东西,而只是寻求本网站的目的。 –

2

我想分享一个方法来检查数据库是否存在: 给我一个+1,如果它运行正常了你, 感谢。

private boolean checkDataBase() { 

    SQLiteDatabase checkDB = null; 

    try { 

     File database=myContext.getDatabasePath(DB_NAME); 

     if (database.exists()) { 

      Log.i("Database", "Found"); 

      String myPath = database.getAbsolutePath(); 

      Log.i("Database Path", myPath); 

      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

     } else {     

      // Database does not exist so copy it from assets here 
      Log.i("Database", "Not Found"); 

     } 

    } catch(SQLiteException e) { 

     Log.i("Database", "Not Found"); 

    } finally { 

     if(checkDB != null) { 

      checkDB.close(); 

     } 

    } 

    return checkDB != null ? true : false; 
} 
+0

不是一个好的方法,因为它遭遇OP遇到的相同问题。如果数据库存在但无法打开,则报告它不存在。如果您需要同时执行这两项操作,那么检查数据库是否存在以及是否可以打开应该是独立的操作。此外,这依赖于抛出异常来确定数据库状态,这不是一种好的做法。 – Kuffs

相关问题