如何使用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
相关产品推荐
相关产品推荐

