检查 table 是否存在于 flutter 中
Check if table exists in flutter
我已经实现了代码来检查数据库助手 class 中是否存在数据库。这是我的 DatabaseHelper class.
static final DatabaseHelper _instance = new DatabaseHelper.internal();
DatabaseHelper.internal();
factory DatabaseHelper() => _instance;
static Database _db;
static final table = 'User';
Future checkDb() async{
Directory documentDirectory = await getApplicationDocumentsDirectory();
//var db = await getDatabasesPath();
var dbPath = join(documentDirectory.path,"main.db");
bool exist = await databaseExists(dbPath);
return exist;
}
Future<Database> get db async{
if(_db!= null)
{
return _db;
}
_db = await initdb();
return _db;
}
initdb() async{
Directory documentDirectory = await getApplicationDocumentsDirectory();
String path = join(documentDirectory.path,"main.db");
var ourDb = await openDatabase(path,version:1,onCreate:_onCreate);
return ourDb;
}
void _onCreate(Database db,int version)async {
await db.execute("CREATE TABLE User("
"userId INTEGER PRIMARY KEY,"
"first_name TEXT,"
"last_name TEXT,"
"user_password TEXT,"
")");
print("User Table created");
}
void tableIsEmpty()async{
var db = await openDatabase('main.db');
int count = Sqflite
.firstIntValue(await db.rawQuery('SELECT COUNT(*) FROM User'));
print(count);
}
数据库创建成功,db.checkdb()
returns 当我调用
时为真
var db = new DatabaseHelper();
但是当我调用 db.tableIsEmpty()
时,我得到一个错误 “没有这样的 table:User” 即使在执行 OnCreate 之后?
如何解决问题或如何检查数据库中是否存在 table?
因为openDatabase
需要完整路径
在你的代码中你定义了
Future<Database> get db
所以请从
var db = await openDatabase('main.db');
到
var db = await db;
代码片段
void tableIsEmpty()async{
var db = await db;
int count = Sqflite
.firstIntValue(await db.rawQuery('SELECT COUNT(*) FROM User'));
print(count);
}
您可以通过查询 sqlite_master
来检查 sqflite table 是否存在
db.query('sqlite_master', where: 'name = ?', whereArgs: [table]);
如果 table 不存在则创建
static const table = 'User';
static const version = 1;
initdb() async{
Directory documentDirectory = await getApplicationDocumentsDirectory();
String path = join(documentDirectory.path, "main.db");
var ourDb = await openDatabase(path, version: version, onCreate:_onCreate);
if (await db.query('sqlite_master', where: 'name = ?', whereArgs: [table]) == []) {
_onCreate (ourDb, version);
}
return ourDb;
}
我已经实现了代码来检查数据库助手 class 中是否存在数据库。这是我的 DatabaseHelper class.
static final DatabaseHelper _instance = new DatabaseHelper.internal();
DatabaseHelper.internal();
factory DatabaseHelper() => _instance;
static Database _db;
static final table = 'User';
Future checkDb() async{
Directory documentDirectory = await getApplicationDocumentsDirectory();
//var db = await getDatabasesPath();
var dbPath = join(documentDirectory.path,"main.db");
bool exist = await databaseExists(dbPath);
return exist;
}
Future<Database> get db async{
if(_db!= null)
{
return _db;
}
_db = await initdb();
return _db;
}
initdb() async{
Directory documentDirectory = await getApplicationDocumentsDirectory();
String path = join(documentDirectory.path,"main.db");
var ourDb = await openDatabase(path,version:1,onCreate:_onCreate);
return ourDb;
}
void _onCreate(Database db,int version)async {
await db.execute("CREATE TABLE User("
"userId INTEGER PRIMARY KEY,"
"first_name TEXT,"
"last_name TEXT,"
"user_password TEXT,"
")");
print("User Table created");
}
void tableIsEmpty()async{
var db = await openDatabase('main.db');
int count = Sqflite
.firstIntValue(await db.rawQuery('SELECT COUNT(*) FROM User'));
print(count);
}
数据库创建成功,db.checkdb()
returns 当我调用
var db = new DatabaseHelper();
但是当我调用 db.tableIsEmpty()
时,我得到一个错误 “没有这样的 table:User” 即使在执行 OnCreate 之后?
如何解决问题或如何检查数据库中是否存在 table?
因为openDatabase
需要完整路径
在你的代码中你定义了
Future<Database> get db
所以请从
var db = await openDatabase('main.db');
到
var db = await db;
代码片段
void tableIsEmpty()async{
var db = await db;
int count = Sqflite
.firstIntValue(await db.rawQuery('SELECT COUNT(*) FROM User'));
print(count);
}
您可以通过查询 sqlite_master
db.query('sqlite_master', where: 'name = ?', whereArgs: [table]);
如果 table 不存在则创建
static const table = 'User';
static const version = 1;
initdb() async{
Directory documentDirectory = await getApplicationDocumentsDirectory();
String path = join(documentDirectory.path, "main.db");
var ourDb = await openDatabase(path, version: version, onCreate:_onCreate);
if (await db.query('sqlite_master', where: 'name = ?', whereArgs: [table]) == []) {
_onCreate (ourDb, version);
}
return ourDb;
}