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以前的版本