我有一个数据库,我想在下次更新我的应用程序时更改该数据库..但我不想丢失数据库中的当前数据(在应用程序目录中)..我必须将该数据复制到新的数据库并删除旧的数据库。我怎么能实现呢?还有其他任何想法让我知道......
提前感谢..
这是我目前的数据库代码......
public class DbUtils {
public static String DB_PATH;
private String DB_NAME;
File dbDir;
private SQLiteDatabase dataBase;
public DbUtils(File fileDirectory, String sqliteFileName) {
this.DB_NAME = sqliteFileName;
dbDir = fileDirectory;
}
public void createDatabaseIfNotExists(Context context) throws IOException {
boolean createDb = false;
File dbFile = new File(dbDir.getAbsolutePath() + "/" + DB_NAME);
DB_PATH = dbFile.getAbsolutePath();
if (!dbDir.exists()) {
dbDir.mkdir();
createDb = true;
} else if (!dbFile.exists()) {
createDb = true;
} else {
boolean doUpgrade = false;
if (doUpgrade) {
dbFile.delete();
createDb = true;
}
}
if (createDb) {
InputStream myInput = context.getAssets().open(DB_NAME);
OutputStream myOutput = new FileOutputStream(dbFile);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
}
public SQLiteDatabase getStaticDb() {
return dataBase = SQLiteDatabase.openDatabase(DB_PATH, null,
SQLiteDatabase.OPEN_READWRITE);
}
public void closeDataBase(){
if(dataBase!=null && dataBase.isOpen()){
dataBase.close();
}
}
}
答案 0 :(得分:0)
更常见的解决方案是保留数据库,但要根据需要对其进行转换以使用新版本的应用程序。这称为“数据库升级”。
您可能会担心,如果此过程在升级过程中失败,您将既没有旧数据库也没有新数据库。然而,这可以通过数据库事务来解决。如果整个数据库升级过程在单个事务中发生,那么该事务将失败并且不执行任何操作,以便您可以继续使用旧版本的应用程序,或者成功并且您可以使用新版本的应用程序。
这是如何在事务中包装数据库升级:
SQLiteDatabase database = SQLiteDatabase.openDatabase(uri, null, SQLiteDatabase.SQLITE_OPEN_READWRITE);
database.beginTransaction();
// put your database upgrade code here, for example:
database.execSQL("ALTER TABLE MyTable ADD NewColumn int");
database.execSQL("ALTER TABLE AnotherTable ADD AnotherColumn int");
database.endTransaction();
database.setTransactionSuccessful();