[英]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);
}
}
}
}
無論表中有多少個條目,只要對象的狀態值中有0或1,它就會用另一個0填充列表。
題
為什么即使我在數據庫中有許多記錄的ObjectStatus = 0 or ObjectStatus = 1
ObjectIDList
總是返回零? 如果我有5條記錄,那么它將返回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
。 默認情況下,所有long
都設置為零。 這就是為什么在ObjectIDList
中獲得全零的原因。
查看從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...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.