You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Xamarin中无需ListView与PrimaryKey实现School类SQLite数据库的创建、更新及与XAML页面绑定

实现单条目School类与SQLite的绑定及增改操作

没问题,我帮你搞定这个单条目School类的SQLite存储和XAML页面绑定需求!因为School不需要主键且只存一条数据,我们的核心思路是:查询时取唯一记录,保存时存在则更新、不存在则插入,下面是具体实现代码:

一、封装数据库操作工具类

先写一个通用的数据库帮助类,把SQLite的操作封装起来,方便后续复用:

using SQLite;
using SchoolData.Models;
using System.Threading.Tasks;

namespace SchoolData.Helpers
{
    public class DatabaseHelper
    {
        private readonly SQLiteAsyncConnection _dbConnection;

        // 构造函数:初始化数据库连接并创建表
        public DatabaseHelper(string dbFilePath)
        {
            _dbConnection = new SQLiteAsyncConnection(dbFilePath);
            // 确保Student和School表都已创建(Student表你之前已经在用,这里顺带确认)
            _dbConnection.CreateTableAsync<Student>().Wait();
            _dbConnection.CreateTableAsync<School>().Wait();
        }

        // 获取唯一的School记录:没有则返回null
        public async Task<School> GetSingleSchoolAsync()
        {
            return await _dbConnection.Table<School>().FirstOrDefaultAsync();
        }

        // 保存School记录:存在则更新,不存在则插入
        public async Task<int> SaveSchoolAsync(School schoolData)
        {
            var existingSchool = await GetSingleSchoolAsync();
            if (existingSchool != null)
            {
                // 更新现有记录的所有字段
                existingSchool.SchoolName = schoolData.SchoolName;
                existingSchool.Address = schoolData.Address;
                existingSchool.Vision = schoolData.Vision;
                return await _dbConnection.UpdateAsync(existingSchool);
            }
            else
            {
                // 插入新记录
                return await _dbConnection.InsertAsync(schoolData);
            }
        }

        // 清空数据库中的School记录(配合Clear按钮可选使用)
        public async Task<int> DeleteSchoolAsync()
        {
            var existingSchool = await GetSingleSchoolAsync();
            return existingSchool != null ? await _dbConnection.DeleteAsync(existingSchool) : 0;
        }
    }
}

二、页面后台代码(绑定XAML+处理按钮事件)

接下来是你的XAML页面对应的C#后台代码(比如SchoolPage.xaml.cs),这里要处理数据绑定、页面加载、保存和清空逻辑:

using SchoolData.Helpers;
using SchoolData.Models;
using Xamarin.Forms;

namespace SchoolData.Views
{
    public partial class SchoolPage : ContentPage
    {
        private readonly DatabaseHelper _dbHelper;
        private School _currentSchool;

        public SchoolPage()
        {
            InitializeComponent();
            // 初始化数据库:获取平台专属的本地存储路径
            string dbPath = System.IO.Path.Combine(
                System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), 
                "SchoolDatabase.db3");
            _dbHelper = new DatabaseHelper(dbPath);
            // 页面加载时自动获取现有School数据并绑定到页面
            LoadSchoolData();
        }

        // 加载现有School数据到页面
        private async void LoadSchoolData()
        {
            _currentSchool = await _dbHelper.GetSingleSchoolAsync();
            // 如果数据库里没有记录,创建一个空的School对象用于绑定输入框
            if (_currentSchool == null)
            {
                _currentSchool = new School();
            }
            // 将School对象设为页面的BindingContext,让XAML的Entry自动绑定对应属性
            BindingContext = _currentSchool;
        }

        // 保存按钮点击事件
        private async void SaveClick(object sender, EventArgs e)
        {
            // 强制刷新绑定,确保输入框的最新值同步到_currentSchool对象
            BindingContext = null;
            BindingContext = _currentSchool;

            await _dbHelper.SaveSchoolAsync(_currentSchool);
            await DisplayAlert("提示", "学校信息已成功保存", "确定");
        }

        // 清空按钮点击事件
        private async void ClearClick(object sender, EventArgs e)
        {
            // 清空当前School对象的所有属性
            _currentSchool.SchoolName = string.Empty;
            _currentSchool.Address = string.Empty;
            _currentSchool.Vision = string.Empty;
            // 刷新绑定,让输入框显示空值
            BindingContext = _currentSchool;

            // 可选:如果需要同时清空数据库里的记录,取消下面两行注释
            // await _dbHelper.DeleteSchoolAsync();
            // await DisplayAlert("提示", "学校信息已清空", "确定");
        }
    }
}

三、关键细节说明

  • 双向绑定:XAML里的Entry默认是双向绑定,所以你在输入框里输入的内容会自动同步到_currentSchool对象的对应属性,不需要额外处理。
  • 单条目逻辑:SaveSchoolAsync方法会先检查数据库里是否已有School记录,有就更新,没有就插入,确保永远只有一条数据,满足你“单次输入”的需求。
  • 数据库路径:使用Environment.SpecialFolder.LocalApplicationData获取平台的本地存储路径,保证数据库文件在iOS、Android等平台都能正确创建和访问。
  • 清空逻辑:Clear按钮默认只清空页面输入框,如果需要同时删除数据库里的记录,取消DeleteSchoolAsync的注释即可。

内容的提问来源于stack exchange,提问作者anoa anoa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 03:47:36