查询Android数据库是否存在!


69

我已经为我的Android应用程序创建了一个数据库,该数据库包含静态数据,并且不需要更新/删除功能,因此在应用程序启动时,我想检查数据库是否存在,如果不存在,请执行dbAdapter类。我知道它是一个简单的if语句,但我只是想知道查询数据库是否存在的最有效方法。

干杯

Answers:


82
/**
 * Check if the database exist and can be read.
 * 
 * @return true if it exists and can be read, false if it doesn't
 */
private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {
        checkDB = SQLiteDatabase.openDatabase(DB_FULL_PATH, null,
                SQLiteDatabase.OPEN_READONLY);
        checkDB.close();
    } catch (SQLiteException e) {
        // database doesn't exist yet.
    }
    return checkDB != null;
}

其中DB_FULL_PATH是数据库文件的路径。

我之所以不只是检查文件是否存在,是因为它无法告诉(a)它是否是sqlite db文件,(b)该文件是否未损坏并且可以实际读取,即由于部分下载或然而已经被创造了。


4
我尝试使用它来查看是否必须从捆绑软件中复制“入门”数据库,或者只是继续加载那里的内容。所以我尝试用这个 但是对我来说,即使没有数据库存在,它始终都返回true。
Kit Ramos

3
-1用于使用try / catch执行正常的非异常操作
eddi 2014年

2
仅使用try / catch来查看某项是否为null太可怕了……为什么不这样做checkDB = SQLiteDatabase.openDatabase(DB_FULL_PATH, null, SQLiteDatabase.OPEN_READONLY); if (checkDB == null) {// database doesn't exist yet.}。我想这不是你的错,看来Java困扰着这种废话……
Kevin Kevin

1
期望语句导致异常是不好的做法。检查数据库文件是否存在是干净正确的方法。
eddiecubed

3
问题是检查数据库是否存在。如果可以打开和访问,则不行。根据描述,数据库来自资产文件夹。它将在启动时运行,并在第一次运行时检查数据库是否存在。正如您所说,此捕获可能是其他问题导致的,不仅是数据库不存在。但是,使用此选项将使应用程序看不到出了什么问题。这是不好的编程技术。
eddiecubed 2015年

173

我宁愿直接检查文件的存在:

private static boolean doesDatabaseExist(Context context, String dbName) {
    File dbFile = context.getDatabasePath(dbName);
    return dbFile.exists();
}

5
干净简短!爱它。谢谢。
托德·皮顿

我应该发送什么作为上下文?
madprops

1
任何上下文都应该执行,甚至是应用程序上下文也是如此
rds 2013年

为什么使用ContextWrapper而不是Context?
Zin Win Htet 2015年

对我来说,这始终是正确的。必须使用接受的答案。
乔什·莱尔德

4

当您初始化以下类时:

mOpenHelper = new DatabaseHelper(getContext());

如果数据库不存在,它将自动创建数据库。它还允许您通过将DB_VER更改为更大的数字来升级数据库。

然后,您便可以查询数据库的使用情况:

 SQLiteDatabase db = mOpenHelper.getWritableDatabase();

上面的方法为您提供了db.query()db.insert()等方法。

private static class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DB_NAME = "db_name.db";
    private static final int DB_VER = 1;

    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VER);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("CREATE TABLE table_name (" + "_id INTEGER PRIMARY KEY, "
                + " column_name_2 TEXT );");


                .execSQL("INSERT INTO table_name "
                        + "(column_name_2) "
                        + "VALUES " + "('hello world');");


    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        Log.w(TAG + "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
        try {
            db.execSQL("DROP TABLE IF EXISTS table_name");
            onCreate(db);

        } catch (SQLException e) {
            Log.e(TAG + "getting exception "
                    + e.getLocalizedMessage().toString());
        }
    }

}

2

很简单:在try块中使用da databse路径打开数据库,如下所示:

try{
   SQLiteDatabase   dbe = SQLiteDatabase.openDatabase("/data/data/bangla.rana.fahim/databases/dictionary", null,0);
            Log.d("opendb","EXIST");
            dbe.close();
            }

如果发生异常,则数据库不会退出,因此请创建它:

catch(SQLiteException e){
                Log.d("opendb","NOT EXIST");

            SQLiteDatabase db = openOrCreateDatabase("dictionary", MODE_PRIVATE, null);
                    db.execSQL("CREATE TABLE IF NOT EXISTS LIST(wlist varchar);");

                    db.execSQL("INSERT INTO LIST VALUES('খবর');");
                    db.execSQL("INSERT INTO LIST VALUES('কবর');"); //whatever you want
                 db.close();
}

就是这样,您完成了:)


1

我尝试了Mathias Conradt提供的版本,但发现仅检查DB!= null是否不足。我对此进行了修改:

         /**
         * Check if the database exist and can be read.
         *
         * @return true if it exists and can be read, false if it doesn't
         */
        private boolean checkDataBase(String InDBFile) {
            SQLiteDatabase checkDB = null;
            boolean res = false;
            try {
                checkDB = SQLiteDatabase.openDatabase(InDBFile, null,
                        SQLiteDatabase.OPEN_READONLY);
                res = (checkDB.getVersion() > 0);
                checkDB.close();
            } catch (SQLiteException e) {
                // database doesn't exist yet.
                Log.e("checkDataBase", "Selected file could not be opened as DB.");

                res = false;
            }
            return res;
        }

0

在您的主要活动中创建一个全局数据库帮助程序类对象。在MainActivity的onCreate()函数中尝试以下操作:

//global database helper variable

DatabaseHelper dbh;

//in the onCreate()

if(dbh.getReadableDatabase()!=null)
//view the list

else
//create db

1
这不能回答问题。它将与DatabaseHelper的代码一起使用。
rds

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.