查询 table only returns null 到 sqlite-net-pcl 中的列表
Querying a table only returns null to a list in 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);
}
}
}
}
无论我的 table 中有多少条目,只要对象的状态值中有 0 或 1,它就会用另一个 0 填充列表。
问题
为什么 ObjectIDList
总是返回零,即使我在数据库中有许多 ObjectStatus = 0 or ObjectStatus = 1
的记录?如果我有 5 条记录,那么它会 returns 5 个结果但用零代替实际的 ObjectID
.
我查看了源代码,这是 SQLite 的作用。假设您有这样的查询:
var ObjectIDList = await database.QueryAsync<long>("SELECT ObjectID FROM
Object WHERE ObjectStatus = 0 OR ObjectStatus = 1");
SQLite 将对数据库执行查询,并创建您传递给 QueryAsync<T>
的 T
的实例。您传递了 long
,因此它将创建一个新的 long
。然后它将尝试在实例中填充名为 ObjectID
的 属性。但很明显,由于 long
没有名为 ObjectID
的 属性,因此无法填充它。 SQLite 不会抛出异常来告诉你这一点。它只是继续,最后你会得到一堆新创建的 long
s。默认情况下,所有 long
都设置为零。这就是为什么您在 ObjectIDList
中得到全零的原因。
从line 119开始看源码。就个人而言,我认为这是一个糟糕的设计,在这种情况下,他们应该 return 一个 long
的列表。
修复
因此,要解决此问题,您需要创建一个新的 class 并将 ObjectID
作为 属性,或者使用您已有的 Object
(这不是 .net 对象类型,而是您自己的自定义类型)。所以你的查询将变成:
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...
}
所以我一直在尝试围绕 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);
}
}
}
}
无论我的 table 中有多少条目,只要对象的状态值中有 0 或 1,它就会用另一个 0 填充列表。
问题
为什么 ObjectIDList
总是返回零,即使我在数据库中有许多 ObjectStatus = 0 or ObjectStatus = 1
的记录?如果我有 5 条记录,那么它会 returns 5 个结果但用零代替实际的 ObjectID
.
我查看了源代码,这是 SQLite 的作用。假设您有这样的查询:
var ObjectIDList = await database.QueryAsync<long>("SELECT ObjectID FROM
Object WHERE ObjectStatus = 0 OR ObjectStatus = 1");
SQLite 将对数据库执行查询,并创建您传递给 QueryAsync<T>
的 T
的实例。您传递了 long
,因此它将创建一个新的 long
。然后它将尝试在实例中填充名为 ObjectID
的 属性。但很明显,由于 long
没有名为 ObjectID
的 属性,因此无法填充它。 SQLite 不会抛出异常来告诉你这一点。它只是继续,最后你会得到一堆新创建的 long
s。默认情况下,所有 long
都设置为零。这就是为什么您在 ObjectIDList
中得到全零的原因。
从line 119开始看源码。就个人而言,我认为这是一个糟糕的设计,在这种情况下,他们应该 return 一个 long
的列表。
修复
因此,要解决此问题,您需要创建一个新的 class 并将 ObjectID
作为 属性,或者使用您已有的 Object
(这不是 .net 对象类型,而是您自己的自定义类型)。所以你的查询将变成:
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...
}