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

Posted

技术标签:

【中文标题】查询表只返回 null 到 sqlite-net-pcl 中的列表【英文标题】:Querying a table only returns null to a list in sqlite-net-pcl 【发布时间】:2018-07-11 04:49:45 【问题描述】:

所以我一直在尝试使用 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

【问题讨论】:

我不明白你的问题。为什么你有returns?他们之后什么都没有,那么他们的目的是什么? 糟糕,忘了编辑它们,它们是为了返回测试字符串,已编辑。 你的问题是什么? 我的问题是是否有一个选项可以在列表中实际保存 ObjectID(而不是它要求的状态),因为 ID 有点像 14325617892 保存的时间;到目前为止,我看到的所有示例都使用 select 指向对象内符合条件的特定元素,它只保存 0 而不是实际值,只要我不知道为什么会这样。 ATM 的问题是我后来得到了对象,更改了值并根据这个我无法用这个方法提取的 ID 保存它。 【参考方案1】:

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

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

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

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

修复

因此,要解决此问题,您要么需要创建一个具有 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...

【讨论】:

以上是关于查询表只返回 null 到 sqlite-net-pcl 中的列表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:我正在尝试将变量从视图传递到控制器,但它返回 null

sqlite-net 更新方法是如何工作的?

SQLite-Net 扩展 - GetAllWithChildrenAsync 没有拉动一切

MYSQL查询--聚合函数查询

SQLite SELECT MAX() 查询返回 null 到游标?

mybatis 查询结果为0但是返回了null,resultType是long,这要怎么解决?