升级 android 应用程序,如何覆盖 sqlite
upgrade android app , how to override sqlite
我在 10M sqlitedb 中有一个 android 版本 4.20 的应用程序,现在我在 100M sqlitedb 中有一个版本 4.21 的应用程序,我想将 4.20 升级到 4.21,升级完成后,我找到了 sqlite大小在 4.21 应用程序中仍然保持 10M。
所以问题是升级app 4.20 -> 4.21时如何覆盖sqlitedb。
我的业务是:app会有很多数据同步。为了优化,每个APP在发布的时候都会在SQLite中填入初始化数据。所以,每次app升级后,希望能彻底覆盖SQLite。
非常感谢任何帮助。
您可以升级数据库版本,并在 SQLiteOpenHelper 的 onUpgrade()
方法中删除所有表并调用 onCreate()
方法重新创建数据库。
public class MyOpenHelper extends SQLiteOpenHelper {
...
private void resetDB(SQLiteDatabase db) {
// Drop all tables
db.execSQL("DROP TABLE IF EXISTS table_name");
// TODO duplicate above line for other tables
// Crate tables again
onCreate(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
resetDB(db);
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onDowngrade(db, oldVersion, newVersion);
resetDB(db);
}
}
问题是没有调用 onUpgrade 函数,因为当您从资产加载数据库时,默认版本是 0.
并且当您调用本应调用 onUpgrade 方法的 db.getReadableDatabase() 或 db.getWriteableDatabase 时,它会失败,因为版本号 0 本应是一个新数据库。
如果您看到 SqliteOpenHelper 源代码
db.beginTransaction();
try {
//Skips updating in your case
if (version == 0) {
onCreate(db);
} else {
if (version > mNewVersion) {
onDowngrade(db, version, mNewVersion);
} else {
onUpgrade(db, version, mNewVersion);
}
}
db.setVersion(mNewVersion);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
当 db 的版本号是 0 时,onUpgrade
函数不会被调用。
解决该问题的一种方法是在将数据库添加到资产时更改数据库的版本号,或者在打开之前更改它
解决方案更改版本号和您的问题
try
{
String myPath = MyApplication.context.getDatabasePath(DATABASE_NAME).toString();
//open a database directly without Sqliteopenhelper
SQLiteDatabase myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
//if the version is default 0 the update the version
if (myDataBase.getVersion() == 0)
{
//update the database version to the previous one
myDataBase.execSQL("PRAGMA user_version = " + 1);
}
//Close DataBase
myDataBase.close();
}
catch (Exception e)
{
//Do Nothing a fresh install happened
}
我在 10M sqlitedb 中有一个 android 版本 4.20 的应用程序,现在我在 100M sqlitedb 中有一个版本 4.21 的应用程序,我想将 4.20 升级到 4.21,升级完成后,我找到了 sqlite大小在 4.21 应用程序中仍然保持 10M。
所以问题是升级app 4.20 -> 4.21时如何覆盖sqlitedb。
我的业务是:app会有很多数据同步。为了优化,每个APP在发布的时候都会在SQLite中填入初始化数据。所以,每次app升级后,希望能彻底覆盖SQLite。
非常感谢任何帮助。
您可以升级数据库版本,并在 SQLiteOpenHelper 的 onUpgrade()
方法中删除所有表并调用 onCreate()
方法重新创建数据库。
public class MyOpenHelper extends SQLiteOpenHelper {
...
private void resetDB(SQLiteDatabase db) {
// Drop all tables
db.execSQL("DROP TABLE IF EXISTS table_name");
// TODO duplicate above line for other tables
// Crate tables again
onCreate(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
resetDB(db);
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onDowngrade(db, oldVersion, newVersion);
resetDB(db);
}
}
问题是没有调用 onUpgrade 函数,因为当您从资产加载数据库时,默认版本是 0.
并且当您调用本应调用 onUpgrade 方法的 db.getReadableDatabase() 或 db.getWriteableDatabase 时,它会失败,因为版本号 0 本应是一个新数据库。
如果您看到 SqliteOpenHelper 源代码
db.beginTransaction();
try {
//Skips updating in your case
if (version == 0) {
onCreate(db);
} else {
if (version > mNewVersion) {
onDowngrade(db, version, mNewVersion);
} else {
onUpgrade(db, version, mNewVersion);
}
}
db.setVersion(mNewVersion);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
当 db 的版本号是 0 时,onUpgrade
函数不会被调用。
解决该问题的一种方法是在将数据库添加到资产时更改数据库的版本号,或者在打开之前更改它
解决方案更改版本号和您的问题
try
{
String myPath = MyApplication.context.getDatabasePath(DATABASE_NAME).toString();
//open a database directly without Sqliteopenhelper
SQLiteDatabase myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
//if the version is default 0 the update the version
if (myDataBase.getVersion() == 0)
{
//update the database version to the previous one
myDataBase.execSQL("PRAGMA user_version = " + 1);
}
//Close DataBase
myDataBase.close();
}
catch (Exception e)
{
//Do Nothing a fresh install happened
}