所以我一直在尝试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
。
答案 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();