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

问题描述

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

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

要在我的应用中包含哪些高级步骤,以便该应用 a)从现有数据库复制所有现有用户记录 b)将它们粘贴到新数据库中-升级后

我当然可以将所有记录放入动态列表中-这是我所做的,但是我使用什么触发器,以便在用户升级到新版本(通过App Store或Google Play商店)时我们可以从现有数据库正常复制所有用户数据到新版本?

解决方法

来自sqflite documentation

TL:DR

迁移示例

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

将一列添加到现有表 添加了表格

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

第一版

第一个版本使用名称列创建一个Company表。

/// 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));

第二版

假设我们要添加一个新表Employee并引用Company实体。我们还想在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,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,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将无法工作。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...