【问题标题】:Unable to delete from SQLite DB in Xamarin app无法从 Xamarin 应用程序中的 SQLite DB 中删除
【发布时间】:2017-07-17 11:29:38
【问题描述】:

我有一个 Product 类来存储有关产品的一些信息,并希望将其保存到我的 Xamarin 应用程序中的 SQLite DB 中。

class Product
{
    [PrimaryKey, AutoIncrement, Column("ID")]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }


    public Product(string name, string category)
    {
        Name = name;
        Category = category;
    }

    public Product()
    {

    }
}

在我的代码中,我创建了一个 Product 对象

Product s = new Product();
        s.Name = some_name;
        s.Category = some_category;

并通过以下方式插入我的数据库:

var db = new SQLiteConnection(db_path);
var table = db.Table<Product>();
db.Insert(s);

问题是主键显然总是 0,当我尝试通过传递一个项目来删除表中的记录时,我有一个 null

private void deleteThisProduct(Product item)
{
    var db = new SQLiteConnection(db_path);
    var table = db.Table<Product>();
    var toDelete = table.Where(x => x.ID == item.ID).FirstOrDefault();
    if (toDelete != null)
        {
            db.Delete(toDelete);
            Toast.MakeText(this, "Delete Successfully", ToastLength.Short).Show();
        }
        else
        {
            Toast.MakeText(this, "Not Found", ToastLength.Short).Show();
        }
}

无论我将什么项目传递给删除函数,toDelete 始终为空,我无法从数据库中删除记录。 奇怪的是,如果我的所有记录(Product 类)的主键都是 0,我的 Linq 查询应该会找到一些东西,但它总是返回 null。

我做错了什么?我的产品类是问题吗?谢谢。

为了清楚起见,即使在上面的代码中我只是这样做:

db.Delete(item) 

我无法从表中删除关联的记录。

【问题讨论】:

  • 表格中的Product Id不能为0,因为该字段被标记为PrimaryKey。创建一个方法来获取所有项目,这样您就可以验证他们拥有的 Id 是什么。方法 deleteThisProduct() 你只能传入 productId private void deleteThisProduct(int productId) 因为这就是你所使用的。
  • 这就是为什么我觉得这一切都很奇怪。 ID 设置不正确,这会在调用 db.Delete() 时产生问题

标签: c# linq sqlite xamarin xamarin.android


【解决方案1】:

您是否尝试将 Product 类保存在 Product.cs 中:`

[Serializable()]
    public class Product
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }`
}

在创建表中:

"CREATE TABLE 产品(ID INTEGER PRIMARY KEY,.....

【讨论】:

  • 产品已经在 Product.cs 中。我唯一没有做的就是在开头添加 [Serializable()]
  • 你在表定义中声明了db字段为主键吗?
  • 是的。当我将 Product 类传递给 db.CreateTable() 时,这是自动完成的
  • 您是否在 sqlite 编辑器中打开了 db 文件并查看了您的产品表的架构。应该有 ID 整数而不是 null prlmary key autoincrement。
  • 我不知道该怎么做,因为在创建数据库时它被存储在一个隐藏的位置。我想移动应用程序总是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多