我认为我有赛车问题而无法自行解决。
在Xamarin Android中,我从Azure SQL获取数据并尝试在循环中更新本地SQLite数据库。
以下是代码:
foreach (var hotItem in updatedData)
{
var updated = await vendorController.ContainsVideoUrlAndUpdate(hotItem, date);
if (!updated)
await vendorController.AddUpdatedData(hotItem);
}
public async Task<bool> ContainsVideoUrlAndUpdate(List<VideoItem> updateDataList, DateTime lastDateUpdated) {
try
{
foreach (VideoItem v in updateDataList)
{
***WORKS ONLY FIRST ITERATION****var containsList = (await Conn.Table<VideoItem>().Where(o => (o.VideoURL == v.VideoURL && o.ZipCode == v.ZipCode) || (o.VideoURL == v.VideoURL && o.CityWide == true)).ToListAsync());****************
if (containsList != null && containsList.Count > 0)
{
foreach (var currData in containsList)
{
currData.LastUpdated = lastDateUpdated.ToString();
await Conn.UpdateAsync(currData);
}
}
else
{
await Conn.InsertAsync(v);
}
}
return true;
}
catch (SQLiteException ex)
{
Log.Info("Exception Updating LocalVideoList.sqlite DB", ex.Message);
return false;
}
}
我标记为*** WORKS ONLY FIRST ITERATION ****的行仅适用于循环的第一次迭代。即使我在SQLite数据库中有10条测试记录与该行中搜索的10条记录相匹配,但只找到第一条记录。其他9人失败了。
我认为它必须与异步任务有关,但我似乎无法修复它。我做错了什么?
更新: 为了澄清,我标记的行第一次工作 - 它在SQLite DB中找到匹配;在其他九个迭代中,即使这些记录存在于SQLite DB中,它也找不到匹配项。
if (containsList != null && containsList.Count > 0)
在第二个和后续循环上返回count = 0,因此它不会更新SQLite数据库中的现有记录,而是运行:
await Conn.InsertAsync(v);
导致在SQLite DB中插入重复记录,而不是更新现有记录中的lastupdatedate字段。
我使用SQLite db Firefox插件对所有10条记录使用相同的查询,查询查找所有10条记录,因此它不是查询。当ascyn任务将其锁定时,它是否可能循环第二次及以后的次数?没有例外。
答案 0 :(得分:0)
问题解决了。我聘请了一个承包商来完成第一个SQLite数据库工作,我终于看到他在SQLite表的VendorID字段上添加了一个唯一的约束(主键),该字段不是唯一的值字段。因此,在发布更新数据时,它没有发布10条记录,但是1条记录10次。当更新循环运行时,它在第一次迭代中找到所有10条记录,全部更新10条记录,然后找不到其他9条记录,因为它们根本就不存在。它在每次程序运行时添加了9条记录,由于主键约束错误,它再次添加了相同的记录多次。如果代码看起来正确并且应该有效,请查看您认为正确的代码&#39;第一。如果灯熄灭,你不要撕掉墙壁检查接线,先检查灯泡,对吗?