gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:49:55 27 4
gpt4 key购买 nike

我正在尝试将我的数据库从版本 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();

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

更新: 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,这会增加版本并返回本地数据库。

所以你需要:

  1. 在您的构造函数/oncreate 中调用getReadableDatabase();,只是为了触发进程,以防数据库版本发生变化
  2. 手动检查 sdcard 版本,db.getVersion(); 与当前版本 - DATABASE_VERSION 进行比较。做任何您需要做的事 - 升级或降级。

关于java - 永远不会调用数据库 onUpgrade 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14332462/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com