flutter sqflite多表增删改查,数据库升级

添加依赖

sqflite: 1.3.1

官方文档:https://pub.dev/packages/sqflite

建立辅助类

import 'dart:async';

import 'package:flutterdemo/library/sqflite/article_provider.dart';
import 'package:flutterdemo/library/sqflite/person_provider.dart';
import 'package:sqflite/sqflite.dart';

class SqfliteHelper {
  Database database;

  //饿汉式单例
  static SqfliteHelper _instance = SqfliteHelper._();

  //工厂模式,单例公开访问点
  factory SqfliteHelper() => _getInstance();

  //私有构造
  SqfliteHelper._();

  static SqfliteHelper _getInstance() {
    return _instance;
  }

  Future<Database> init() async {
    String path = await getDatabasesPath();
    path = '$path/flutter_demo.db';
    print('路径:$path');
    database = await openDatabase(
      path,
      version: 2,
      singleInstance: false,
      onCreate: _onCreate,
      onUpgrade: _onUpgrade,
      onDowngrade: _onDowngrade,
    );
    return database;
  }

  FutureOr<void> _onUpgrade(Database db, int oldVersion, int newVersion) async {
    Batch batch = db.batch();
    if (oldVersion == 1) {
      batch.execute('alter table ta_person add fire text');
    } else if (oldVersion == 2) {
      batch.execute('alter table ta_person add water text');
    } else if (oldVersion == 3) {}
    oldVersion++;
    //升级后版本还低于当前版本,继续递归升级
    if (oldVersion < newVersion) {
      _onUpgrade(db, oldVersion, newVersion);
    }
    await batch.commit();
  }

  FutureOr<void> _onCreate(Database db, int version) async {
    db.execute(ArticleProvider().createSql);
    db.execute(PersonProvider().createSql);
  }

  FutureOr<void> _onDowngrade(
      Database db, int oldVersion, int newVersion) async {
    Batch batch = db.batch();

    await batch.commit();
  }

  Future<bool> isTableExists(String table) async {
    String sql =
        "select * from Sqlite_master where type='table' and name= '$table'";
    var result = await database.rawQuery(sql);
    return result != null && result.length > 0;
  }

  tableName() async {
    String sql = "select * from Sqlite_master where type='table' ";
    var result = await database.rawQuery(sql);
    result.forEach((element) {
      print(element.toString());
    });
  }
}
import 'package:flutterdemo/library/sqflite/sqflite_helper.dart';
import 'package:sqflite/sqflite.dart';
import 'package:sqflite/sqlite_api.dart';
final String _id = 'id';
final String _title = 'title';
final String _content = 'content';

class Article {
  int id;
  String title;
  String content;

  Article({this.id, this.title, this.content});

  Map<String, dynamic> toMap() {
    Map<String, dynamic> map = {
      _title: title,
      _content: content,
    };
    return map;
  }

  Article.fromMap(Map<String, dynamic> map) {
    id = map[_id];
    title = map[_title];
    content = map[_content];
  }
}

class ArticleProvider {
  Database _database;
  static const String _table = 'ta_article';
  String createSql =
      'CREATE TABLE $_table ($_id INTEGER PRIMARY KEY, $_title TEXT, $_content TEXT)';

  ArticleProvider() {
    _database = SqfliteHelper().database;
  }

  Future insert(Article article) async {
    return await _database.insert(_table, article.toMap());
  }

  Future inserts(List<Article> articles) async {
    Batch batch = _database.batch();
    articles.forEach((element) {
      batch.insert(_table, element.toMap());
      print('${DateTime.now()}--${element.toMap()}');
    });
    return await batch.commit();
  }

  Future<Article> query(int id) async {
    List<Map> maps = await _database.query(
      _table,
      columns: [_id, _title, _content],
      where: '$_id=?',
      whereArgs: [id],
      limit: 1,
    );
    if (maps.length == 1) {
      return Article.fromMap(maps.first);
    } else {
      return null;
    }
  }

  Future<List<Article>> queryAll() async {
    List<Map> maps = await _database.query(_table);
    List<Article> list = [];
    maps.forEach((element) {
      list.add(Article.fromMap(element));
    });
    return list;
  }

  Future delete(int id) async {
    return await _database.delete(
      _table,
      where: '$_id=?',
      whereArgs: [id],
    );
  }

  Future update(Article article) async {
    return await _database.update(
      _table,
      article.toMap(),
    );
  }

  Future close() async {
    return await _database.close();
  }

  Future drop() async {
    String path = await getDatabasesPath();
    path = '$path/demo.db';
    return await deleteDatabase(path);
  }

  Future clear() async {
    await _database.delete(_table);
  }
}
import 'package:sqflite/sqflite.dart';
import 'package:sqflite/sqlite_api.dart';

import 'sqflite_helper.dart';

final String _id = 'id';
final String _name = 'name';
final String _age = 'age';

class Person {
  int id;
  String name;
  int age;

  Person(this.id, this.name, this.age);

  Map<String, dynamic> toMap() {
    Map<String, dynamic> map = {
      _name: name,
      _age: age,
    };
    return map;
  }

  Person.fromMap(Map<String, dynamic> map) {
    id = map[_id];
    name = map[_name];
    age = map[_age];
  }
}

class PersonProvider {
  Database _database;
  static const String _table = 'ta_person';
  String createSql =
      'CREATE TABLE $_table ($_id INTEGER PRIMARY KEY, $_name TEXT, $_age INTEGER)';

  PersonProvider() {
    _database = SqfliteHelper().database;
  }

  Future insert(Person person) async {
    return await _database.insert(_table, person.toMap());
  }

  Future inserts(List<Person> persons) async {
    Batch batch = _database.batch();
    persons.forEach((element) {
      batch.insert(_table, element.toMap());
      print('${DateTime.now()}--${element.toMap()}');
    });
    return await batch.commit();
  }

  Future<Person> query(int id) async {
    List<Map> maps = await _database.query(
      _table,
      columns: [_id, _name, _age],
      where: '$_id=?',
      whereArgs: [id],
      limit: 1,
    );
    if (maps.length == 1) {
      return Person.fromMap(maps.first);
    } else {
      return null;
    }
  }

  Future<List<Person>> queryAll() async {
    List<Map> maps = await _database.query(_table);
    List<Person> persons = [];
    maps.forEach((element) {
      persons.add(Person.fromMap(element));
    });
    return persons;
  }

  Future delete(int id) async {
    return await _database.delete(
      _table,
      where: '$_id=?',
      whereArgs: [id],
    );
  }

  Future update(Person person) async {
    return await _database.update(
      _table,
      person.toMap(),
    );
  }

  Future close() async {
    return await _database.close();
  }

  Future drop() async {
    String path = await getDatabasesPath();
    path = '$path/demo.db';
    return await deleteDatabase(path);
  }

  Future clear() async {
    await _database.delete(_table);
  }
}

附带创建表的工具类

https://gitee.com/jiangzhuqingfeng/SmartSevice.git     java工程

建立Model

/**
 * 实体类model
 */
public class Model {
    /**
     * 设备序列号
     * 通行时间
     * 人员ID
     * 人员name
     * 对比分值
     * error_code
     * 图片1
     * 图片2
     */
    private String deviceNo;
    private String compareTime;
    private String staff_no;
    private String staff_name;
    private double score;
    private int errorCode;
    private String faceCropUrl;
    private String openFaceUrl;
}

执行如下代码生成dart建表需要的列

 static void jsonToDartProperty() {
        String jsonStr = "";
        Model model = new Model();
        Map<String, String> stringStringMap = ConvertMapHelper.objectSelefToMap(model);
        for (String key : stringStringMap.keySet()) {
            System.out.println(String.format("static const String %s='%s';", key,
                    stringStringMap.get(key)));
        }

    }
static const String _compareTime='compareTime';
static const String _deviceNo='deviceNo';
static const String _errorCode='errorCode';
static const String _faceCropUrl='faceCropUrl';
static const String _openFaceUrl='openFaceUrl';
static const String _score='score';
static const String _staff_name='staff_name';
static const String _staff_no='staff_no';

猜你喜欢

转载自blog.csdn.net/jerry872235631/article/details/107251146