gpt4 book ai didi

android - 升级我从 Assets 文件夹复制的 sqlite 数据库 (Android)

转载 作者:IT王子 更新时间:2023-10-29 06:25:41 26 4
gpt4 key购买 nike

我使用这个教程: Tutorial Custom database

我从 Assets 文件夹复制数据库并将其复制到我的设备(或模拟器)。一切都是正确的。我从 DDMS 的角度看我的数据库。但我有时也想升级我的数据库,所以我做了:

super(context, DB_NAME, null, 2); //changed version from 1 to 2

并修改onUpgrade方法:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(newVersion > oldVersion){
this.myContext.deleteDatabase(DB_NAME);
try {
this.copyDataBase();
} catch (IOException e) {
e.printStackTrace();
}
}
}

但运行后我的设备上仍然有旧版本的数据库。我如何删除旧版本的数据库并复制新的。 DB_NAME 是我的数据库名称(有格式,但没有路径), copyDataBase() 是将数据库复制到设备的方法(并且有效)。

我粘贴我所有的代码:

public class DataBaseHelper extends SQLiteOpenHelper{

private static String DB_PATH = "/data/data/sitcom.quiz/databases/";

private static String DB_NAME = "sitcoms.sqlite";

private SQLiteDatabase myDataBase;

private final Context myContext;

public DataBaseHelper(Context context) {

super(context, DB_NAME, null, 4);
this.myContext = context;
}

public void createDataBase() throws IOException{

boolean dbExist = checkDataBase();

if(dbExist){
//do nothing - database already exist
}else{

this.getReadableDatabase();

try {

copyDataBase();

} catch (IOException e) {

throw new Error("Error copying database");

}
}

}

private boolean checkDataBase(){

SQLiteDatabase checkDB = null;

try{
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

}catch(SQLiteException e){
//database does't exist yet.
}

if(checkDB != null){
checkDB.close();
}

return checkDB != null ? true : false;
}


private void copyDataBase() throws IOException{

//Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);

// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;

//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);

//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}

//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();

}

public void openDataBase() throws SQLException{

//Open the database
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

}

@Override
public synchronized void close() {

if(myDataBase != null)
myDataBase.close();

super.close();

}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d("adas", "dasd");

if(newVersion > oldVersion){
String myPath = DB_PATH + DB_NAME;
this.myContext.deleteDatabase(myPath);
try {
this.copyDataBase();
} catch (IOException e) {
e.printStackTrace();
}
}
}


}

和我的 Activity :

DataBaseHelper myDbHelper = new DataBaseHelper(this);
myDbHelper = new DataBaseHelper(this);

try {
myDbHelper.createDataBase();
} catch (IOException ioe) {
throw new Error("Unable to create database");
}
try {
myDbHelper.openDataBase();
}catch(SQLException sqle){
throw sqle;
}

如果你能给我理由或仅提示为什么这不起作用,谢谢。

最佳答案

android 在调用 onUpgrade() 函数时已经打开了数据库。我认为此时无法删除它。检查日志以获取更多信息。如果你想这样做,你需要将删除和复制代码移动到数据库尚未打开的地方。

关于android - 升级我从 Assets 文件夹复制的 sqlite 数据库 (Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10956557/

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