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实现对阿里云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

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult