我想我有赛车问题,自己解决不了。
在中,我从Azure中获取数据,并试图在循环中更新本地SQLite db。
下面是代码:
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;
}
}标记为*的行只工作第一次迭代*只适用于循环的第一次迭代。尽管我在SQLite db中有10条测试记录与在该行中搜索的10条记录相匹配,但只找到了第一条。另外9个失败了。
我认为它一定与异步任务有关,但我似乎无法修复它。我做错了什么?
更新:为了澄清,我第一次标出的行是有效的--它在SQLite DB中找到匹配;其他九个迭代,即使这些记录存在于SQLite DB中,也找不到匹配。
if (containsList != null && containsList.Count > 0)在第二个循环和后续循环中返回count =0,因此它不会更新SQLite db中的现有记录,而是运行:
await Conn.InsertAsync(v);结果是在SQLite DB中插入重复的记录,而不是更新现有记录中的lastupdatedate字段。
我使用SQLite db Firefox插件对所有10条记录使用相同的查询,而查询查找所有10条记录,所以它不是查询。当它循环第二次和后续的时间时,ascyn任务是否有可能将其锁定在外?没有例外。
发布于 2017-06-02 15:05:30
问题解决了。我雇了一个承包商来做第一个SQLite数据库工作,最后我看到他在SQLite表的VendorID字段上添加了一个惟一的约束(主键),这不是一个唯一的值字段。因此,当发布更新数据时,它没有发布10条记录,而是发布了1条记录10次。update循环运行时,它在第一次迭代中找到所有10条记录,更新了所有10条,然后找不到其他9条记录,因为它们根本不在那里。它每次运行程序时都会添加9条记录,并且由于主键约束错误,它再次多次添加相同的记录。如果代码看起来正确并且应该工作,那么首先看看那些你认为“正确”的东西。如果灯熄灭了,你不会撕开墙壁检查电线,你会先检查灯泡,对吗?
https://stackoverflow.com/questions/43747560
复制相似问题