在 Xamarin 的 SQLite 数据库中存储和检索数组
Posted
技术标签:
【中文标题】在 Xamarin 的 SQLite 数据库中存储和检索数组【英文标题】:Store & retrieve array in SQLite database in Xamarin 【发布时间】:2021-04-21 06:20:57 【问题描述】:我想在我的 Xamarin 应用程序的 SQLite 数据库中存储和检索数组。我正在关注这个Xamarin Tutorial on SQLite。
这些值随后将显示在 Picker 中。我之前使用模型来存储数组,然后获取值并将其列出在 Picker 中,它工作正常,但唯一的问题是它没有永久存储(通过关闭应用程序数组列表变空)。
银行
using SQLite;
namespace Mobile.App
public class Banks
[PrimaryKey, AutoIncrement]
public int ID get; set;
public string Name get; set;
public string Number get; set;
Database.cs
public class Database
readonly SQLiteAsyncConnection _database;
public Database(string dbPath)
_database = new SQLiteAsyncConnection(dbPath);
_database.CreateTableAsync<SQLiteBank>().Wait();
public Task<List<Banks>> GetBanksAsync(string name)
return _database.Table<Banks>().ToListAsync();
public Task<int> SaveBanksAsync(Banks bank)
return _database.InsertAsync(bank);
ViewModel.cs
在数据库中存储和检索数组列表。尝试将数组保存到数据库中时,出现错误:
无法将类型'string[]'隐式转换为'string'
尝试从数据库中检索数组时,出现错误:
无法从“System.Collections.Generic.List
”转换为“字符串”
// Array of Bank Name and Number
string[] Name = new string[] "Bank 1", "Bank 2", "Bank 3" ;
string[] Number = new string[] "000000", "111111", "222222" ;
// Save it in database
await App.Database.SaveBanksAsync(new Banks
Name = Name, // Cannot implicity convert typer 'string[]' to 'string'
Number = Number // // Cannot implicity convert typer 'string[]' to 'string'
);
var bankName = await App.Database.GetBanksAsync(Name);
_bankList.Add(bankName); // Cannot convert from 'System.Collections.Generic.List<Mobile.App.Banks>' to 'string'
然后在Picker
中获取值private ObservableCollection<string> _bankList = new ObservableCollection<string>();
public ObservableCollection<string> BankList
get
return _bankList;
set
this.RaiseAndSetIfChanged(ref _bankList, value);
<Picker
x:Name="picker_bank"
Title="Select Bank"
ItemsSource="Binding BankList"
SelectedItem="Binding SelectedBank">
</Picker>
【问题讨论】:
什么是BankModel
?
BankModel是模型,public static string[] Name get; set;
..我也可以直接用初始化数组...
我编辑了它,把它改成了string[] Name
和string[] Number
...
【参考方案1】:
而不是这样做
string[] Name = new string[] "Bank 1", "Bank 2", "Bank 3" ;
string[] Number = new string[] "000000", "111111", "222222" ;
试试这个
List<Banks> banks = new List<Banks>();
// repeat for each bank
banks.Add(new Banks Name = "Bank1", Number = "00000" );
然后您可以将它们保存到您的数据库中
foreach(var bank in banks)
await App.Database.SaveBanksAsync(bank);
接下来,这个不行
var bankName = await App.Database.GetBanksAsync(Name);
因为GetBanksAsync
返回所有家银行,而不仅仅是一家银行的名称。
BankList
应该是 ObservableCollection<Banks>
,而不是 string
。然后你就可以这样做了
// load all banks into a list
var banks = await App.Database.GetBanksAsync();
// create an observablecollection from that list
BankList = new ObservableCollection<Banks>(banks);
【讨论】:
感谢回复,现在在Picker中,Mobile.App.Banks
被打印了6次?我只想在 Picker... 中打印 Banks 的 Name
使用ItemDisplayBinding
属性告诉它您要显示模型的哪个属性 - 请参阅docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/…
好的,非常感谢......如果我想更新特定银行的数量,例如update the bank 10's number to 101010
.. 我该怎么做?
我可以打开 sqlite 文件吗?我找不到它,查看android/data
,里面什么都没有..
更新相应 Banks 对象的属性并将其保存到数据库 - 这是有据可查的以上是关于在 Xamarin 的 SQLite 数据库中存储和检索数组的主要内容,如果未能解决你的问题,请参考以下文章
在 App Update/Reinstall Rollout Xamarin 上保留 SQLite db 数据