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)
上一篇 2022年5月6日 下午3:40
下一篇 2022年5月6日 下午4:00


相关推荐

  • sntp服务器位置,sntp的服务器地址

    sntp服务器位置,sntp的服务器地址sntp的服务器地址内容精选换一换介绍常见的安全组配置示例。如下示例中,出方向默认全通,仅介绍入方向规则配置方法。不同安全组内的云耀云服务器内网互通仅允许特定IP地址远程连接云耀云服务器SSH远程连接Linux云耀云服务器RDP远程连接Windows云服务器公网ping云耀云服务器云耀云服务器作Web服务器云耀云服务器作DNS服务器使用FTP上传或下载文件场景举例:在介绍常见的安全组配置示例…

    2025年7月15日
    4
  • MyBatis-@param注解详解

    MyBatis-@param注解详解param 参数注解一 Param 注解单一属性 dao 层示例 PublicUserse param userName Stringname param userpassword Stringpasswo xml 映射对应示例 amp amp amp amp amp lt selectid amp amp amp amp quot selectUser amp amp amp a

    2026年3月17日
    2
  • vue引入vant_vueaxios跨域请求

    vue引入vant_vueaxios跨域请求因为后端给的接口不是本地的接口,所以需要跨域来获取接口数据在vue.config.js中对其进行配置devServer:{host:’localhost’,port:3030,//端口https:false,proxy:{//配置跨域’/api’:{target:’http://xx.xx.xx.xxx’,//代理的接口域名以及端口号;ws:

    2026年4月15日
    4
  • CAN转以太网设备实现can报文与tcp/udp报文之间的高效低延时转换

    CAN转以太网设备实现can报文与tcp/udp报文之间的高效低延时转换LCNET 系列工业级 CAN 转以太网设备提供一路 10 100M 以太网通道 RJ45 和 1 2 路 CAN 通道 实现 CAN 网络与 IP 网络之间的互联互通 支持 TCPServer TCPClient 和 UDP 工作模式 IP 地址 端口 CAN 波特率 分包帧数 分包时间间隔等均可设置 这里进行 CAN 转以太网设备双向高效转发演示 测试示例的参数设置 UDP 模式 CAN 波特率 500Kbps 分包帧数为 1 即接收到一个 CAN 帧就封装成一个 UDP 报文发送到网络中 分包时间间隔为 0 即为 7 8 个 CAN 帧连续发送所需的

    2025年11月16日
    5
  • 带求和符号的函数求导公式_幂级数如何求和函数

    带求和符号的函数求导公式_幂级数如何求和函数

    2022年10月10日
    6
  • 1.两数之和_两个数的和怎么算

    1.两数之和_两个数的和怎么算1.两数之和

    2022年4月20日
    66

发表回复

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

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