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

相关文章

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解