Flutter Sqlite onCreate不是';从数据库/存储中删除/删除表后调用

Flutter Sqlite onCreate不是';从数据库/存储中删除/删除表后调用,flutter,dart,sqflite,Flutter,Dart,Sqflite,最小可复制代码: 类助手{ 数据库(db),; Future initDb()异步{ 如果(_db==null){ 最终目录=等待getApplicationDocumentsDirectory(); _db=wait openDatabase(join(directory.path,'foo.db'),版本:1,onCreate:_onCreate); } 返回_db; } Future u onCreate(数据库数据库,u)异步{ 打印('onCreate'); 等待db.transact

最小可复制代码:

类助手{
数据库(db),;
Future initDb()异步{
如果(_db==null){
最终目录=等待getApplicationDocumentsDirectory();
_db=wait openDatabase(join(directory.path,'foo.db'),版本:1,onCreate:_onCreate);
}
返回_db;
}
Future u onCreate(数据库数据库,u)异步{
打印('onCreate');
等待db.transaction((txn)异步{
等待txn.execute('CREATE TABLE tableName(abc TEXT)');
});
}
}
以下是我的主要方法:

void main()异步{
最终目录=等待getApplicationDocumentsDirectory();
final file=file(join(directory.path,'foo.db');
if(wait file.exists()){
等待文件。删除();
}
//如果有一个文件,它现在被删除了。
最终帮助者=帮助者();
wait helper.initDb();//必须激发'onCreate',但不能。
}

每次运行
main
方法时,它都应该在
Helper
类中执行
onCreate
方法,但它只执行一次。我做错了什么?

这是默认行为,因为在创建数据库时会执行onCreate方法。因为数据库是在不再执行之前创建的


如果要清除表中的行,请使用TRUNCATE命令。有关详细信息,请检查比较drop table和truncate table的链接,这是默认行为,因为在创建数据库时会执行onCreate方法。因为数据库是在不再执行之前创建的


如果要清除表中的行,请使用TRUNCATE命令。有关详细信息,请检查比较drop table和truncate table的链接,只有在没有数据库文件时才会执行onCreate。如果数据库中没有表,则不会。如果删除数据库文件,则控制台中将显示一条打印消息,消息为
onCreate
。以下是一个例子:

void main() async {
  final directory = await getApplicationDocumentsDirectory();
  final path = join(directory.path, 'foo.db');
  await File(path).delete();

  final helper = Helper();
  await helper.initDb();
  // await helper.dropTable();
}

此代码在程序每次运行时打印一条日志消息。

onCreate
仅在没有数据库文件时执行。如果数据库中没有表,则不会。如果删除数据库文件,则控制台中将显示一条打印消息,消息为
onCreate
。以下是一个例子:

void main() async {
  final directory = await getApplicationDocumentsDirectory();
  final path = join(directory.path, 'foo.db');
  await File(path).delete();

  final helper = Helper();
  await helper.initDb();
  // await helper.dropTable();
}

这段代码在程序每次运行时都会打印一条日志消息。

这不是Sqflite的工作方式

当你第一次创建一个数据库时,你给它一个版本号。在您的情况下,版本是1

Sqflite将检查设备上是否存在数据库。如果数据库存在,它将检查设备上db的版本号和代码的版本号。如果版本不同,它将调用onUpgrade,如果新版本大于旧db版本。如果旧版本大于新版本,则降级。不会调用OnCreate。onCreate仅在用户第一次安装应用程序时才被调用。即使你后来放下桌子。如果将来需要在生产应用程序上更新数据库,则必须编写onUpgrade方法,在该方法中必须显式删除表并调用onCreate。并升级数据库版本

请参阅下面的代码。每当需要删除所有表并再次创建时,请使用此代码设置并将版本更改为更高的版本号

如果您不想使用版本并显式删除表并重新创建它们。放下一张桌子后,你必须给自己打电话

class Helper {
  Database _db;

  Future<Database> initDb() async {
    if (_db == null) {
      final directory = await getDatabasesPath();
      final path = join(directory, 'foo.db');
      _db = await openDatabase(
        path,
        version: 2, //+1 to this number whenever you want to update 
        onCreate: _onCreate,
        onUpgrade: _onUpgrade,
      );
    }
    return _db;
  }

  Future<void> _onUpgrade(
      Database db, int previousVersion, int newVersion) async {
    _db = db;
    await dropTable();
    await _onCreate(db, newVersion);
  }

  Future<void> _onCreate(Database db, int version) async {
    print('onCreate');
    await db.transaction((txn) async {
      await txn.execute('CREATE TABLE tableName(abc TEXT)');
    });
  }

  Future<void> dropTable() async {
    await _db.transaction((txn) async {
      await txn.execute('DROP TABLE IF EXISTS tableName');
    });
  }
类助手{
数据库(db),;
Future initDb()异步{
如果(_db==null){
final directory=wait getDatabasesPath();
final path=join(目录'foo.db');
_db=等待开放数据库(
路径
版本:2,//+1,只要您想更新,就可以将其更改为该数字
onCreate:_onCreate,
onUpgrade:_onUpgrade,
);
}
返回_db;
}
未来贸易(
数据库数据库,int-previousVersion,int-newVersion)异步{
_db=db;
等待dropTable();
等待创建(db,新版本);
}
Future\u onCreate(数据库数据库数据库,int版本)异步{
打印('onCreate');
等待db.transaction((txn)异步{
等待txn.execute('CREATE TABLE tableName(abc TEXT)');
});
}
Future dropTable()异步{
等待数据库事务((txn)异步{
等待txn.execute('DROP TABLE IF EXISTS tableName');
});
}

这不是Sqflite的工作方式

当你第一次创建一个数据库时,你给它一个版本号。在你的例子中,版本号是1

Sqflite将检查设备上是否存在数据库如果存在,它将检查设备上db的版本号和代码的版本号,如果版本不相同,如果新版本大于旧db版本,它将调用onUpgrade。如果旧版本大于新版本,它将在降级时调用OnCreate。OnCreate将不被调用。OnCreate仅为c在用户第一次安装应用程序时调用。即使之后删除了表。如果以后需要在生产应用程序上更新数据库,则必须编写onUpgrade方法,在该方法中,必须显式删除表并调用onCreate yourself。并升级数据库版本

请参阅以下代码。每当需要删除所有表并再次创建时,请使用此代码设置并将版本更改为更高的版本号

如果您不想使用版本并显式删除表并重新创建它们,则必须在删除表后调用onCreate yourself

class Helper {
  Database _db;

  Future<Database> initDb() async {
    if (_db == null) {
      final directory = await getDatabasesPath();
      final path = join(directory, 'foo.db');
      _db = await openDatabase(
        path,
        version: 2, //+1 to this number whenever you want to update 
        onCreate: _onCreate,
        onUpgrade: _onUpgrade,
      );
    }
    return _db;
  }

  Future<void> _onUpgrade(
      Database db, int previousVersion, int newVersion) async {
    _db = db;
    await dropTable();
    await _onCreate(db, newVersion);
  }

  Future<void> _onCreate(Database db, int version) async {
    print('onCreate');
    await db.transaction((txn) async {
      await txn.execute('CREATE TABLE tableName(abc TEXT)');
    });
  }

  Future<void> dropTable() async {
    await _db.transaction((txn) async {
      await txn.execute('DROP TABLE IF EXISTS tableName');
    });
  }
类助手{
数据库(db),;
Future initDb()异步{
如果(_db==null){
final directory=wait getDatabasesPath();
final path=join(目录'foo.db');
_db=等待开放数据库(
路径
版本:2,//+1,只要您想更新,就可以将其更改为该数字
onCreate:_onCreate,
onUpgrade:_onUpgrade,
);
}
返回_db;
}
未来贸易(
数据库数据库,int以前的版本