问题描述
我有一个按钮方法,它希望我从用作 ID 的字段中给它一个值。
async void Tapped(System.Object sender,Xamarin.Forms.ItemTappedEventArgs e)
{
var person = await App.sqliteDb.GetItemAsync(Convert.ToInt32(txtPersonId.Text));
if (person != null)
{
await displayAlert("Success","Person Name: " + person.Name + Environment.NewLine + "Person ID: " + person.PersonID,"OK");
}
}
如何更换:
Convert.ToInt32(txtPersonId.Text)
与:
person.PersonID
我的 sqliteHelper.cs 看起来像这样:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using sqlite;
namespace WeatherLocationInfo.Views
{
public class sqliteHelper
{
sqliteAsyncConnection db;
public sqliteHelper(string dbPath)
{
db = new sqliteAsyncConnection(dbPath);
db.CreateTableAsync<Person>().Wait();
}
//Insert and Update new record
public Task<int> SaveItemAsync(Person person)
{
if (person.PersonID != 0)
{
return db.UpdateAsync(person);
}
else
{
return db.InsertAsync(person);
}
}
//Delete
public Task<int> DeleteItemAsync(Person person)
{
return db.DeleteAsync(person);
}
//Read All Items
public Task<List<Person>> GetItemsAsync()
{
return db.Table<Person>().ToListAsync();
}
//Read Item
public Task<Person> GetItemAsync(int personId)
{
return db.Table<Person>().Where(i => i.PersonID == personId).FirstOrDefaultAsync();
}
}
}
My Person object look like this:
使用系统; 使用 sqlite;
namespace WeatherLocationInfo.Views
{
public class Person
{
[PrimaryKey,AutoIncrement]
public int PersonID { get; set; }
public string Name { get; set; }
}
}
我的应用程序 Xaml.cs 如下所示:
public static sqliteHelper sqliteDb
{
get
{
if (db == null)
{
db = new sqliteHelper(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),"Xamarinsqlite.db3"));
}
return db;
}
}
我在我的 xamarin 项目中使用了选项卡式表单,并希望作为来自数据库的外部参数 id 传递。 我想完全删除填写ID的字段,一切都会自动发生。
解决方法
如果我理解您的问题,首先您必须将文本字段绑定到 ViewModel 中的 Person 属性,然后在事件处理程序中使用 Person 对象。
var bindingContext = this.BindingContext as YourViewModelName ;
var person = await App.SQLiteDb.GetItemAsync(bindingContext.person.PersonID);
,
您编写代码的方式表明您当前正在从您的视图(移动应用或“选项卡式表单”)调用数据库 (SQLLite) 方法。
虽然这是可行的,但它不允许绑定,这正是您提到要使用“person.PersonID”而不是“Convert.ToInt32(txtPersonId.Text)”时所要求的
为了做到这一点,您需要遵循移动应用的分层架构,其中调用的方式如下:
视图:这是您的移动应用程序的外观,即您打开应用程序时在手机上看到的屏幕。
ViewModel:ViewModel 与 View 和数据库通信,并负责从 SQLLite 获取数据并连接或“绑定”它执行 View。
模型:在您的示例中,这将是“人”对象/类,并且 SQLLite 也使用它在数据库中创建表。
DataLayer: 首先,我建议在 ViewModel 和 Model 之间添加这一层。该层将具有诸如“App.SQLiteDb.GetItemAsync()”或“App.SQLiteDb.SaveItemAsync()”之类的调用,这样您就不必在 ViewModel 中编写此代码,从而保持 ViewModel 干净。>
最后,我建议您熟悉以下概念:
- Xamarin 和 MVVM
- 依赖注入
尝试在谷歌上搜索“Xamarin 移动应用 sqlite mvvm 教程”。有很多东西可以解释这些概念。
一切顺利。