maui下sqlite演示增删改查

数据操作类 有分页

todoitemDatabase.cs:

using SQLite;
using TodoSQLite.Models;namespace TodoSQLite.Data
{public class TodoItemDatabase{SQLiteAsyncConnection Database;public TodoItemDatabase(){}// 初始化数据库连接和表async Task Init(){if (Database is not null)return;// 创建数据库连接并创建 TodoItem 表Database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);var result = await Database.CreateTableAsync<TodoItem>();}// 获取所有 TodoItempublic async Task<List<TodoItem>> GetItemsAsync(){await Init();return await Database.Table<TodoItem>().ToListAsync();}// 获取所有未完成的 TodoItempublic async Task<List<TodoItem>> GetItemsNotDoneAsync(){await Init();return await Database.Table<TodoItem>().Where(t => t.Done).ToListAsync();}// 获取分页的 TodoItem 和总记录数public async Task<(List<TodoItem> items, int totalCount)> GetItemsPageAsync(int pageNumber, int pageSize){await Init();var items = await Database.Table<TodoItem>().Skip((pageNumber - 1) * pageSize).Take(pageSize).ToListAsync();var totalCount = await Database.Table<TodoItem>().CountAsync(); // 获取总记录数return (items, totalCount);}// 获取分页的未完成 TodoItem 和总记录数public async Task<(List<TodoItem> items, int totalCount)> GetItemsNotDonePageAsync(int pageNumber, int pageSize){await Init();var items = await Database.Table<TodoItem>().Where(t => t.Done).Skip((pageNumber - 1) * pageSize).Take(pageSize).ToListAsync();var totalCount = await Database.Table<TodoItem>().Where(t => t.Done).CountAsync(); // 获取总记录数return (items, totalCount);}// 根据 ID 获取 TodoItempublic async Task<TodoItem> GetItemAsync(int id){await Init();return await Database.Table<TodoItem>().Where(i => i.ID == id).FirstOrDefaultAsync();}// 保存或更新 TodoItempublic async Task<int> SaveItemAsync(TodoItem item){await Init();if (item.ID != 0){return await Database.UpdateAsync(item);}else{return await Database.InsertAsync(item);}}// 删除 TodoItempublic async Task<int> DeleteItemAsync(TodoItem item){await Init();return await Database.DeleteAsync(item);}}
}

TodoItem.cs 相当于实体类

using SQLite;namespace TodoSQLite.Models;public class TodoItem
{[PrimaryKey, AutoIncrement]public int ID { get; set; }//主键public string Name { get; set; }//任务名public string Notes { get; set; }//备注public bool Done { get; set; }//完成否}

##界面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
任务例表界面代码:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPagex:Class="TodoSQLite.Views.TodoListPage"xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:ios="clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;assembly=Microsoft.Maui.Controls"xmlns:models="clr-namespace:TodoSQLite.Models"Title="任务"ios:Page.UseSafeArea="True"><Grid RowDefinitions="*,Auto"><CollectionViewItemsSource="{Binding Items}"SelectionChanged="CollectionView_SelectionChanged"SelectionMode="Single"VerticalOptions="Fill"><CollectionView.ItemTemplate><DataTemplate x:DataType="models:TodoItem"><GridPadding="20"ColumnDefinitions="*, Auto"RowDefinitions="Auto"><Label Text="{Binding Name}" VerticalTextAlignment="Center" /><LabelGrid.Column="1"IsVisible="{Binding Done}"Text="✔️"VerticalTextAlignment="Center" /></Grid></DataTemplate></CollectionView.ItemTemplate></CollectionView><ButtonGrid.Row="1"Margin="20"Clicked="OnItemAdded"Text="增加" /></Grid>
</ContentPage>

对应的C#

using System.Collections.ObjectModel;
using TodoSQLite.Data;
using TodoSQLite.Models;namespace TodoSQLite.Views
{public partial class TodoListPage : ContentPage{public ObservableCollection<TodoItem> Items { get; set; } = new();private int pageNumber = 1; // 默认页码private int pageSize = 10; // 默认页面大小TodoItemDatabase database;public TodoListPage(TodoItemDatabase todoItemDatabase){InitializeComponent();database = todoItemDatabase;BindingContext = this;}// 当页面导航到前台时触发protected override async void OnNavigatedTo(NavigatedToEventArgs args){base.OnNavigatedTo(args);// 获取所有 TodoItem 并刷新界面var items = await database.GetItemsAsync();MainThread.BeginInvokeOnMainThread(() =>{Items.Clear();foreach (var item in items)Items.Add(item);});}// 加载分页数据private async void LoadData(){var (items, _) = await database.GetItemsPageAsync(pageNumber, pageSize);MainThread.BeginInvokeOnMainThread(() =>{Items.Clear();foreach (var item in items)Items.Add(item);});}// 加载分页的未完成数据private async void LoadDataNotDone(){var (items, _) = await database.GetItemsNotDonePageAsync(pageNumber, pageSize);MainThread.BeginInvokeOnMainThread(() =>{Items.Clear();foreach (var item in items)Items.Add(item);});}// 点击上一页按钮时触发的事件处理private void OnPreviousPageClicked(object sender, EventArgs e){if (pageNumber > 1){pageNumber--;LoadData();}}// 点击下一页按钮时触发的事件处理private void OnNextPageClicked(object sender, EventArgs e){pageNumber++;LoadData();}// 点击添加按钮时触发的事件处理async void OnItemAdded(object sender, EventArgs e){await Shell.Current.GoToAsync(nameof(TodoItemPage), true, new Dictionary<string, object>{["Item"] = new TodoItem()});}// 列表项选择变更时触发的事件处理private async void CollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e){if (e.CurrentSelection.FirstOrDefault() is not TodoItem item)return;// 导航到 TodoItemPage 传递选中的 TodoItemawait Shell.Current.GoToAsync(nameof(TodoItemPage), true, new Dictionary<string, object>{["Item"] = item});}}
}

详情 页:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="TodoSQLite.Views.TodoItemPage"Title="{Binding Name}"xmlns:models="clr-namespace:TodoSQLite.Models"x:DataType="models:TodoItem"><ScrollView><VerticalStackLayout Padding="20"Spacing="10"VerticalOptions="StartAndExpand"><Label Text="任务名" /><Entry Text="{Binding Name}" /><Label Text="备注" /><Entry Text="{Binding Notes}" /><Label Text="完成" /><Switch IsToggled="{Binding Done}" /><Button Text="保存"Clicked="OnSaveClicked" /><Button Text="删除"Clicked="OnDeleteClicked" /><Button Text="取消"Clicked="OnCancelClicked" /></VerticalStackLayout></ScrollView>
</ContentPage>

C#

using TodoSQLite.Data;
using TodoSQLite.Models;namespace TodoSQLite.Views
{[QueryProperty("Item", "Item")] // 通过 URI 查询参数传递 TodoItem 实例public partial class TodoItemPage : ContentPage{public TodoItem Item{get => BindingContext as TodoItem; // 使用 BindingContext 获取 TodoItemset => BindingContext = value; // 设置 BindingContext 以更新页面数据绑定}TodoItemDatabase database;public TodoItemPage(TodoItemDatabase todoItemDatabase){InitializeComponent();database = todoItemDatabase;}// 点击保存按钮时触发的事件处理async void OnSaveClicked(object sender, EventArgs e){if (string.IsNullOrWhiteSpace(Item.Name)){await DisplayAlert("任务名", "请增加任务名", "OK");return;}// 保存或更新 TodoItem 数据await database.SaveItemAsync(Item);// 返回上一页await Shell.Current.GoToAsync("..");}// 点击删除按钮时触发的事件处理async void OnDeleteClicked(object sender, EventArgs e){// 如果 TodoItem 的 ID 为 0,表示未保存到数据库,直接返回if (Item.ID == 0)return;// 删除 TodoItem 数据await database.DeleteItemAsync(Item);// 返回上一页await Shell.Current.GoToAsync("..");}// 点击取消按钮时触发的事件处理async void OnCancelClicked(object sender, EventArgs e){// 返回上一页await Shell.Current.GoToAsync("..");}}
}

下载代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

积雪深度智能化监测JL-29 雪深监测仪

积雪深度智能化监测JL-29 雪深监测仪产品简介 该设备通过安装于固定高度的可视激光探测传感器采用相位差式测量方法对雪深数据连续在线监测。同时&#xff0c;根据长期使用情况需要&#xff0c;提供连续准确的数据支持。可在无人值守的恶劣环境下全自动正常运行&#xff0c;并…

PPT插件-好用的插件-字距快速设置-大珩助手

字距快速设置 包含两端对齐、段首缩进、取消缩进、字间距、行间距、段后距 段首缩进 每次缩进两个字符&#xff0c;可对选中的文字、选中的多个文本对象两个层级操作 取消缩进 将缩进取消&#xff0c;可对选中的文字、选中的多个文本对象两个层级操作 字间距 预设了常用…

【GlobalMapper精品教程】065:连接SQL Server空间数据库并加载数据

Global Mapper是一个地图创建和编辑工具,无法像ArcGIS一样,基于SQL Server等大型关系型数据库。它本身也并不直接连接数据库。但是,Global Mapper可以与其他软件集成,以从数据库中获取数据并在地图上显示。本文讲述Global Mapper连接SLQ Server数据库的方法。 一、创建数据…

深入理解 Goroutines 和 Go Scheduler

本文将重点帮助您了解 Golang 中的 goroutines。Go 调度程序如何工作以在 Go 中实现最佳并发性能。我会尽力用简单的语言解释,这样你就可以理解了。 我们将介绍什么是操作系统中的线程和进程,什么是并发,为什么实现并发很难,以及 goroutines 如何帮助我们实现并发。然后,…

AtCoder ABC周赛2023 12/10 (Sun) D题题解

目录 原题截图&#xff1a; 题目大意&#xff1a; 主要思路&#xff1a; 注&#xff1a; 代码&#xff1a; 原题截图&#xff1a; 题目大意&#xff1a; 给定两个 的矩阵 和 。 你每次可以交换矩阵 的相邻两行中的所有元素或是交换两列中的所有元素。 请问要使 变换至…

JVM虚拟机系统性学习-垃圾回收器Serial、ParNew、Parallel Scavenge和Parallel Old

垃圾回收器 有 8 种垃圾回收器&#xff0c;分别用于不同分代的垃圾回收&#xff1a; 新生代回收器&#xff1a;Serial、ParNew、Parallel Scavenge老年代回收器&#xff1a;Serial Old、Parallel Old、CMS整堆回收器&#xff1a;G1、ZGC Serial&#xff1a;串行回收 Serial是…

RT-DETR改进策略:双动态令牌混合器(D-Mixer)的TransXNet,实现RT-DETR的有效涨点

摘要 双动态令牌混合器(D-Mixer),一种输入依赖的方式聚合全局信息和局部细节。D-Mixer通过分别在均匀分割的特征片段上应用有效的全局注意力模块和输入依赖的深度卷积,使网络具有强大的归纳偏差和扩大的有效感受野。使用D-Mixer作为基本构建块设计了TransXNet,这是一种新…

Unity中实现ShaderToy卡通火(总结篇)

文章目录 前言一、把卡通火修改为后处理效果1、在Shader属性面板定义属性接收帧缓存纹理2、在片元着色器对其纹理采样后&#xff0c;与卡通火相加输出请添加图片描述 二、我们自定义卡通火1、修改 _CUTOFF 使卡通火显示在屏幕两侧2、使火附近屏幕偏红色 前言 在之前的文章中&a…

【IC验证】perl脚本——分析前/后仿用例回归情况

目录 1 脚本名称 2 脚本使用说明 3 nocare_list文件示例 4 脚本执行方法 5 postsim_result.log文件示例 6 脚本代码 1 脚本名称 post_analysis 2 脚本使用说明 help&#xff1a;打印脚本说明信息 命令&#xff1a;post_analysis help 前/后仿结束后&#xff0c;首先填…

计算机毕业设计 SpringBoot的企业内管信息化系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

首场“解数Talk” 直播来了——大模型语料数据联盟开源数据集解读

一、解数 Talk 介绍 为帮助广大开发者更好地了解大模型语料数据联盟发布的AI大模型语料数据&#xff0c;沟通大模型企业在AI视角下的数据需求&#xff0c;不断服务大模型产业生态和落地应用&#xff0c;联盟发起单位上海人工智能实验室联合成员单位共同打造“解数 Talk”系列直…

java系列-LinkedHashMap怎么实现LRU

1.定义变量accessOrder public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {final boolean accessOrder;public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {super(initialCapacity, loadFactor…

《地理信息系统原理》笔记/期末复习资料(9. 网络地理信息系统)

目录 9. 网络地理信息系统 9.1. 概述 9.1.1. 网络GIS概念 9.1.2. 网络GIS体系结构 9.1.3. 网络GIS内容体系 9.2. 分布式网络GIS 9.2.1. 分布式网络GIS概念 9.2.2. 分布式主要技术 9.3. WebGIS 9.3.1. WebGIS概念 9.3.2. WebGIS分类与特点 9.3.3. WebGIS技术框架 9…

自建 SMTP 邮件发送服务

搭建自己的 SMTP 邮件发送服务器 序言 SMTP 可以直接购买云厂商的服务&#xff0c;比如 : Amazon SES SMTP 阿里云邮件推送 也可以自己搭建邮件服务器 —— 发送不限量&#xff0c;综合成本低。 下面&#xff0c;我们一步一步的演示如何自建邮件服务器。 服务器选购 自托管的…

(C)一些题12

1&#xff0e;若指针 p 已正确定义&#xff0c;要使 p 指向两个连续的整型动态存储单元&#xff0c;不正确的语是 A ) p 2*( int *) malloc ( sizeof ( int )); B ) p ( int *) malloc (2* sizeof ( int )); C ) p ( int *) malloc (4*2); D ) p ( int ") calloc (2…

飞天使-docker知识点2-dockerfile构建镜像

文章目录 dockerfile 简介dockerfile 构建实例1dockerfile 直接构建nginx 本地镜像docke tag dockerfile 简介 DockerFile 可以说是一种可以被 Docker 程序解释的脚本&#xff0c;DockerFile 是由一条条的命令组成的&#xff0c;每条命令对应 linux 下面的一条命令&#xff0c…

SimCLR损失函数详解

图片来源&#xff1a;Self-Supervised Learning 超详细解读 (二)&#xff1a;SimCLR系列 文章目录 1. 数据增强2. 获得图片表征3. 正样本和负样本构建4. 计算相似度5. 计算图片之间相似的概率6. 损失函数为什么需要大规模的batchsize&#xff1f; 1. 数据增强 有一批batchsize…

LeetCode-旋转链表问题

1.旋转链表 题目描述&#xff1a; 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 思路&#xff1a; 这里向右移动k个位置&#xff0c;相当于从链表的倒数第k个节点处断开&#xff0c;之后再将断开的两个子链表按照相反顺序…

centos日常运维随记

# 需要生成随机字符及数字 rootAAA:~# echo $RANDOM | md5sum |cut -c 3-29 e7e8942a791146531f613c7c757 # echo $RANDOM 产生随机数据 # md5sum 随机数生成md5值 # cut -c 3-29 :md5产生的是32的md5数&#xff0c;使用cut -c 对这个数进行 第3位到第29位的截取# 在现有的…

【数据结构和算法】--队列

目录 队列的概念及结构队列的实现初始化入队出队其他一些队列函数 小结队列相关题目 队列的概念及结构 队列是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 的原则。 入队列&#xf…