通过一个本地存草稿的示例记录sqflite的使用
方便日后工作中进行参考,所以对此进行记录如下,首先要在dart文件中引入必须的核心三方:
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
然后创建一个类,取名 DraftsDB,首先要初始化本数据库:
String table = 'drafts_box'; // 表名static final DraftsDB _instance = DraftsDB._init();static Database? _database;factory DraftsDB() => _instance;DraftsDB._init();/// 异步获取或创建数据库Future<Database?> get database async {if (_database != null) return _database;_database = await _initDB();return _database;}/// 数据库初始化Future<Database> _initDB() async {Directory documentsDirectory = await getApplicationDocumentsDirectory();String path = join(documentsDirectory.path, '$table.db');return await openDatabase(path,version: 1,onCreate: _onCreate,);}/// 初创建草稿箱表Future<void> _onCreate(Database db, int version) async {await db.execute('''CREATE TABLE IF NOT EXISTS $table (id INTEGER PRIMARY KEY AUTOINCREMENT, phone TEXT NOT NULL UNIQUE,pass_word TEXT NOT NULL,title TEXT,times INTEGER NOT NULL);''');}
创建表时的phone TEXT NOT NULL UNIQUE,中的UNIQUE是禁止重复的手机号插入。
然后是插入数据的方法:
/// 插入数据Future<int> insert({required String phone,required String passWord,String? text,}) async {final db = (await database)!;return await db.insert(table,{'phone': phone,'pass_word': passWord,'text':text,'times': DateTime.now().millisecondsSinceEpoch ~/ 1000,},conflictAlgorithm: ConflictAlgorithm.replace,);}
插入方法中的conflictAlgorithm: ConflictAlgorithm.replace,是可以替换的意思。更新的方法:
Future<int> updatePass({required int id,required String phone,required String passWord,}) async {final db = (await database)!;return await db.update(table,{'phone': phone,'pass_word': passWord,'times': DateTime.now().millisecondsSinceEpoch ~/ 1000,},where: 'id = ?',whereArgs: [id],);}
检查是否存在符合条件的数据:
Future<bool> exists(int id) async {final db = (await database)!;final result = await db.rawQuery('''SELECT COUNT(*) AS count FROM $table WHERE id = ?''', [id]);final count = Sqflite.firstIntValue(result) ?? 0;return count > 0;}
获取本地所有数据,并按时间倒序排列
Future<List<Map<String, dynamic>>> getAllRecord() async {final db = (await database)!;return await db.query(table, orderBy: 'times DESC');}
分页查询数据:
/// 分页查询数据Future<List<Map<String, dynamic>>> queryPage(int page) async {final db = (await database)!;final offset = (page - 1) * 10;List<Map<String, dynamic>> res = await db.query(table,limit: 10,offset: offset, // 跳过前 offset 条数据orderBy: 'times DESC',);return res;}
删除符合条件的查询记录:
Future<bool> delete(int id) async {final db = (await database)!;final count =await db.delete(table, where: 'id = ?', whereArgs: [id]);return count > 0;}
清空表里所有数据:
Future<int> clearAll() async {final db = (await database)!;return await db.delete(table);}
把这些方法记录下来方便以后查阅!