检查 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;
  }

来源:https://github.com/tekartik/sqflite/issues/251