maui下sqlite演示增删改查

数据操作类 有分页

todoitemDatabase.cs:

csharp 复制代码
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 相当于实体类

csharp 复制代码
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 复制代码
<?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#

csharp 复制代码
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 复制代码
<?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#

xml 复制代码
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("..");
        }
    }
}

下载代码

相关推荐
了一li1 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
码农君莫笑1 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
别致的影分身2 小时前
使用C语言连接MySQL
数据库·mysql
东阳马生架构2 小时前
JVM简介—3.JVM的执行子系统
jvm
京东零售技术3 小时前
“慢”增长时代的企业数据体系建设:超越数据中台
数据库
sdaxue.com4 小时前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
o(╥﹏╥)4 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
阿里嘎多学长5 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_5 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Sunyanhui15 小时前
牛客网 SQL36查找后排序
数据库·sql·mysql