Flutter: moor_flutter库,简化sqlite操作

2023-10-19 17:30

本文主要是介绍Flutter: moor_flutter库,简化sqlite操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • video
  • moor_flutter
  • 示例代码仓库

install

dependencies:...moor_flutter:dev_dependencies:...moor_generator:build_runner:

lib\db\moor.db.dart

import 'package:moor_flutter/moor_flutter.dart';part 'moor.db.g.dart';// 建表
class Tasks extends Table {IntColumn get id => integer().autoIncrement()();TextColumn get name => text().withLength(min: 1, max: 50)();DateTimeColumn get dueData => dateTime().nullable()();BoolColumn get completed => boolean().withDefault(const Constant(false))();
}@UseMoor(tables: [Tasks])
class AppDatabase extends _$AppDatabase {AppDatabase(): super(FlutterQueryExecutor.inDatabaseFolder(path: 'db.sqlite'));@overrideint get schemaVersion => 1;Future<List<Task>> get getAllTasks => select(tasks).get();/// 每当基础数据发生变化时,都会发出新项Stream<List<Task>> watchAllTasks() => select(tasks).watch();/// 插入一条数据Future<int> insertTask({String name,DateTime dueData,}) =>into(tasks).insert(TasksCompanion(name: Value(name),dueData: Value(dueData),),);/// 更新一条数据Future<bool> updateTask(Task task) => update(tasks).replace(task);/// 删除一条数据Future<int> deleteTask(Task task) => delete(tasks).delete(task);
}

lib\store\main\main.store.dart

import 'package:flutter_moor_demo/db/moor.db.dart';class MainStore {final dbService = DBService();
}class DBService {final database = AppDatabase();Stream<List<Task>> get tasks$ =>database.watchAllTasks().map((List<Task> tasks) {/// 排序,把完成的排在后面tasks.sort((a, b) => _getInt(a.completed).compareTo(_getInt(b.completed)),);return tasks;});int _getInt(bool b) {return b ? 1 : 0;}
}final MainStore mainStore = MainStore();

lib\main.dart

import 'package:flutter/material.dart';
import 'package:flutter_moor_demo/store/main/main.store.dart';import 'db/moor.db.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(home: HomePage(),);}
}class HomePage extends StatefulWidget {@override_HomePageState createState() => _HomePageState();
}class _HomePageState extends State<HomePage> {DateTime newTaskDate;TextEditingController controller;@overridevoid initState() {super.initState();controller = TextEditingController();}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Tasks'),),body: Column(children: <Widget>[Expanded(child: StreamBuilder<List<Task>>(stream: mainStore.dbService.tasks$,initialData: List<Task>(),builder: (context, snap) {if (snap.connectionState == ConnectionState.active) {List<Task> tasks = snap.data;if (tasks.isEmpty) return Center(child: Text('Not Data'));return ListView.builder(itemCount: tasks.length + 1,itemBuilder: (context, int index) {if (index == 0) {return Padding(padding: const EdgeInsets.all(8.0),child: Center(child: Text('taskS #${tasks.length}')),);}final task = tasks[index - 1];return Dismissible(key: ValueKey(task.id),background: Container(color: Colors.red),onDismissed: (DismissDirection d) {mainStore.dbService.database.deleteTask(task);},child: CheckboxListTile(title: Text(task.name),subtitle: Text(task.dueData?.toString() ?? 'No date'),value: task.completed,onChanged: (bool nv) {mainStore.dbService.database.updateTask(task.copyWith(completed: nv));},),);},);} else if (snap.connectionState == ConnectionState.waiting) {return Center(child: CircularProgressIndicator());} else {return SizedBox();}},),),ListTile(title: TextField(controller: controller,decoration: InputDecoration(hintText: 'Task Name'),onSubmitted: (String v) {mainStore.dbService.database.insertTask(name: v.trim(),dueData: newTaskDate,);_reset();},),trailing: IconButton(icon: Icon(Icons.calendar_today),onPressed: () async {DateTime now = DateTime.now();Duration d = Duration(days: 10);newTaskDate = await showDatePicker(context: context,initialDate: now,firstDate: now.subtract(d),lastDate: now.add(d));},),)],),);}void _reset() {setState(() {controller.clear();newTaskDate = null;});}
}

1053296-20190730150836909-952516171.png

转载于:https://www.cnblogs.com/ajanuw/p/11270204.html

这篇关于Flutter: moor_flutter库,简化sqlite操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/241294

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE