Android应用升级代码运行位置咨询:含SharedPreferences与GreenDao清理场景
Android应用升级:代码执行位置与一次性清理方案
嘿,关于Android应用升级时的代码执行位置,我刚好有不少实践经验,给你一步步拆解清楚:
一、数据库迁移(GreenDao)的代码位置
GreenDao本身提供了成熟的数据库迁移机制,你的迁移逻辑应该放在自定义的DaoMaster.OpenHelper子类中,重写onUpgrade方法。这个方法会在数据库版本号(你在GreenDao生成代码里配置的SCHEMA_VERSION)更新时自动触发。
举个实际的代码示例:
public class MyCustomDaoHelper extends DaoMaster.OpenHelper { public MyCustomDaoHelper(Context context, String dbName) { super(context, dbName); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 小版本迭代:用MigrationHelper执行针对性的迁移逻辑(比如新增字段、修改表结构) MigrationHelper.migrate(db, UserDao.class, OrderDao.class); // 大版本重构:如果需要完全重置数据库(谨慎使用,会丢失数据) // DaoMaster.dropAllTables(db, true); // DaoMaster.createAllTables(db, true); } }
你需要在初始化GreenDao的地方(比如Application类或单例数据库管理类)使用这个自定义Helper,这样版本升级时迁移逻辑就会自动执行。
二、大版本更新时的一次性清理代码(SharedPreferences + GreenDao)
你的需求是仅在大版本升级时执行一次清理逻辑,核心思路是记录已处理过的应用版本号,判断当前是否为首次升级到目标版本。最适合的执行位置是Application类的onCreate方法——因为它是应用启动时第一个执行的组件,能确保清理逻辑在其他业务代码运行前完成。
具体实现步骤和代码示例:
public class MyApp extends Application { // 定义大版本升级的目标版本号(比如从v1.x升级到v2.x对应VERSION_CODE=20) private static final int LARGE_UPGRADE_TARGET_VERSION = 20; @Override public void onCreate() { super.onCreate(); // 先处理大版本升级的一次性逻辑 handleLargeVersionCleanup(); // 再执行其他初始化操作(比如GreenDao初始化、第三方SDK初始化) initGreenDao(); } private void handleLargeVersionCleanup() { // 用一个专门的SharedPreferences存储版本处理记录 SharedPreferences upgradePrefs = getSharedPreferences("app_upgrade_records", MODE_PRIVATE); int handledVersion = upgradePrefs.getInt("KEY_LAST_HANDLED_VERSION", 0); int currentVersion = BuildConfig.VERSION_CODE; // 判断是否是首次升级到目标大版本 if (currentVersion >= LARGE_UPGRADE_TARGET_VERSION && handledVersion < LARGE_UPGRADE_TARGET_VERSION) { // 1. 清理指定的SharedPreferences会话信息 SharedPreferences sessionPrefs = getSharedPreferences("session_info", MODE_PRIVATE); sessionPrefs.edit().clear().apply(); // 或者删除特定键:remove("USER_TOKEN") // 2. 清理GreenDao数据库(根据需求选择重置或清理数据) MyCustomDaoHelper daoHelper = new MyCustomDaoHelper(this, "my_app_db"); SQLiteDatabase db = daoHelper.getWritableDatabase(); // 方案一:清空所有表数据(保留表结构) // UserDao userDao = new DaoMaster(db).newSession().getUserDao(); // userDao.deleteAll(); // 方案二:完全重建数据库(谨慎,会丢失所有数据) DaoMaster.dropAllTables(db, true); DaoMaster.createAllTables(db, true); // 3. 更新已处理的版本号,确保下次启动不再执行该逻辑 upgradePrefs.edit().putInt("KEY_LAST_HANDLED_VERSION", currentVersion).apply(); } } private void initGreenDao() { MyCustomDaoHelper daoHelper = new MyCustomDaoHelper(this, "my_app_db"); DaoSession daoSession = new DaoMaster(daoHelper.getWritableDatabase()).newSession(); // 后续用daoSession操作数据库 } }
额外注意事项
- 版本判断优先用VERSION_CODE:相比版本名(如"2.0.0"),整数类型的VERSION_CODE更适合做大小比较,避免字符串比较的坑。
- 耗时操作考虑用WorkManager:如果清理逻辑涉及大量数据处理(比如备份数据再清理),可以把任务放到WorkManager中执行,避免阻塞Application启动。
- 数据备份:大版本更新前如果需要保留用户数据,一定要先做备份再执行清理/迁移操作,避免数据丢失。
内容的提问来源于stack exchange,提问作者AlanSTACK
相关产品推荐
相关产品推荐

