【问题标题】:Check if table exists in flutter检查表是否存在于颤动中
【发布时间】:2020-06-29 05:22:30
【问题描述】:

我已经实现了检查数据库助手类中是否存在数据库的代码。这是我的 DatabaseHelper 类。

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() 在我调用时返回 true

var db = new DatabaseHelper();

但是当我调用db.tableIsEmpty() 时,即使在执行 OnCreate 之后,我也会收到错误“no such table:User”

我该如何解决问题或如何检查数据库中是否存在表?

【问题讨论】:

    标签: flutter sqflite


    【解决方案1】:

    因为openDatabase需要完整路径
    在你的代码中你已经定义了

    Future<Database> get db 
    

    所以请从

    var db = await openDatabase('main.db');
    

    var db = await db;
    

    代码sn-p

    void tableIsEmpty()async{
        var db = await db;
         
        int count = Sqflite
             .firstIntValue(await db.rawQuery('SELECT COUNT(*) FROM User'));
          
         print(count);    
    }
    

    【讨论】:

      【解决方案2】:

      可以通过查询sqlite_master来检查sqflite表是否存在

      db.query('sqlite_master', where: 'name = ?', whereArgs: [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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-15
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-06
        相关资源
        最近更新 更多