如何使用 sqlite 数据库升级 flutter 应用程序?

How do you upgrade a flutter app with sqlite database?

我有一个使用 SQLITE 数据库的 flutter 应用程序。 我想发布应用程序商店和 google Play 商店中的应用程序的新版本更新。

新版本将有新的列和新的表。

要在我的应用程序中包含哪些高级步骤才能使该应用程序 a) 从现有数据库中复制所有现有用户记录 b) 将这些粘贴到新数据库中 - post upgrade

当然我可以将我所有的记录放在一个动态列表中——这就是我所做的,但是我使用什么触发器以便当用户升级到新版本时(通过 App Store 或 google play store) 我们可以优雅地将所有用户数据从现有数据库复制到新版本吗?

来自 sqflite documentation

TL:DR

迁移示例

这是一个简单的数据库架构迁移示例,其中:

a column is added to an existing table a table is added

// Our database path
String path;
// Our database once opened
Database db;

第一版

第一个版本创建一个带有名称列的公司 table。

/// Create tables
void _createTableCompanyV1(Batch batch) {
  batch.execute('DROP TABLE IF EXISTS Company');
  batch.execute('''CREATE TABLE Company (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT
)''');
}

// First version of the database
db = await factory.openDatabase(path,
    options: OpenDatabaseOptions(
        version: 1,
        onCreate: (db, version) async {
          var batch = db.batch();
          _createTableCompanyV1(batch);
          await batch.commit();
        },
        onDowngrade: onDatabaseDowngradeDelete));

第二版

假设我们要添加一个新的 table 员工并引用公司实体。我们还想在 Company 实体中添加一个新的列描述。

我们在 onCreate 中处理新数据库的创建并在 onUpgrade 中处理架构迁移。此外,由于我们想使用外键约束,我们在 onConfigure.

中配置我们的访问权限
/// Let's use FOREIGN KEY constraints
Future onConfigure(Database db) async {
  await db.execute('PRAGMA foreign_keys = ON');
}

/// Create Company table V2
void _createTableCompanyV2(Batch batch) {
  batch.execute('DROP TABLE IF EXISTS Company');
  batch.execute('''CREATE TABLE Company (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT,
    description TEXT
)''');
}

/// Update Company table V1 to V2
void _updateTableCompanyV1toV2(Batch batch) {
  batch.execute('ALTER TABLE Company ADD description TEXT');
}

/// Create Employee table V2
void _createTableEmployeeV2(Batch batch) {
  batch.execute('DROP TABLE IF EXISTS Employee');
  batch.execute('''CREATE TABLE Employee (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT,
    companyId INTEGER,
    FOREIGN KEY (companyId) REFERENCES Company(id) ON DELETE CASCADE
)''');
}

// 2nd version of the database
db = await factory.openDatabase(path,
    options: OpenDatabaseOptions(
        version: 2,
        onConfigure: onConfigure,
        onCreate: (db, version) async {
          var batch = db.batch();
          // We create all the tables
          _createTableCompanyV2(batch);
          _createTableEmployeeV2(batch);
          await batch.commit();
        },
        onUpgrade: (db, oldVersion, newVersion) async {
          var batch = db.batch();
          if (oldVersion == 1) {
            // We update existing table and create the new tables
            _updateTableCompanyV1toV2(batch);
            _createTableEmployeeV2(batch);
          }
          await batch.commit();
        },
        onDowngrade: onDatabaseDowngradeDelete));

更改应用程序架构后,您将必须重新启动应用程序。除非您正确关闭当前打开的数据库,否则 Flutter Hot-reload 将无法工作。