永远不会调用数据库onUpgrade方法

我正在尝试将我的数据库从版本1升级到版本2.我正在分配DATABASE_VERSION = 2 (第一个版本也已分配)但是onUpgrade从未调用过。 可能是代码中有一个明显的错误,但我看不到它,因为我试图解决这个问题很长一段时间。

这是数据库助手类的代码:

 public class DatabaseHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 2; public static String DB_PATH; public static String DB_NAME = "db.sqlite3"; public SQLiteDatabase database; public final Context context; public DatabaseHelper(Context context) { super(context, DB_NAME, null, DATABASE_VERSION); this.context = context; File direct = new File(Environment.getExternalStorageDirectory() + "/.test"); if (!direct.exists()) { if (direct.mkdir()) ; } DB_PATH = Environment.getExternalStorageDirectory().getPath() + "/.test/"; } public void createDataBase() { boolean dbExist = checkDataBase(); if (!dbExist) { try { copyDataBase(); } catch (IOException e) { Log.e(this.getClass().toString(), "Copying error"); throw new Error("Error copying database!"); } } } private boolean checkDataBase() { SQLiteDatabase checkDb = null; try { String path = DB_PATH + DB_NAME; checkDb = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY); } catch (SQLException e) { Log.e(this.getClass().toString(), "Error while checking db"); } if (checkDb != null) { checkDb.close(); } return checkDb != null; } private void copyDataBase() throws IOException { InputStream externalDbStream = context.getAssets().open( "databases/" + DB_NAME); String outFileName = DB_PATH + DB_NAME; OutputStream localDbStream = new FileOutputStream(outFileName); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = externalDbStream.read(buffer)) > 0) { localDbStream.write(buffer, 0, bytesRead); } localDbStream.close(); externalDbStream.close(); } public SQLiteDatabase openDataBase() throws SQLException { String path = DB_PATH + DB_NAME; if (database == null) { createDataBase(); database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY); } return database; } // some unimportant methods @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w("myLogs", " --- onUpgrade database --- "); } 

在Activity中我像这样调用数据库:

 DatabaseHelper dbOpenHelper = new DatabaseHelper(this); SQLiteDatabase database = dbOpenHelper.openDataBase(); 

我的错误在哪里? 请帮忙。

UPD: database.getVersion()返回0


更新了openDataBase()方法(它正在工作):

 public SQLiteDatabase openDataBase() throws SQLException { String path = DB_PATH + DB_NAME; if (database == null) { createDataBase(); database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE); this.getWritableDatabase(); } return database; } 

本地数据库版本将始终为0并且不会调用onUpgrade ,因为您从未调用过getWritableDatabase/getReadableDatabase ,这会使版本getWritableDatabase/getReadableDatabase并返回本地数据库。

所以你需要:

  1. make call getReadableDatabase(); 在你的contructor / oncreate中,只是为了触发进程,以防db版本被更改
    要么
  2. 手动检查sdcard版本, db.getVersion(); 与当前版本相比 – DATABASE_VERSION 。 并做你需要做的事 – 升级或降级。

您的代码中没有onCreate方法。 这意味着,您的数据库从未创建过。

此外,仅在调用以下任何方法之后调用onCreateonUpgrade方法: database.getReadableDatabase()database.getWritableDatabase() ,该调用执行创建数据库。

UPD:试试这个:

 DatabaseHelper dbOpenHelper = new DatabaseHelper(this); 

SQLiteDatabase database = dbOpenHelper.openDataBase();

 SQLiteDatabase database = dbOpenHelper.getWritableDatabase(); Log.w(database.getVersion());