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

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

JavaScript DOM操作与事件处理方法

《JavaScriptDOM操作与事件处理方法》本文通过一系列代码片段,详细介绍了如何使用JavaScript进行DOM操作、事件处理、属性操作、内容操作、尺寸和位置获取,以及实现简单的动画效果,涵... 目录前言1. 类名操作代码片段代码解析2. 属性操作代码片段代码解析3. 内容操作代码片段代码解析4.

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

Python使用asyncio实现异步操作的示例

《Python使用asyncio实现异步操作的示例》本文主要介绍了Python使用asyncio实现异步操作的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录1. 基础概念2. 实现异步 I/O 的步骤2.1 定义异步函数2.2 使用 await 等待异

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与