在android sqlite中没有调用升级方法

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (42)

我在我的应用程序中使用预先填充的sqlite数据库,我正在尝试在我的Android应用程序中更新我的数据库,但是onUpgrade当我增加版本号时,该方法不会被调用。我尝试谷歌搜索,搜索stackoverflow但没有任何帮助。如果我用this.getReadableDatabase()在构造函数中取消注释该onUpgrade方法被调用,但我无法查询数据并返回错误。

这是我的代码。

     public class DatabaseHelper extends SQLiteOpenHelper {

        private  static final String DB_NAME = "dictionary.db";
        private static final int DB_VERSION = 1;
        private String DB_PATH = null;
        private  static final String TABLE_DICTIONARY = "dictionary";
        private  static final String TABLE_BOOKMARK= "bookmark";
        private static final String COL_ID = "id";
        private static final String COL_WORD = "word";
        private static final String COL_DEFINITION = "definition";
        private Context mcontext;
        private SQLiteDatabase mDatabase;


        public DatabaseHelper( Context context) {
            super(context, DB_NAME, null, DB_VERSION);
            this.mcontext = context;
            this.DB_PATH = "/data/data/" + context.getPackageName() + "/" + "databases/";
            //this.getReadableDatabase();
        }

        public void createDataBase() throws IOException {

            boolean dbExist = checkDataBase();
            if (!dbExist) {
                this.getReadableDatabase();
                try {
                    mcontext.deleteDatabase(DB_NAME);
                    copyDataBase();
                } catch (IOException e) {
                    throw new Error("Error copying database");
                }
            }
        }

        public boolean checkDataBase() {
            SQLiteDatabase checkDB = null;
            try {
                String myPath = DB_PATH + DB_NAME;
                checkDB = SQ

LiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
        } catch (SQLiteException e) {
            e.printStackTrace();
        }
        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }

    private void copyDataBase() throws IOException {

        InputStream myInput = mcontext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream myOutput = new FileOutputStream(outFileName);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

    public void openDatabase() throws SQLException {
        String myPath = DB_PATH + DB_NAME;
        mDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    }

    @Override
    public synchronized void close() {
        if (mDatabase != null)
            mDatabase.close();
        super.close();
    }

         @Override
    public void onCreate(SQLiteDatabase db) {

    }

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

        if (newVersion > oldVersion) {
            try {
                copyDataBase();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        Log.d(TAG, "onUpgrade:called ");
    }
}
提问于
用户回答回答于

我相信您的问题是您没有使用SQLiteOpenHelper的方法之一(getWritableDatabsegetReadableDatabase)来打开数据库。

而是使用SQLiteDatabaseOPEN方法。哪个不做版本检查和设置。

如果我在构造函数中取消注释this.getReadableDatabase(),则会调用onUpgrade方法但我无法查询数据并返回错误。

介绍getReadableDatabase,然后进行检查并尝试复制较新版本,但旧版本已打开,因此您可能会因此而发生冲突。

您可以找到问题的答案可以使用哪些方法来管理预先存在的数据库的不同版本?有帮助(也许是第二次)。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励