升级 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
   }