如何从数据库中输入方法 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的主要内容,如果未能解决你的问题,请参考以下文章

如何序列化表单,而不是输入的值获取输入的 ID

C ++:如何使程序读取单词而不是字符?以及如何让程序在输入“孤独”字符时停止阅读?

我如何获得传递使用id获取元素,而不是$ _POST ['']的名称

如何创建一个带有输入的闭包结构参数,在 SwiftUI 中返回“some View”而不是“AnyView”?

从字符串输入中获取参数值

如何将对不同变量/类属性的引用作为方法参数而不是值?