大家好,又见面了,我是你们的朋友全栈君。
Flutter 本地数据库sqflite实战操作
通过本文章将带你了解sqflite如何使用并管理,注意要学习本功能、要具备一定的sql数据库操作的基础知识!
知识点:
- 本地化列表数据
- 本地化列表详情数据
- sqflite 本地化数据库增删改查操作
一、安装sqflite
https://pub.flutter-io.cn/packages/sqflite
二、创建Db数据库文件夹,创建Db文件
文件夹路径:Lib/Db/StepTasksDb/StepTasksDb.dart
三、编辑Db文件
StepTasksDb.dart全部代码
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
// 定义数据库Mock模型
final String tableName = 'step_task_table'; // 数据库名称
final String columnId = '_id'; // 索引id
final String columnType = 'step_listType'; // 列表类型
final String columnStepListData = 'step_listData'; // 列表数据
final String columnStepDataDetails = 'step_status'; // 列表详情数据
// 定义模板模型类
class StepTasks {
int id;
String stepListType; // 列表类型
String stepListData; // 列表数据
String stepDataDetails; // 详情数据
StepTasks({
this.id, this.stepListType, this.stepListData, this.stepDataDetails});
// 模型转Map数据使用
Map<String, Object> toMap() {
var map = <String ,Object>{
columnType:stepListType,
columnStepListData:stepListData,
columnStepDataDetails:stepDataDetails
};
if (id != null) {
map[columnId] = id;
}
return map;
}
// 模型数据传入类中
StepTasks.fromMap(Map<String, Object> map){
id = map[columnId];
stepListType = map[columnType];
stepListData = map[columnStepListData];
stepDataDetails = map[columnStepDataDetails];
}
}
// 定义数据库
class StepTasksDb {
Database db;
// 初始化数据库
Future<String> initDatabase() async {
// 获取本地存储数据库路径
var databasesPath = await getDatabasesPath();
// 创建数据库db文件
String path = join(databasesPath, 'stepTasks.db');
return path;
}
// 打开并创建表
Future open(String path) async {
print('------------------打开并创建表<StepTasksDb>------------------');
db = await openDatabase(path, version:1, onCreate:(Database db, int version) async {
await db.execute('''
create table $tableName (
$columnId integer primary key autoincrement,
$columnType text ,
$columnStepListData text ,
$columnStepDataDetails text
)
''');
});
}
// 添加数据
Future<StepTasks> insert(StepTasks data) async {
data.id = await db.insert(tableName, data.toMap());
return data;
}
// 获取数据(根据type条件查询)
Future<List> getData({
type = ''}) async {
List<Map> maps = [];
maps = await db.query(tableName, columns:[columnId, columnType, columnStepListData, columnStepDataDetails], where: '$columnType = ?', whereArgs: [type]);
if(maps ==null || maps.length == 0){
return [];
}
List list = [];
for(int i = 0; i<maps.length; i++){
list.add(maps[i]);
}
return list;
}
// 修改数据(通过id匹配修改整个数据)
Future<int> update(StepTasks data) async {
return await db.update(tableName, data.toMap(), where: '$columnId = ?', whereArgs: [data.id]);
}
// 删除数据(通过id匹配删除数据)
Future<int> delete(int id) async {
return await db.delete(tableName, where:'$columnId = ?', whereArgs:[id]);
}
// 关闭此表的链接
Future close() async => db.close();
}
四、使用创建的数据库文件
注意:
首先安装网络监听插件:connectivity,虽然本插件已经停止更新了,但是在Pub官方文档也有新的插件替代了旧插件,大家可以凭个人需求来,这里不强求用什么插件,只需要达到网络监听效果即可。
import 'dart:convert';
import 'package:flutter/material.dart';
import 'TestDb_Flutter/Db/StepTasksDb/StepTasksDb.dart';
class TestDbPage extends StatefulWidget {
@override
State<TestDbPage> createState() => _TestDbPageState();
}
class _TestDbPageState extends State<TestDbPage> {
var listData = [];
var _storageListData = []; // 存储本地数据
List cacheSelectList = []; // 存储需要缓存的数据
var networkStatus = -1; // -1:没有网络 1:wifi 2:4G
StepTasksDb _stepTaskDb = StepTasksDb();
@override
void initState() {
super.initState();
_initDatabase();
}
// 打开数据库
Future _initDatabase() async {
String path = await _stepTaskDb.initDatabase();
// await File(path).delete(); // 删除表
await _stepTaskDb.open(path); // 打开表
_getListData();
}
// 网络请求数据
Future _getListData() async {
await _getStorageData();
if(networkStatus == 1){
var res = await api.request('https://xxx.xxxx/api');
setState((){
listData = res['data']})
return res;
}else{
// 没有网络的话
setState(() {
_listData = _storageListData;
});
return _storageListData;
}
}
// 获取本地数据
Future _getStorageData() async {
var data = await _stepTaskDb.getData(type: 'process');
setState(() {
_storageListData = data; // 先赋值一次 以便添加时使用
});
}
@override
void dispose() {
// 关闭数据库
_stepTaskDb.close();
super.dispose();
}
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: listData.length,
itemBuilder: (context, index){
return InkWell(
child:Container(child:Text(listData[index]['title']));
onTap:(){
// 创建要存储本地的数据
var dataBase = {
'step_listData': json.encode(listData[index]),
};
// 请求详情的参数
var params = {
id:'xxx'};
var res = await api.request('https://xxx.xxxx/api', formData: params);
// 不为空的话,证明拿到了正常数据,将其存储到要存储的数据参数中
if(res != null){
dataBase['assets_listDetails'] = json.encode(res['data']);
}
// 进行本地缓存
var db_res = await _stepTaskDb.insert(StepTasks(stepListType:'process', stepListData:dataBase['step_listData'], stepDataDetails:dataBase['assets_listDetails']));
},
onLongPress: (){
// 只在获取了本地存储的情况下,才能够通过id删除数据
_stepTaskDb.delete(v['_id']);
},
);
},
);
}
}
以上代码暂且只介绍了本地化操作的 增删查操作、至于修改操作,则和增操作大体类似,通过传入的本地数据id,来将新的数据替换掉旧的数据即可
例子:
var res = await _stepTaskDb.update(StepTasks(id:v['id'], stepListType:'process', stepListData:dataBase['listData'], stepDataDetails:dataBase['listDetails']));
目前为止,应该将最基本的增删改查操作介绍完了,并且附上了例子,如果不出大问题的话,大家应该可以达到本地化数据的操作,有问题请下方留言联系我~
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/138486.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...