我正在尝试将我的数据库从版本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 :(得分:3)
本地数据库版本将始终为0,并且不会调用onUpgrade
,因为您从未调用getWritableDatabase/getReadableDatabase
,这将导致版本崩溃并返回本地数据库。
所以你需要:
getReadableDatabase();
,只是为了触发进程,以防db版本被更改为db.getVersion();
与当前版本进行比较 - DATABASE_VERSION
。并做你需要做的事 - 升级或降级。答案 1 :(得分:0)
代码中没有onCreate
方法。这意味着,您的数据库从未创建过。
此外,仅在调用以下任何方法后调用onCreate
和onUpgrade
方法:database.getReadableDatabase()
或database.getWritableDatabase()
,调用执行创建数据库。
UPD:试试这个:
DatabaseHelper dbOpenHelper = new DatabaseHelper(this);
SQLiteDatabase database = dbOpenHelper.openDataBase();
SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
Log.w(database.getVersion());