繁体   English   中英

在Android中,检查sqlite数据库是否存在时不时失败

[英]In Android, check if sqlite database exists fails from time to time

在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()也会引发错误。 我自己无法重现这个问题,但似乎有些用户会发生这种情况。

任何人都知道问题可能在这里? 有没有更好的方法来进行此测试?

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

您可能正在尝试打开已打开的数据库,这将导致错误,导致您认为它不存在。

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");
}

我想分享一种方法来检查数据库是否存在:如果它运行正常,给我一个+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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM