Flutter:更新数据库结构

时间:2018-12-30 09:52:42

标签: dart flutter

我正在使用带有flutter应用程序的sqlflite,并且我拥有用于​​初始化数据库的此方法:

initDB() async{
    String dbPath = await getDatabasesPath();
    String path = join(dbPath, 'keemot.db');

    var ourDB = await openDatabase(
      path, 
      version: 1,
      onCreate: _onCreat,
      );
    return ourDB;
  }

这是_onCreate方法:

void _onCreat(Database db, int version) async{
    await db.execute(
      'CREATE TABLE $_table ('
        '$_columnId INTEGER PRIMARY KEY,'
        '$_columnTite TEXT,'
        '$_columnDate TEXT,'
        '$_columnTime TEXT,'
        '$_columnMonth INTEGER,'
        '$_columnDay INTEGER,'
        '$_columnReiteration INTEGER,'
        '$_columnReiterationTarget TEXT,'
        '$_columnNotification INTEGER,'
        '$_columnNotificationTarget TEXT'
      ')'
    );
  }

我想添加另一个表,所以我做了以下事情:

void _onCreat(Database db, int version) async{
    print ('creating ... version => $version');
    await db.execute(
      'CREATE TABLE $_table ('
        '$_columnId INTEGER PRIMARY KEY,'
        '$_columnTite TEXT,'
        '$_columnDate TEXT,'
        '$_columnTime TEXT,'
        '$_columnMonth INTEGER,'
        '$_columnDay INTEGER,'
        '$_columnReiteration INTEGER,'
        '$_columnReiterationTarget TEXT,'
        '$_columnNotification INTEGER,'
        '$_columnNotificationTarget TEXT'
      ');'
      'CREATE TABLE $_settingsTable (' // I added the table to this method like so
        '$_settingsColumnLang VARCHAR (3)'
      ');'
    );
  }

但是我遇到了这个异常:

DatabaseException(no such table: settings)

我已经用openDatabase()方法更新了版本,我以为它会回忆起_onCreate()方法,但是仍然会遇到相同的异常。
我应该如何更新数据库结构?

1 个答案:

答案 0 :(得分:0)

我认为您应该两次调用db.execute来创建两个单独的表。

对于这种情况,我也建议您提供onUpgrade回调。您可以执行以下操作:

var ourDB = await openDatabase(
      path, 
      version: 3,
      onCreate: _onCreat,
      onUpgrade: _onUpgrade 
);

您的升级方法可能看起来像这样,以删除旧表并再次调用您的onCreate方法:

_onUpgrade(Database db, int oldVersion, int newVersion) {
    await db.execute("DROP TABLE IF EXISTS $_table");
    _onCreat(db, newVersion);
}