onUpgrade数据库-oldVersion-newVersion
我正在使用此DataBaseHelper.class,并且停留在onUpgrade()方法上。我不知道如何找出数据库的版本号。我可以在第一次发布时将版本设置为1,而在发布更新时,只需将版本设置为2即可(myDataBase.setVersion(2);)
。但是只要应用程序正在运行,它就只有2。下次启动时,它将再次为1。发生同样的事情private
static int DATABASE_VERSION。我当时正在考虑将版本号存储在一个额外的表中,但是在我看来,这似乎不是最佳实践。
那么,如何确定升级后版本号已经增加并保持不变(分配给private static int
DATABASE_VERSION或的值myDataBase.getVersion();
)呢?
DataBaseHelper类:
public class DataBaseHelper extends SQLiteOpenHelper { //The Android's default system path of your application database.
private static String DB_PATH = "/data/data/com.mydatabase.db/databases/";
private static String DB_NAME = "database.sl3";
private SQLiteDatabase myDataBase;
private final Context myContext;
// Do you need this?
private static int DATABASE_VERSION = 2;
// or is this correct:
// private static int DATABASE_VERSION = myDataBase.getVersion();
/**
* Constructor
* Takes and keeps a reference of the passed context in order to access to
* the application assets and resources.
*
* @param context
*/
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, DATABASE_VERSION);
this.myContext = context;
}
/**
* Creates an empty database on the system and rewrites it with your own
* database.
* */
public void
createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
}
else {
//By calling this method and empty database will be created into the default system path
//of your application so we are gonna be able to overwrite that database with our database.
this.getWritableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
/**
* Check if the database already exist to avoid re-copying the file each
* time you open the application.
*
* @return true if it exists, false if it doesn't
*/
private boolean
checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
} catch (SQLiteException e) {
//database does't exist yet.
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
/**
* Copies your database from your local assets-folder to the just created
* empty database in the
* system folder, from where it can be accessed and handled.
* This is done by transfering bytestream.
* */
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_READWRITE);
// Which parameters do I have to pass?
onUpgrade(myDataBase, DATABASE_VERSION, 2);
}
@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 ("onUpgrade first log", Integer.toString(myDataBase.getVersion()));
if (oldVersion == 1) {
// do something
// And then do this!?
DATABASE_VERSION = 2;
// or do this
myDataBase.setVersion(2);
Log.d ("onUpgrade sedond log", Integer.toString(myDataBase.getVersion()));
}
else {
Log.d("onUpgrade", "else-clause: Already upgraded!");
}
}
回答:
// Do you need this?private static int DATABASE_VERSION = 2;
是的,您需要这个。(甚至更好,final
也要做到。)
这将告诉数据库帮助程序最新版本的数据库架构。这应该在您的应用程序代码中固定,并在更改架构时递增。
当您的应用程序启动时,帮助程序会在运行时检查您的代码最新版本是否与上次创建或升级数据库时处于活动状态的版本相同。(这是做什么db.getVersion()
的。)如果数字不匹配,则帮助程序会知道存储的数据库相对于您的应用程序代码而言已过时,因此它将运行升级例程。
好像您不是从头开始创建数据库,而是从资产中导入现有数据库。进行初始导入时,这是确保存储的版本与代码版本匹配的时间;或者将其直接应用于资产中的数据库文件,或者,如果确定资产中的数据库文件与代码匹配,则调用setVersion(DATABASE_VERSION)
。
无论如何,您都不应尝试在onUpgrade()
例程中修改版本号。仅在版本不匹配时才调用此方法,并且您在这里要做的就是进行任何必要的更改以使数据库保持最新。升级完成后,帮助程序将管理新版本号的存储。
以上是 onUpgrade数据库-oldVersion-newVersion 的全部内容, 来源链接: utcz.com/qa/401820.html