微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将数据库中的方法 ID 作为输入参数而不是使用 SQLite 的字段中的数字 - Xamarin

如何解决如何将数据库中的方法 ID 作为输入参数而不是使用 SQLite 的字段中的数字 - Xamarin

我有一个按钮方法,它希望我从用作 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的字段,一切都会自动发生。

解决方法

如果我理解您的问题,首先您必须将文本字段绑定到 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)”时所要求的

为了做到这一点,您需要遵循移动应用的分层架构,其中调用的方式如下:

enter image description here

视图:这是您的移动应用程序的外观,即您打开应用程序时在手机上看到的屏幕。

ViewModel:ViewModel 与 View 和数据库通信,并负责从 SQLLite 获取数据并连接或“绑定”它执行 View。

模型:在您的示例中,这将是“人”对象/类,并且 SQLLite 也使用它在数据库中创建表。

DataLayer: 首先,我建议在 ViewModel 和 Model 之间添加这一层。该层将具有诸如“App.SQLiteDb.GetItemAsync()”或“App.SQLiteDb.SaveItemAsync()”之类的调用,这样您就不必在 ViewModel 中编写此代码,从而保持 ViewModel 干净。>

最后,我建议您熟悉以下概念:

  • Xamarin 和 MVVM
  • 依赖注入

尝试在谷歌上搜索“Xamarin 移动应用 sqlite mvvm 教程”。有很多东西可以解释这些概念。

一切顺利。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。