【问题标题】:Store & retrieve array in SQLite database in Xamarin在 Xamarin 的 SQLite 数据库中存储和检索数组
【发布时间】: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...

标签: c# .net sqlite xamarin xamarin.forms


【解决方案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 对象的属性并将其保存到数据库 - 这是有据可查的
猜你喜欢
  • 2011-12-30
  • 1970-01-01
  • 2016-10-10
  • 2011-05-10
  • 1970-01-01
  • 2015-03-16
  • 2015-08-01
  • 1970-01-01
  • 2017-04-03
相关资源
最近更新 更多