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,一经查实,立即删除!

相关文章

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是…

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…

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;之后再将断开的两个子链表按照相反顺序…

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

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

持续集成交付CICD:通过API方式上传Nexus制品

目录 一、实验 1.通过API方式上传Nexus制品 二、问题 1.如何通过API方式上传PNG图片 2.如何通过API方式上传tar.gz 与 ZIP文件 3.如何通过API方式上传Jar file文件 4.如何通过API方式上传制品&#xff08;maven类型的制品&#xff09;文件 5.如何下载制品 一、实验 1.通…

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

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

【教程】Ipa Guard为iOS应用提供免费加密混淆方案

概述&#xff1a;使用ios加固工具对ios代码保护&#xff0c;保护ios项目中的核心代码&#xff0c; #ipagurd年终大促百厂联动暖冬特惠&#xff0c;超多软控件立享惊喜优惠>> ​ 简介 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可…

Leetcode—113.路径总和II【中等】

2023每日刷题&#xff08;五十七&#xff09; Leetcode—113.路径总和II 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …

使用 Taro 开发鸿蒙原生应用 —— 当 Taro 遇到纯血鸿蒙 | 京东云技术团队

纯血鸿蒙即将到来 在今年 8 月的「2023年华为开发者大会&#xff08;HDC.Together&#xff09;」上&#xff0c;华为正式官宣「鸿蒙Next」&#xff0c;这个更新的版本将移除所有的 AOSP 代码&#xff0c;彻底与 Android 切割&#xff0c;使其成为一个完全自主研发的操作系统&a…

数据挖掘目标(Kaggle Titanic 生存测试)

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns1.数据导入 In [2]: train_data pd.read_csv(r../老师文件/train.csv) test_data pd.read_csv(r../老师文件/test.csv) labels pd.read_csv(r../老师文件/label.csv)[Su…