c# - 查询表只返回null返回sqlite-net-pcl中的列表

标签 c# sqlite xamarin cross-platform sqlite-net-pcl

所以我一直在尝试围绕sqlite-net-pcl进行操作,但这似乎无法更新状态...
在尝试使用测试字符串进行某种程度的本地化之后,它从第一个列表开始,该列表似乎只填充了0,因此我将其恢复到原来的位置。

public async Task UpdateStatus()
    {
        var ObjectIDList = await database.QueryAsync<long>("SELECT ObjectID FROM Object WHERE ObjectStatus = 0 OR ObjectStatus = 1");
        if (ObjectIDList != null)
        {
            foreach (long ObjectID in ObjectIDList)
            {
                byte newStatus = 5;
                var result = await database.Table<Object>().Where(i => i.ObjectID == ObjectID).FirstOrDefaultAsync();
                if (result != null)
                {
                    result.Objectstatus = newStatus;
                    await SaveObjectAsync(result);
                }
            }
        }
    }


无论我的表中有多少个条目,只要对象的状态值中有0或1,它就会用另一个0填充列表。



为什么即使我的ObjectIDList数据库中有许多记录,ObjectStatus = 0 or ObjectStatus = 1总是返回零?如果我有5条记录,那么它将返回5个结果,但结果为零,而不是实际的ObjectID

最佳答案

我查看了源代码,这就是SQLite的作用。假设您有这样的查询:

var ObjectIDList = await database.QueryAsync<long>("SELECT ObjectID FROM 
    Object WHERE ObjectStatus = 0 OR ObjectStatus = 1");


SQLite将对数据库执行查询,并创建传递给TQueryAsync<T>实例。您传递了long,因此它将创建一个新的long。然后它将尝试在实例中填充名为ObjectID的属性。但是显然,由于long没有名为ObjectID的属性,因此无法填充它。 SQLite不会抛出异常来告诉您这一点。它一直持续到最后,您会得到一堆新创建的long。默认情况下,所有long都设置为零。这就是为什么在ObjectIDList中得到全零的原因。

查看从line 119开始的源代码。我个人认为这是一个糟糕的设计,在这种情况下,他们应该只返回long的列表。

固定

因此,要解决此问题,您需要创建一个具有ObjectID作为属性的新类,或者使用已经具有的类:Object(这不是.net Object类型,而是您自己的自定义类型)。因此,您的查询将变为:

var ObjectIDList = await database.QueryAsync<Object>("SELECT ObjectID FROM 
    Object WHERE ObjectStatus = 0 OR ObjectStatus = 1");


然后执行以下操作:

List<long> ids = ObjectIDList.Select(x => x.ObjectID).ToList();


现在循环浏览并完成您的工作:

foreach(long thisObjectId in ids)
{
    // code...
}

关于c# - 查询表只返回null返回sqlite-net-pcl中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48552976/

相关文章:

c# - 去除边框导航栏按钮 monotuch

c# - RegisterClientScriptInclude : What does "type" parameter do?

sqlite - 请在sqlite中基于冲突子句澄清表与查询?

c# - Entity Framework varchar 外键不区分大小写

SQLite 导入选项卡文件 : is . 导入每行插入一次或将它们与事务分组?

php - 来自 SQL 的 Laravel Eloquent ORM 聚合函数

c# Android 如何将 Enum 放入 bundle

c# - 使用 C# 在 iPhone 上提示 UITextField

c# - 如何使 .NET 反射与动态生成的对象一起工作?

c# - 使用条形码字体打印