flutter 使用sqflite

1,188 阅读3分钟

前言

flutter的存储有一下几种:

1. shared_preferences

官方提供的存储方式,可以使用“key“ -  “value”的方式记入用户不可见的手机存储位置。是一种适用于量小的存储方式。

2. 写入文件

通过path_provider将内容写入文件,适用于对于图片,视频等比较量大的内容存储。

3. 数据库

可以进行增删改查,适用于量大,或者复杂查询方式的需求。

使用

1、SQLite

SQLite是遵守ACID的关系数据库管理系统。与许多其它数据库管理系统不同,SQLite不是一客户端/服务器结构的数据库引擎,而是被集成在用户程序中。

SQLite遵守ACID,实现了大多数SQL标准。它使用动态的、弱类型的SQL语法。它作为嵌入式数据库,是应用程序,如网页浏览器,在本地/客户端存储数据的常见选择。它可能是最广泛部署的数据库引擎,因为它正在被一些流行的浏览器、操作系统、嵌入式系统所使用。同时,它有许多程序设计语言的语言绑定。

总结下来,其特点有

  1. 不需要单独的服务器或操作系统

  2. SQLite不需要配置,即不需要手动安装和管理

  3. 存储在一个单一的跨平台的磁盘文件

  4. 不需要外部依赖,完全自给自足

  5. 轻量级

2、sqflite是什么

sqflite是用于Flutter的SQLite插件,支持iOS、Android、MacOS

  1. 支持事务和批量操作

  2. 程序打开期间,自动化版本管理

  3. 增删改查的帮助程序

  4. 在iOS和Android后台线程中执行DB操作

saflite有五种数据类型:NULL,INTEGER,REAL,TEXT,BLOB

  • NULL,默认值,值不存在

  • INTEGER,即int类型,值的范围是-2^63 到 2^63 - 1

  • REAL,即num类型,即int和double类型

  • TEXT,即String类型

  • BLOB,即Uint8List类型,虽然能够存储List< int >,但官方并不建议,因为转化比较慢

3、sqflite怎么用

 - 数据库操作

1、数据库的创建

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

String databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'db_name.db');

Database database = await openDatabase(  path,
  version: VERSION,
  onCreate: onCreate,
  onUpgrade: (Database db, int oldVersion, int newVersion) async {
    // 数据库升级
  },
);
//具体表的创建onCreate(Database db, int version) async {    await db.execute(      "CREATE TABLE Test ("      "id INTEGER PRIMARY KEY autoincrement, "      ....      "historyMsgList TEXT)"    );  }

2、数据库的删除

await deleteDatabase(path);

3、数据库关闭

await database.close();

4、数据库升级

在某些时候,表的结构要更新,增加列或者减少,这时候可以进行数据库的升级,使用onUpgrade,可以看到,字段中比起创建多了oldVersion和newVersion,这里需要newVersion比原version大。

 - 表操作

1、添加表

添加表有几种方法:

//直接写入SQL语句:
await database.execute(
    'CREATE TABLE Test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)'
);

//通过引号分割
await db.execute(      "CREATE TABLE Test ("      "id INTEGER PRIMARY KEY autoincrement, "      ....      "historyMsgList TEXT)");

2、删除表

database.execute('DROP table Test');

3、清空表

database.execute('DELETE FROM test');

4、重命名

database.execute('ALTER TABLE test RENAME TO test_1');

5、添加字段

database.execute('ALTER TABLE test ADD age integer');

6、删除字段

database.execute('ALTER TABLE test DROP COLUMN age');
复制代码

7、修改字段类型

database.execute('ALTER TABLE test ALTER COLUMN value TEXT');

 - 数据的增删改查

1、添加数据

//以map方式
int id = await database.insert(
    ‘Test’, 
    {'name': 'Civet', 'value': '18', 'num': '456.7'}
);

//以sql语句方式
int id = await database.rawInsert(
    'INSERT INTO test(name, value, num) VALUES("Civet", 18, 456.7)'
);

//以数据model格式
await _db.insert(
    "Test", 
   TestType.toMap(), //插入类型的string
   conflictAlgorithm: ConflictAlgorithm.fail
);

class TestType {  int id;
  String name;  String value;  String num;
  User(this.name, this.value, this.num, {this.id});
  User.fromJson(Map<String,dynamic> json){
    id = json['id'];
    account = json['name'];    pwd = json['value'];    name = json['num'];
  }

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,      'value': value,      'num': num,
    };
  }
}

2、查询数据

//参数形式
List<Map<String, dynamic>> result = await database.query(
  ‘test’,
  distinct: true, // 是否是独特的,即是否不让重复
  columns: ['name','value'], // 需要查询的列
  where: 'age > ?', // 查询条件
  whereArgs: [16], // 查询条件参数
  groupBy: 'name', // 按列分组
  having: 'count(name) < 2', // 给分组设置条件
  orderBy: 'name asc', // 按列排序 asc/desc
  limit: 5, // 限制查询结果数量
  offset: 2, // 跳过几条数据
);

List<Map<String, dynamic>> result = await _db.query('shoe',
   where: ' id > ? and name = ?',
   whereArgs: [ 2, "Civet"],   orderBy: 'id ASC'
);
if (result.isEmpty){
   print("查询结果为空");
}else{
   print(result);
}//对全表做查询
List<Map> list = await database.rawQuery('SELECT * FROM Test');

3、删除数据

删除数据和查询数据的方式一样,只是方法不同

int count = await database.delete(
    'test', 
    where: 'name = ?',
    whereArgs: ['Civet']
);

4、修改数据

await database.update(
    "user", 
    testType.toMap(), 
    where: "id = ?",
    whereArgs: [user.id]
);