Flutter 本地数据库sqflite实战操作「建议收藏」

Flutter 本地数据库sqflite实战操作「建议收藏」Flutter本地化数据库操作、sqflite操作方法、数据库操作

大家好,又见面了,我是你们的朋友全栈君。

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']));

目前为止,应该将最基本的增删改查操作介绍完了,并且附上了例子,如果不出大问题的话,大家应该可以达到本地化数据的操作,有问题请下方留言联系我~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138486.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据库建表语句的使用及简单实战教程_SQL数据库建立一个表

    数据库建表语句的使用及简单实战教程_SQL数据库建立一个表目录介绍需求思路思路1:一张表来表示所有数据(如下图)思路2:两张表,学生表和班级表(如下图)代码扩展1.数据库设计三范式1.数据库表中不能出现重复记录,每个字段是原子性的不能再分(不可重复,不可再分)2.第二范式是建立在第一范式基础上的,另外要求所有非主键字段完全依赖主键,不能产生部分依赖3.建立在第二范式基础上的,非主键字段不能传递依赖于主键字段。(不要产生传递依赖)2.经典的数据库设计框架–er图介绍本文将用一个简单的tip来简单介绍建表语句,可以作为建表语句的模板使用需求采集一个学校中学生

    2025年10月7日
    3
  • 推荐5款好用的Java软件,初学者必看「建议收藏」

    推荐5款好用的Java软件,初学者必看「建议收藏」“工欲善其事必先利其器”,想要学好Java,除了要有好的学习资源之外,还要有一套适合自己的Java软件,好的软件能极大提高你的学习和工作效率。那么,学Java用什么软件好呢?下面小千为大家推荐5款好用的Java软件。

    2022年7月7日
    26
  • 使用AnalyticDB MySQL创建数据库及表过程

    使用AnalyticDB MySQL创建数据库及表过程简介目标是让云上数据仓库用户及开发者通过简单的步骤体验基于AnalyticDBMySQL版和DMS构建云原生数据仓库的主要流程,场景将通过实例的开通、结构与数据的初始化、报表的开发、报表可视化等环节,用3个具体的应用场景来体验AnalyticDBMySQL版在新零售场景下的交互查询和ETL计算速度,以及通过DMS进行数据仓库数据报表开发的流程。提供的数据集是一个零售场景的模拟数据,包括客户信息、订单记录、货物信息、国家地域信息等内容,数据总量10GB,最大数据表记录数为5999万条。产品简介云原

    2022年9月17日
    5
  • idea如何查找替换_pycharm查找替换

    idea如何查找替换_pycharm查找替换在平时敲代码的时候经常碰到,咦,这个变量名好像不太合适,但又写了好多这时候可以怎么办呢?Pycharm里面给我们准备了替换功能————–windows电脑—————1.Ctrl+r替换2.Ctrl+Shift+F全局查3.Ctrl+Shift+R全局替换————–MAC电脑—————1.command+F全局查找2.command+R全局替换…

    2022年8月29日
    5
  • 微信支付java实例_java开发微信应用

    微信支付java实例_java开发微信应用JAVA开发集成微信支付(WXPay)遇到的坑!

    2022年4月20日
    41
  • document.all详解「建议收藏」

    document.all详解「建议收藏」(1)document.all是页面内所有元素的一个集合。 document.all[]这个数组可以访问文档中所有元素。document.all(0)表示页面内第一个元素(2)document.all可以判断浏览器是否是IEif(document.all){alert(“isIE!”);}(3)也可以通过给某个元素设置id属性(id=good),然

    2022年7月12日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号