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.rhkb.cn/news/216057.html

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

相关文章

【MySQL】:数据类型

数据类型 一.数值类型1.整数1.tinyint2.bit类型 2.浮点类型1.float2.decimal 二.字符串类型1.char类型2.varchar类型3.char和varchar的区别4.日期和时间类型5.enum和set 三.集合查询 一.数值类型 1.整数 1.tinyint 正常插入 越界插入 如果我们向mysql特定的类型中插入不合法的…

三天精通Selenium Web 自动化 - Selenium(Java)环境搭建 (new)

0 背景 开发工具idea代码管理mavenjdk1.8webdriver chrome 1 chromedriver & chrome chromedriver和chrome要对应上&#xff1a; chomedriver下载地址&#xff1a;淘宝镜像 这里用的是 chromedriver88-0-4324-96.zipchrome下载地址&#xff1a;如何降级和安装旧版本的C…

环境安全之配置管理及配置安全设置指导

一、前言 IT运维过程中&#xff0c;配置的变更和管理是一件非常重要且必要的事&#xff0c;除了一般宏观层面的配置管理&#xff0c;还有应用配置参数的配置优化&#xff0c;本文手机整理常用应用组件配置项配置&#xff0c;尤其安全层面&#xff0c;以提供安全加固指导实践。…

MySQL之创建时间类型的字段表

mysql之创建时间类型的字段表 CREATE TABLE tab(birthday DATE, -- 生日job_time DATETIME, -- 记录年月日时分秒login_time TIMESTAMP -- 时间戳NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP )解释&#xff1a; NOT NULL DEFAULT &#xff1a;默认不为空…

HarmonyOS首次尝试-HelloWorld

我的旧手机是个HUAWEI PCT-AL10 HarmonyOS 3.0.0(Android 10) 插上后&#xff0c;studio能显示连接上了手机设备&#xff0c;创建的demo使用的是API9&#xff0c;也就是当前的最新版本。 点击运行报错&#xff1a; 点击去往帮助页&#xff0c;做的也挺好&#xff0c;有直达的…

PPT制作的几个注意事项

PPT制作的几个注意事项 字数不可过多字体大小字体颜色排版问题PPT篇末致谢什么是好的PPT关于演讲不要念PPT说话时面向观众。讲话的时候抖腿其他 事先声明&#xff1a; 以下展示的PPT就PPT制作技巧而言&#xff0c;与其内容无关。 字数不可过多 做PPT最忌讳的就是满篇全是文字&…

【教程】制作 iOS 推送证书

​ 目录 证书类型 MAC Key Store 消息推送控制台 制作证书 创建苹果 App ID 使用appuploder制作 .p12文件 创建证书 如需向 iOS 设备推送数据&#xff0c;您首先需要在消息推送控制台上配置 iOS 推送证书。iOS 推送证书用于推送通知&#xff0c;本文将介绍消息推送服务支…

西南交通大学【数据结构实验8】

实验内容及要求&#xff1a; 编写控制台应用程序&#xff0c;提供以下菜单项&#xff1a; 插入元素 从键盘输入若干两两互不相同的非0整数&#xff0c;直到输入0时停止。将输入的所有非0整数按输入次序插入二叉排序树(初始时是空树)。 插入某个非0整数时&#xff0c;若该整…

Python从入门到精通九:Python异常、模块与包

了解异常 什么是异常 当检测到一个错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的“异常”, 也就是我们常说的BUG bug单词的诞生 早期计算机采用大量继电器工作&#xff0c;马克二型计算机就是这样的。 19…

matlab 最小二乘拟合平面(拉格朗日乘子法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。博客长期更新,爬虫自重。 一、算法原理 设拟合出的平面方程为: a x + b y &#

各地加速“双碳”落地,数字能源供应商怎么选?

作者 | 曾响铃 文 | 响铃说 随着我国力争2030年前实现“碳达峰”、2060年前实现“碳中和”的“双碳”目标提出&#xff0c;为各地区、各行业的低碳转型和绿色可持续发展制定“倒计时”时间表&#xff0c;一场围绕“数字能源”、“智慧能源”、“新能源”等关键词的创新探索进…

HTML---列表.表格.媒体元素

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.列表 无序列表 HTML中的无序列表&#xff08;Unordered List&#xff09;用于显示一组项目&#xff0c;每个项目之前没有特定的顺序或编号。无序列表使用<ul>标签来定义&#xff0c;每…

Pearson、Spearman 相关性分析使用

介绍 Pearson 积差相关系数衡量了两个定量变量之间的线性相关程度。 用来衡量两个数据集的线性相关程度&#xff0c;仅当一个变量的变化与另一个变量的比例变化相关时&#xff0c;关系才是线性的。 Spearman等级相关系数则衡量分级定序变量之间的相关程度。斯皮尔曼相关系数不…

GEE:重分类

作者:CSDN @ _养乐多_ 本文记录了在 Google Earth Engine(GEE)平台上对一副类别图像进行重分类的代码。并以 COPERNICUS/Landcover/100m/Proba-V-C3/Global 数据集中的土地利用数据为例。 结果如下图所示, 文章目录 一、核心函数二、示例代码三、代码链接一、核心函数 核…

2-Spring

2-Spring 文章目录 2-Spring项目源码地址Spring概述Spring特点&#xff08;优点&#xff09;Spring相关学习网站基于Maven的Spring框架导入Spring的组成及拓展 Spring-IOC--原型理解IOC-原型--示例开发示例-常规开发示例-Set函数&#xff08;IOC原型&#xff09;开发示例-对比思…

HTML实现页面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>工商银行电子汇款单</title> </head> &…

Windows使用selenium操作浏览器爬虫

以前的大部分程序都是操作Chrome&#xff0c;很少有操作Edge&#xff0c;现在以Edge为例。 Selenium本身是无法直接控制浏览器的&#xff0c;不同的浏览器需要不同的驱动程序&#xff0c;Google Chrome需要安装ChromeDriver、Edge需要安装Microsoft Edge WebDriver&#xff0c…

聚观早报 |一加12首销;华为智能手表释放科技温暖

【聚观365】12月12日消息 一加12首销 华为智能手表释放科技温暖 卡尔动力获地平线战略投资 英伟达希望在越南建立基地 努比亚Z60 Ultra影像规格揭晓 一加12首销 现在有最新消息&#xff0c;近日一加12该机已于昨日开售&#xff0c;售价4299元起。 外观方面&#xff0c;全…

源码角度简单介绍LinkedList

LinkedList是一种常见的数据结构&#xff0c;但是大多数开发者并不了解其底层实现原理&#xff0c;以至于存在很多误解&#xff0c;在这篇文章中&#xff0c;将带大家一块深入剖析LinkedList的源码&#xff0c;并为你揭露它们背后的真相。首先想几个问题&#xff0c;例如&#…

【启扬方案】启扬储能管理平板助力储能电站实现智能且高效化运行

在储能领域&#xff0c;储能电站扮演着重要角色&#xff0c;储能电站技术的应用贯穿于电力系统发电、输电、配电、用电的各个环节。实现电力系统削峰填谷、可再生能源发电波动平滑与跟踪计划处理、高效系统调频&#xff0c;增加供电的可靠性。 但随着储能电⼒系统建设发展得越来…