【问题标题】:Query if Android database exists!查询Android数据库是否存在!
【发布时间】:2010-08-02 09:57:41
【问题描述】:

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

干杯

【问题讨论】:

    标签: android database


    【解决方案1】:

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

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

    【讨论】:

    • 干净简洁!爱它。谢谢。
    • 我应该发送什么作为上下文?
    • 任何上下文都应该做,甚至是应用程序上下文
    • 为什么使用 ContextWrapper 而不是 Context?
    • 这对我来说总是正确的。必须使用公认的答案。
    【解决方案2】:
    /**
     * 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) 文件没有损坏并且实际上可以读取,即由于部分下载或者它已经被创建了。

    【讨论】:

    • 我尝试使用它来查看我是否必须从捆绑包中复制“starter”数据库,或者继续加载那里的内容。所以我尝试使用它。但对我来说,即使没有数据库存在,这也总是返回 true。
    • -1 用于使用 try/catch 执行正常的非异常操作
    • 使用 try/catch 来查看是否为空是很可怕的......为什么不checkDB = SQLiteDatabase.openDatabase(DB_FULL_PATH, null, SQLiteDatabase.OPEN_READONLY); if (checkDB == null) {// database doesn't exist yet.}。我想这不是你的错,看来java被这种废话所困扰......
    • 仅检查数据库文件是否存在并不能涵盖所有内容。所以你想让用户遇到异常,比如SQLiteException?无论如何,您迟早都需要捕获它,除非您想在您的应用程序中引发 ANR。上述方法检查数据库是否可用并准备好工作,而不仅仅是检查它的存在。除了处理异常之外,您如何处理数据库存在但由于任何原因无法读取/解析的情况?
    • 问题是检查数据库是否存在。如果它可以打开和访问,则不是。根据描述,数据库来自资产文件夹。这将在启动时运行,并在第一次运行时检查数据库是否存在。正如你所说,这个问题可能是其他问题的结果,不仅是数据库不存在。然而,使用它会使应用程序对出错的地方视而不见。这是一种糟糕的编程技术。
    【解决方案3】:

    当你初始化下面的类时:

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

    【讨论】:

      【解决方案4】:

      这很简单: 使用 da 数据库的路径在 try 块中打开您的数据库,例如:

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

      你就完成了:)

      【讨论】:

        【解决方案5】:

        我尝试了 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;
                }
        

        【讨论】:

          【解决方案6】:

          在您的主要活动中创建一个全局数据库助手类对象。在 MainActivity 的 onCreate() 函数中试试这个:

          //global database helper variable
          
          DatabaseHelper dbh;
          
          //in the onCreate()
          
          if(dbh.getReadableDatabase()!=null)
          //view the list
          
          else
          //create db
          

          【讨论】:

          • 这不能回答问题。它会使用 DatabaseHelper 的代码。
          【解决方案7】:

          我找到了一个更简单的解决方案:

          context.databaseList().contains("table_name")

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-30
            • 1970-01-01
            • 2010-09-18
            • 1970-01-01
            • 1970-01-01
            • 2022-11-23
            • 2020-05-01
            • 2018-08-26
            相关资源
            最近更新 更多