在 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[] Namestring[] 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&lt;Banks&gt;,而不是 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 数据库中存储和检索数组的主要内容,如果未能解决你的问题,请参考以下文章

使用Sqlite数据库在Xamarin跨平台完成登录代码

Xamarin 项目中 SQLite-Net 的通用存储库

xamarin.Android SQLite存储

在 App Update/Reinstall Rollout Xamarin 上保留 SQLite db 数据

如何从图库中选择图像并保存到 xamarin 中的 sql 数据库

Xamarin SQLite教程Xamarin.iOS项目添加引用