测试 Flutter 本地 sqflite 数据库 onUpgrade,应用更新后无数据显示

Testing Flutter local sqflite database onUpgrade and no data shown after app update

我想更新一个已经在 Google Play 上发布的应用程序,但之前我想测试并查看本地 sqlite 数据库是否会在更新后保留所有数据,因为它存储了用户添加的数据内容。

首先,我在旧版本的数据库中添加了一些内容,然后更新了 it.When 我通过内部测试更新了应用程序,它没有显示任何数据,就好像它会创建一个空的新数据库一样。

还有什么我应该注意的吗?因为我只向数据库添加了几个列,并且没有更改任何有关数据库初始化和数据库路径的代码。

使用的软件包:sqflite: 2.0.0+3 path: 1.8.0

来自数据库的 dart 文件的代码片段:

    import 'package:path/path.dart';
    import 'package:sqflite/sqflite.dart';
    import 'package:sqflite/sqlite_api.dart';
  
    class DatabaseHelper{

        /// ------- name variables ----------------
        static final _dbName = 'userTasks.db';
        static final _dbVersion = 2;                
        static final _tableName = 'myTasks';

        /// ------- table column Names -------------
        static final columnID = 'id';
        static final columnName = 'name';
        static final columnContent = 'content';
        static final columnType = 'type';
        static final columnDescription = 'description';
        static final columnFavorite = 'favorite';

        /// -------- DataBase initialization ---------
        DatabaseHelper._privateConstructor();
        static final DatabaseHelper instance = DatabaseHelper._privateConstructor();

        static Database _database;
        Future<Database> get database async{
          if(_database !=null)  return _database;

          _database = await _initiateDatabase();
          return _database;
        }

        _initiateDatabase () async{

          Directory directory = await getApplicationDocumentsDirectory();
          String path = join(directory.path,_dbName);
          return await openDatabase(path, version: _dbVersion, onCreate: _onCreate, onUpgrade: _onUpgrade);

        }

        /// ---------------    _onCreate() getting called on fresh install(no previous DB)  -----------------

        Future _onCreate(Database db, int version){
          db.execute(
              '''
              CREATE TABLE $_tableName( 
              $columnID INTEGER PRIMARY KEY,
              $columnName TEXT,
              $columnContent TEXT NOT NULL,
              $columnType TEXT NOT NULL,
              $columnDescription TEXT NOT NULL,
              $columnFavorite INTEGER)
              '''
          );
        }

        /// ---------------    _onUpgrade() getting called on _dbVersion versionChange  -----------------

        Future _onUpgrade(Database db, int oldVersion, int newVersion) {
          db.execute(''' ALTER TABLE $_tableName ADD COLUMN $columnDescription TEXT''');
          db.execute(''' ALTER TABLE $_tableName ADD COLUMN $columnFavorite INTEGER DEFAULT 0 ''');
        }


提前致谢!

我不确定 getApplicationDocumentsDirectory,但如果您使用 getDatabasesPath 或只是一个没有路径的名称,并且如果您在 (https://developer.android.com/guide/topics/data/autobackup) 上有自动备份,它应该可以工作。

第一个测试可以在没有 google 播放的情况下完成,只需保留您发布的每个 apk(即使您使用 bundle,也构建并保留一个 apk 总是好的)以便您可以测试2 个版本之间的正确迁移。

您可以更改数据库版本并刷新应用程序

看看 android:allowBackup="false" android:fullBackupOnly="false" https://developer.android.com/guide/topics/manifest/application-element

并查看这个

Flutter how to backup and restore sqflite database?