You need to enable JavaScript to run this app. 如何使用SQL持久化存储列表数据,避免应用重启后列表重置
优惠活动
大模型
产品
解决方案
定价
更多

如何使用SQL持久化存储列表数据,避免应用重启后列表重置

实现方案

1. 安装依赖包

NuGet搜索安装 sqlite-net-pcl,这是轻量级SQLite ORM库,无需手动编写原生SQL语句。

2. 调整Model类,添加SQLite特性

using SQLite;

public class Energys
{
    // 设为主键、自动增长,无需手动赋值Id
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string EE { get; set; }
}

3. 封装数据库操作帮助类

using SQLite;
using System.IO;
using System.Collections.Generic;
using System.Threading.Tasks;

public static class EnergyDbHelper
{
    private static readonly SQLiteAsyncConnection _database;

    static EnergyDbHelper()
    {
        // 数据库文件存到应用本地沙箱目录,不同平台自动适配
        string dbPath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), 
            "EnergyRecords.db3");
        _database = new SQLiteAsyncConnection(dbPath);
        // 启动时自动创建表,已存在则跳过
        _database.CreateTableAsync<Energys>().Wait();
    }

    // 查询所有存储的能量数据
    public static async Task<List<Energys>> GetAllAsync()
    {
        return await _database.Table<Energys>().ToListAsync();
    }

    // 插入单条能量数据
    public static async Task<int> InsertAsync(Energys energy)
    {
        return await _database.InsertAsync(energy);
    }
}

4. 调整ViewModel逻辑

  • 新增和Entry绑定的输入属性,用来接收用户输入的内容
  • 构造函数中优先从数据库加载历史数据,无数据才初始化默认值
  • AddEnergy方法中新增条目后同步写入数据库
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;

class ViewModel : INotifyPropertyChanged
{
    // 和Entry输入框绑定的属性,接收用户输入
    private string _inputEE;
    public string InputEE
    {
        get => _inputEE;
        set
        {
            _inputEE = value;
            OnPropertyChanged();
        }
    }

    public ICommand AddEnergyCommand => new Command(AddEnergy);
    // 列表绑定的集合用ObservableCollection,自动响应数据变更
    public ObservableCollection<Energys> Energys { get; set; }

    public ViewModel()
    {
        Energys = new ObservableCollection<Energys>();
        // 构造时加载数据库中已存的数据
        LoadEnergyData();
    }

    private async void LoadEnergyData()
    {
        var allData = await EnergyDbHelper.GetAllAsync();
        if (allData.Count == 0)
        {
            // 数据库为空,初始化默认数据同时存入库
            var default1 = new Energys { EE = "6 MV" };
            var default2 = new Energys { EE = "10 MV" };
            Energys.Add(default1);
            Energys.Add(default2);
            await EnergyDbHelper.InsertAsync(default1);
            await EnergyDbHelper.InsertAsync(default2);
        }
        else
        {
            // 加载历史数据到集合
            foreach (var item in allData)
            {
                Energys.Add(item);
            }
        }
    }

    private async void AddEnergy()
    {
        if (string.IsNullOrWhiteSpace(InputEE)) return; // 空输入不处理
        var newEnergy = new Energys { EE = InputEE };
        // 加到UI集合
        Energys.Add(newEnergy);
        // 同步写入数据库
        await EnergyDbHelper.InsertAsync(newEnergy);
        // 可选:清空输入框
        InputEE = string.Empty;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

5. 前端绑定参考

把Entry的Text绑定到InputEE,保存按钮的Command绑定到AddEnergyCommand,列表的ItemsSource绑定到Energys即可。测试时新增数据后杀掉应用再打开,数据不会丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 00:39:00