如何从数据库中输入方法 ID 的输入参数,而不是使用 SQLite 的字段中的数字 - Xamarin
Posted
技术标签:
【中文标题】如何从数据库中输入方法 ID 的输入参数,而不是使用 SQLite 的字段中的数字 - Xamarin【英文标题】:How to put as input parameter of method ID from database instead of a number from a field usin SQLite - Xamarin 【发布时间】:2021-08-05 06:01:26 【问题描述】:我有一个按钮方法,希望我从用作 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
所以不要指望输入参数,而是从数据库中获取相应名称的 ID?
我的 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的字段,一切都会自动发生。
【问题讨论】:
【参考方案1】:如果我理解您的问题,首先您必须将文本字段绑定到 ViewModel 中的 Person 属性,然后在事件处理程序中使用 Person 对象。
var bindingContext = this.BindingContext as YourViewModelName ;
var person = await App.SQLiteDb.GetItemAsync(bindingContext.person.PersonID);
【讨论】:
“YourViewModelName”是什么意思? 我写了这段代码: var bindingContext = this.BindingContext as Person; var person = await App.SQLiteDb.GetItemAsync(bindingContext.person.PersonID); 但收到此错误消息:/Users/pizhev/Projects/New App/WeatherLocationInfo 0.0.3/WeatherLocationInfo/Views/Favorites.xaml.cs(73,73): 错误 CS1061: 'Person'不包含“person”的定义,并且找不到接受“Person”类型的第一个参数的可访问扩展方法“person”(您是否缺少 using 指令或程序集引用?)(CS1061)(WeatherLocationInfo)跨度> 您使用的是 ViewModel 吗?如果不是最好这样做,只需搜索如何在 xamarin 中应用 MVVM 模式。 docs.microsoft.com/en-us/xamarin/xamarin-forms/… 人是你的“模型”而不是你的“视图模型”【参考方案2】:您编写代码的方式表明您当前正在从您的视图(移动应用程序或“选项卡式表单”)调用数据库 (SQLLite) 方法。
虽然这是可行的,但它不允许绑定,这正是您提到要使用“person.PersonID”而不是“Convert.ToInt32(txtPersonId.Text)”时所要求的内容
为此,您需要遵循移动应用程序的分层架构,其中调用如下:
视图:这是您的移动应用程序的外观,即您打开应用程序时在手机上看到的屏幕。
ViewModel: ViewModel 与 View 和数据库通信,并负责从 SQLLite 获取数据并连接或“绑定”它来执行 View。
模型:在您的示例中,这将是“Person”对象/类,SQLLite 也使用它在数据库中创建表。
DataLayer: 首先,我建议在 ViewModel 和 Model 之间添加这一层。该层将调用“App.SQLiteDb.GetItemAsync()”或“App.SQLiteDb.SaveItemAsync()”等调用,这样您就不必在 ViewModel 中编写此代码,从而保持 ViewModel 干净。
最后,我建议您熟悉以下概念:
Xamarin 和 MVVM 依赖注入尝试谷歌搜索“Xamarin 移动应用 sqlite mvvm 教程”。有很多东西可以解释这些概念。
一切顺利。
【讨论】:
以上是关于如何从数据库中输入方法 ID 的输入参数,而不是使用 SQLite 的字段中的数字 - Xamarin的主要内容,如果未能解决你的问题,请参考以下文章
C ++:如何使程序读取单词而不是字符?以及如何让程序在输入“孤独”字符时停止阅读?
我如何获得传递使用id获取元素,而不是$ _POST ['']的名称