美文网首页flutter实战技术
flutter sqflite数据库使用

flutter sqflite数据库使用

作者: 江水东流 | 来源:发表于2024-01-28 17:48 被阅读0次

flutter项目里需要存储数据如果比较少可以用SharedPreferences,
如果存储数据比较多 尤其需要筛选的话 我们就得用数据库了
我封装了sqflite,存一个model 取出来也是一个model
需要查询的属性需要自己设置一个独立属性 ,其它属性放到一个jsonString里面就行

首先建立一个model id是主键 默认自增,也可以用项目里数据属性的一个id代替,就不用自增了.

class NoteModel {
  //唯一di 如果需要查询属性比较多,这里都增加上,并在创建table地方增加属性   
 //db.execute( 'create table if not exists $tableName 
 // (id integer primary key autoincrement, content text)');
  
  int? id;
  // 可以存 jsonString,使用时候 转成model
  String? content;

  NoteModel({this.id, this.content});

  ///提供fromJson以方便将数据库查询结果,转成Dart Model
  NoteModel.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    content = json['content'];
  }

  ///提供toJson以方便在持久化数据的时候使用
  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['id'] = id;
    data['content'] = content;
    return data;
  }
}


下面是使用方法
  //数据库名字
  String dbName = 'test';
  //表名
  String tableName = 'tableName1';

  Database? database;
  JDTableTool? tableTool;
  //初始化
  void _doInit() async {
    // 每次TestDbContentModel结构变化 version +1
    Database? db = storage.dateBaseMap[dbName];
    if (db != null) {
      database = db!;
    } else {
      database =
          await openDatabase(dbName, version: 1, onCreate: (db, version) {
        // 在数据库首次创建时执行的操作
      }, onUpgrade: (db, oldVersion, newVersion) async {
        // 在数据库升级时执行的操作
        if (oldVersion == 1 && newVersion == 2) {
          // 如果当前数据库版本为1,目标版本为2,执行操作
        }
      });
    }

    jdLog('database?.getVersion: ${await database?.getVersion()}');
    if (database != null) {
  // name TEXT, value INTEGER, num REAL; 需要查询的属性 必须单独写成属性,如果你的map里面有唯一id 就不必要自增了
      tableTool = JDStorageTool(database!, tableName,
          'create table if not exists $tableName (id integer primary key autoincrement, content text)');
      _loadAll();
      _loadAll();
    }
  }


  void destroy() {
    tableTool?.destroy();
  }

  ///增加数据
  void _doSave(String nameValue, int age) {
    TestDbContentModel contentModel =
        TestDbContentModel.fromJson({'name': nameValue, 'age': age});
    tableTool?.saveNote(NoteModel(content: jsonEncode(contentModel.toJson())));
    _loadAll();
  }

  ///查询数据
  void _loadAll() async {
    var list = await tableTool?.getAllNote() ?? [];
    jdLog('list.length--  ${list.length}');
    setState(() {
      noteList = list;
    });
    _getCount();
  }

  ///更新数据
  void _updateContent() {
    if (id == null || name == null) return;
    TestDbContentModel contentModel =
        TestDbContentModel.fromJson({'name': name, 'age': age});
    var model = NoteModel(id: id, content: jsonEncode(contentModel.toJson()));
    tableTool?.update(model);
    _loadAll();
  }

  ///删除数据
  void _doDelete(NoteModel model) {
    tableTool?.deleteNote(model.id!);
    _loadAll();
  }

  ///查询列数
  void _getCount() async {
    var count = await tableTool?.getNoteCount() ?? 0;
    setState(() {
      this.count = count;
    });
  }

具体的封装实现在https://gitee.com/kuaipai/my_app.git

相关文章

网友评论

    本文标题:flutter sqflite数据库使用

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