美文网首页Flutter
Flutter 数据库使用示例

Flutter 数据库使用示例

作者: 李小轰 | 来源:发表于2021-05-27 16:21 被阅读0次
    时光易老,每天晨跑。今天我们来简单说说Flutter的数据库使用。
    • 首先,我们进行一个简单的封装,创建抽象基类 BaseDbProvider 提供给每个业务层作为模板:
    abstract class BaseDbProvider {
      //提供上层业务方实现
      String getDbFileName();
      Future<Database> getDb(Database db, int dbVersion) async {
        if (db == null || !db.isOpen) {
          String dbPath = await getDatabasesPath();
          File file = File(join(dbPath, getDbFileName()));
          bool exists = await file.exists();
          if (!exists) {
            await file.create(recursive: true);
          }
          db = await openDatabase(join(dbPath, getDbFileName()),
              version: dbVersion, onCreate: onCreate, onUpgrade: onUpgrade);
        }
        return db;
      }
    
      Future onCreate(Database db, int version);
      //版本更新时会使用
      Future onUpgrade(Database db, int oldVersion, int newVersion);
    }
    
    • 接下来,假设我们需要封装一个用户相关的数据层,我们来这么使用:
    class UserDbProvider extends BaseDbProvider {
      static UserDbProvider _instance;
      Database _db;
    
      factory UserDbProvider() {
        if (_instance == null) {
          _instance = UserDbProvider._();
        }
        return _instance;
      }
    
      static UserDbProvider get instance => UserDbProvider();
    
      UserDbProvider._();
    
      Future<bool> _openDb() async {
        _db = await getDb(_db, 1);
        return Future.value(true);
      }
    
      @override
      String getDbFileName() {
        return 'user.db';
      }
    
      @override
      Future onCreate(Database db, int version) async {
        await db.execute('''
        CREATE TABLE IF NOT EXISTS 'user' (
          ID TEXT,
          Level TEXT,
          Name TEXT)
          ''');
      }
    
      @override
      Future onUpgrade(Database db, int oldVersion, int newVersion) async {
        await db.execute("DROP TABLE 'user'");
        await onCreate(db, newVersion);
      }
    
      Future updateUsers(List<User> bucket) async {
        await _openDb();
        Batch batch = _db.batch();
        bucket.forEach((element) {
          batch.update("'user'", element.toJson(),
              where: "Level = ?",
              whereArgs: ["${element.level}"],
              conflictAlgorithm: ConflictAlgorithm.replace);
        });
        return batch.commit();
      }
    }
    

    以上两个步骤,便是一个简单的数据库层使用示例。

    附注,

    对于sql的使用,我们也可以灵活的自己进行拼接,需要注意的是,拼接sql时,表名,以及字段对应的条件value,需要使用单引号:

    await _openDb();
    String sql ="SELECT * FROM 'user' WHERE ID = '1'";
    List list = await _db.rawQuery(sql);
    

    相关文章

      网友评论

        本文标题:Flutter 数据库使用示例

        本文链接:https://www.haomeiwen.com/subject/hncdsltx.html