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

时间:2018-01-31 23:12:24

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

所以我一直在尝试sqlite-net-pcl,这似乎无法更新状态...... 在尝试使用一个测试字符串到某个地方解决问题之后,它从第一个列表开始,看起来只是填充了0,所以我有点将它恢复到原来的状态。

    if (id == R.id.dark_mode) {

            switch (item.getItemId()) {
                case R.id.dark_mode:
                    if (item.isChecked()) {
// If item already checked then unchecked it
                        item.setChecked(false);
                    } else {
// If item is unchecked then checked it
                        item.setChecked(true);
                    }
                default:
                    return super.onOptionsItemSelected(item);
            }
        }

无论我的表中有多少条目,只要对象的状态值中有0或1,它就会用另一个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); } } } } 总是返回零,即使我在ObjectIDList的数据库中有很多记录?如果我有5条记录,那么它会返回5条结果但是使用零而不是实际的ObjectStatus = 0 or ObjectStatus = 1

1 个答案:

答案 0 :(得分:0)

我查看了源代码,这是SQLite的功能。我们假设您有这样的查询:

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

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

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

<强>修正

因此,要解决此问题,您需要创建一个具有long属性的新类,或者使用您已经拥有的类:ObjectID(这不是.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();