[英]Database onUpgrade method is never called
I'm trying to upgrade my database from version 1 to version 2. I'm assigning DATABASE_VERSION = 2
(first version was assigned too) but onUpgrade
never called. 我正在尝试将我的数据库从版本1升级到版本2.我正在分配
DATABASE_VERSION = 2
(第一个版本也已分配)但是onUpgrade
从未调用过。 May be there is an obvious mistake in the code, but I can't see it beacause I'm trying to solve this problem for a long time. 可能是代码中有一个明显的错误,但我看不到它,因为我试图解决这个问题很长一段时间。
Here is the code of database helper class: 这是数据库助手类的代码:
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 --- ");
}
In Activity I call database like this: 在Activity中我像这样调用数据库:
DatabaseHelper dbOpenHelper = new DatabaseHelper(this);
SQLiteDatabase database = dbOpenHelper.openDataBase();
Where is my mistake? 我的错误在哪里? Help, please.
请帮助。
UPD: database.getVersion()
returns 0 UPD:
database.getVersion()
返回0
Updated openDataBase()
method (it's working): 更新了
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;
}
Local database version will always be 0 and onUpgrade
will not be called, because you never called getWritableDatabase/getReadableDatabase
, which will bump version and return local db. 本地数据库版本将始终为0并且不会调用
onUpgrade
,因为您从未调用过getWritableDatabase/getReadableDatabase
,这会使版本getWritableDatabase/getReadableDatabase
并返回本地数据库。
So you need: 所以你需要:
getReadableDatabase();
getReadableDatabase();
in your contructor/oncreate, just to trigger process, in case db version is changed db.getVersion();
db.getVersion();
compare to current version - DATABASE_VERSION
. DATABASE_VERSION
。 And do what ever you need to do - upgrade or downgrade.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.