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>();
        }

        // 获取所有 TodoItem
        public async Task<List<TodoItem>> GetItemsAsync()
        {
            await Init();
            return await Database.Table<TodoItem>().ToListAsync();
        }

        // 获取所有未完成的 TodoItem
        public 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 获取 TodoItem
        public async Task<TodoItem> GetItemAsync(int id)
        {
            await Init();
            return await Database.Table<TodoItem>().Where(i => i.ID == id).FirstOrDefaultAsync();
        }

        // 保存或更新 TodoItem
        public async Task<int> SaveItemAsync(TodoItem item)
        {
            await Init();
            if (item.ID != 0)
            {
                return await Database.UpdateAsync(item);
            }
            else
            {
                return await Database.InsertAsync(item);
            }
        }

        // 删除 TodoItem
        public 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" ?>
<ContentPage
    x: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">
        <CollectionView
            ItemsSource="{Binding Items}"
            SelectionChanged="CollectionView_SelectionChanged"
            SelectionMode="Single"
            VerticalOptions="Fill">
            <CollectionView.ItemTemplate>
                <DataTemplate x:DataType="models:TodoItem">
                    <Grid
                        Padding="20"
                        ColumnDefinitions="*, Auto"
                        RowDefinitions="Auto">
                        <Label Text="{Binding Name}" VerticalTextAlignment="Center" />
                        <Label
                            Grid.Column="1"
                            IsVisible="{Binding Done}"
                            Text="✔️"
                            VerticalTextAlignment="Center" />
                    </Grid>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
        <Button
            Grid.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 传递选中的 TodoItem
            await 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 获取 TodoItem
            set => 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("..");
        }
    }
}

下载代码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java:TCP 通信方法(基本发送 + 接收)并 实现文件传输且反馈

TCP 通信编程 TCP:是一种可靠的网络协议&#xff0c;再通信两端都建立一个Socket对象。 通信之前要保证连接已经建立。 通过Socket产生IO流进行通信。 创建对象时&#xff0c;会连接服务器&#xff0c;连接不上&#xff0c;会报错。 所以&#xff0c;先运行服务端&#xff0c;再…

Triton算法服务部署:初识与试用【Hello world】

0. 写在前面 Triton Inference Server 是一款开源推理服务软件&#xff0c;可简化 AI 推理。其可以部署来自多个深度学习和机器学习框架的任何 AI 模型&#xff0c;包括 TensorRT、TensorFlow、PyTorch、ONNX、OpenVINO、Python、RAPIDS FIL 等。Triton 支持在 NVIDIA GPU、x8…

【C++】哈希表

文章目录 哈希概念哈希冲突哈希函数哈希表闭散列开散列 开散列与闭散列比较 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 哈希概念 顺…

微服务项目部署

启动rabbitmq \RabbitMQ\rabbitmq_server-3.8.2\sbin 找到你的安装路径 找到\sbin路径下执行这些命令即可 rabbitmqctl status //查看当前状态 rabbitmq-plugins enable rabbitmq_management //开启Web插件 rabbitmq-server start //启动服务 rabbitmq-server stop //停止服务…

不需要联网的ocr项目

地址 GitHub - plantree/ocr-pwa: A simple PWA for OCR, based on Tesseract. 协议 mit 界面 推荐理由 可以离线使用&#xff0c;隐私安全

python自动化测试实战 —— 自动化测试框架的实例

软件测试专栏 感兴趣可看&#xff1a;软件测试专栏 自动化测试学习部分源码 python自动化测试相关知识&#xff1a; 【如何学习Python自动化测试】—— 自动化测试环境搭建 【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更…

【XR806开发板试用】基于FreeRTOS的SoftAp配网实现

1.环境搭建 由于电脑上之前就有开发其他设备用的ubuntu18.06虚拟机环境&#xff0c;就在此环境基础上进行开发。基本环境搭建参考官方文档进行&#xff1a; 全志XR806开发板开发环境搭建 2.功能实现 2.1设计思路 从官方下载的SDK开发包project/example目录下有基本功能实现…

扫盲运动—字节序

1 大端、小端字节序 术语“大端”和“小端”表示多个字节值的哪一端&#xff08;小端或大端&#xff09;存储在该值的起始地址。 大端&#xff1a;将高序字节存储在起始地址&#xff0c;这称为大端&#xff08;big-endian&#xff09;字节序小端&#xff1a;将低序字节存储在…

03-详解Nacos注册中心的配置步骤和功能

Nacos注册中心 服务注册到Nacos Nacos是SpringCloudAlibaba的组件也遵循SpringCloud中定义的服务注册和服务发现规范,因此使用Nacos与使用Eureka对于微服务来说并没有太大区别 主要差异就是依赖不同,服务地址不同 第一步: 在父工程cloud-demo模块的pom.xml文件中引入Spring…

现代信号处理实验:MATLAB实现LD算法进行AR估计

MATLAB实现LD算法进行AR估计 利用给定的一组样本数据估计一个平稳随机信号的功率谱密度称为功率谱估计&#xff0c;又称谱估计。谱估计的方法可以分成经典谱估计和现代谱估计。 经典谱估计又称为非参数化的谱估计&#xff0c;分为直接法和间接法。直接法是指直接计算样本数据…

C# WPF上位机开发(增强版绘图软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们写过一个绘图软件&#xff0c;不过那个比较简单&#xff0c;主要就是用鼠标模拟pen进行绘图。实际应用中&#xff0c;另外一种使用比较多的…

MySQL笔记-第18章_MySQL8其它新特性

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第18章_MySQL8其它新特性1. MySQL8新特性概述1.1 MySQL8.0 新增特性1.2 MySQL8.0移除的旧特性 2. 新特性1&#xff1a;窗口函数2.1 使用窗口…

最新鸿蒙HarmonyOS4.0开发登陆的界面1

下载deveco-studio 说明一下&#xff0c;本人只是学习中&#xff0c;现在只是拿着vue及uniapp的经验在一点一点的折腾&#xff0c;不过现在看来&#xff0c;鸿蒙入门并不是很难。也许是自己没有深入下去。 https://developer.harmonyos.com/cn/develop/deveco-studio#download…

谈谈常用的分布式ID的设计方案?

典型回答 首先&#xff0c;我们需要明确通常的分布式ID定义&#xff0c;基本的要求包括&#xff1a; 全局唯一&#xff0c;区别于单点系统的唯一&#xff0c;全局是要求分布式系统内唯一。 有序性&#xff0c;通常都需要保证生成的ID是有序递增的。例如&#xff0c;在数据库存…

循环神经网络-RNN记忆能力实验 [HBU]

目录 一、循环神经网络 二、循环神经网络的记忆能力实验 三、数据集构建 数据集的构建函数 加载数据并进行数据划分 构造Dataset类 四、模型构建 嵌入层 SRN层 五、模型训练 训练指定长度的数字预测模型 多组训练 损失曲线展示 六、模型评价 参考《神经网络与深度…

SpringCloud系列(一)| SpringCloud简介

上个系列中&#xff0c;我们已经介绍完了SpringBoot的用法&#xff0c;简单概述 springBoot Spring X, 就是对于Spring和其他技术的融合 进行了简化开发&#xff0c;所以x可以代表任何技术&#xff0c;比如 mybtis, mybatisPlus, redis.... 对于集成这些常用框架&#xff0c;…

SpringBoot之请求的详细解析

1. 请求 在本章节呢&#xff0c;我们主要讲解&#xff0c;如何接收页面传递过来的请求数据。 1.1 Postman 之前我们课程中有提到当前最为主流的开发模式&#xff1a;前后端分离 在这种模式下&#xff0c;前端技术人员基于"接口文档"&#xff0c;开发前端程序&…

电流测量原理

由于直接测量电流信号是很难的&#xff0c;但是测试电压信号比较容易&#xff0c;因此通常都是先将电流信号转换为电压信号&#xff0c;将电压信号进行调理后送至 CPU&#xff0c;CPU 通过 AD 转换得到一个码值&#xff0c;软件读出该码值&#xff0c;先根据主控的硬件设计参数…

【送书活动】探究AIGC、AGI、GPT和人工智能大模型

文章目录 前言01 《ChatGPT 驱动软件开发》推荐语 02 《ChatGPT原理与实战》推荐语 03 《神经网络与深度学习》推荐语 04 《AIGC重塑教育》推荐语 05 《通用人工智能》推荐语 后记赠书活动 前言 人工智能技术在过去几年中发展迅猛&#xff0c;得益于大数据、云计算、深度学习等…

爬虫 scrapy (十一)

目录 一、scrapy shell 1.什么是scrapy shell&#xff1f; 2.安装 ipython 3.使用scrapy shell 二、当当网案例 1.在items.py中定义数据结构 2.在dang.py中解析数据 3.使用pipeline保存 4.多条管道的使用 5.多页下载 参考 一、scrapy shell 1.什么是scrapy shell&am…