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.hqwc.cn/news/279326.html

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

相关文章

记录一下github深度学习的错误

1.[visdom]无法正常启动服务问题解决 在Anaconda命令窗口中&#xff1a; 使用python -m visdom.server启动visdom服务时&#xff0c;卡在&#xff1a; Checking for scripts. Downloading scripts, this may take a little while 无法下载和启动服务。 ERROR&#xff1a;由…

Python基础入门第四节,第五节课笔记

第四节 第一个条件语句 if 条件: 条件成立执行的代码1 条件成立执行的代码2 ...... else: 条件不成立执行的代码1 条件不成立执行的代码2 …… 代码如下: 身高 float(input("请输入您的身高(米):")) if 身高 >1.3:print(f您的身高是{身高},已经超过1.3米,您需…

图片变成动图如何操作?掌握这个办法就够了

生动有趣的gif动画图片是怎么制作的呢&#xff1f;其实&#xff0c;制作gif动图的方法很简单&#xff0c;无需下载任何软件&#xff0c;使用gif动图制作&#xff08;https://www.gif.cn/&#xff09;工具-GIF中文网。只需要上传jpg、png格式的图片&#xff0c;轻松一键就能在线…

Backtrader 文档学习-Quickstart

Backtrader 文档学习-Quickstart 0. 前言 backtrader&#xff0c;功能十分完善&#xff0c;有完整的使用文档&#xff0c;安装相对简单&#xff08;直接pip安装即可&#xff09;。 优点是运行速度快&#xff0c;支持pandas的矢量运算&#xff1b;支持参数自动寻优运算&#x…

C语言写的 mini版的 http 服务器 , 很详细

文章目录 效果展示整体架构流程技术细节完整代码 效果展示 例如&#xff1a;htpp://192.168.23.140/home.html -> 正确的请求格式 home.html 这个资源是放在我们服务器里面的 , 并不是随便访问的资源,当然我们可以放很多的资源进去. 整体架构流程 整个实现的流…

我 爱 你

我爱你 可是我不敢说 我怕我说了 你会离我而去 我不怕你离去 可是我怕你离开了我 再没有人像我这样爱你 现代人说&#xff1a;初中生的爱情是一起回家&#xff0c;高中生的爱情是一起吃饭&#xff0c;大学生的爱情是一起睡觉&#xff0c;结婚了的爱情是一起回家吃饭然后…

LT7911D是TYPE-C/DP或者EDP转2 PORT MIPI和LVDS加音频

1.概述&#xff1a; T7911D是一款高性能TYPE-C/DP/EDP转2 PORT MIPI或者LVDS的芯片&#xff0c;目前主要在AR/VR或者显示器上应用的很多&#xff0c;对于DP1.2输入&#xff0c;LT7911D可配置为1/2/4车道。自适应均衡化使其适用于长电缆应用&#xff0c;最大带宽可达21.6Gbps。…

FGSM、PGD、BIM对抗攻击算法实现

本篇文章是博主在AI、无人机、强化学习等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在AI学…

win10电脑字体大小怎么设置?介绍四种方法

在Win10操作系统中&#xff0c;字体大小的设置对于用户来说是一个非常重要的问题。合适的字体大小能够保护我们的视力&#xff0c;提高我们的工作效率。本文将介绍几种常用的方法来调整Win10电脑的字体大小&#xff0c;帮助用户轻松设置自己喜欢的字体大小。 方法一&#xff1…

【C++11特性篇】C++11中新增的initializer_list——初始化的小利器(2)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C11系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.探究std::initializer_list是什么…

让高清媒体无限畅享——Movist Pro for Mac推广文章

随着科技的迅猛发展&#xff0c;高清媒体已经成为我们日常生活中不可或缺的一部分。无论是观看电影、追剧、还是欣赏高清音乐视频&#xff0c;我们都希望能够获得最佳的视听体验。为了满足这一需求&#xff0c;我们向大家推荐一款强大的高清媒体播放器——Movist Pro for Mac。…

Redis新数据类型-Bitmaps

目录 Bitmaps 简介 命令 1. setbit (1) 格式 (2) 实例 2. getbit (1) 格式 (2) 实例 3. bitcount (1) 格式 (2) 实例 4. bitop (1) 格式 (2) 实例 我的其他博客 Bitmaps 简介 Bitmaps 是 Redis 的一种新数据类型&#xff0c;它是一种用于存储位信息的数据结构&…