Sqlite3异步插入和更新

时间:2014-11-22 20:58:37

标签: c# android android-asynctask sqlite

我在插入这个sqlite数据库时遇到了很多麻烦。第一个代码的第一个是我第一次插入的项目,第二个代码是我想要插入的项目。我第一次插入all很好,我可以很好地检索行,但是第二次我尝试将新项插入数据库时​​它没有更新,而是使用消息约束抛出sqliteexception。

第一次

GroceriesItemHistory.AddToGroceriesHistory ("Banana");
GroceriesItemHistory.AddToGroceriesHistory ("Apple");
GroceriesItemHistory.AddToGroceriesHistory ("Citrus");

第二次

GroceriesItemHistory.AddToGroceriesHistory ("Banana");
GroceriesItemHistory.AddToGroceriesHistory ("Apple");
GroceriesItemHistory.AddToGroceriesHistory ("Citrus");
GroceriesItemHistory.AddToGroceriesHistory ("Plant");

在这里,您可以看到调用数据库以保存项目的代码

saveHistory.Click += delegate 
{
    Task<string> result = localDB.SaveGroceriesItemHistory();
    Toast.MakeText(this, result.Result, ToastLength.Short).Show();
};

以下是插入项目的实际代码

public async Task<string> SaveGroceriesItemHistory()
{
    try
    {
        var dbConn = new SQLiteAsyncConnection(dbPath);
        foreach (var historyItem in GroceriesItemHistory.GroceriesHistory)
        {
            HistoryItem item = new HistoryItem();

            item.HistoryItemName = historyItem.Key;
            item.NumberOfAddidtions = historyItem.Value;

            if(await dbConn.InsertAsync(item) != 0)
                await dbConn.UpdateAsync(item);
        }
        return "GroceriesItemHistory saved!";
    }
    catch (SQLiteException ex)
    {
        return ex.Message;
    }
}

1 个答案:

答案 0 :(得分:2)

好吧我修复了这个问题,首先查询数据库是否存在与我想要插入的对象的主键相同的行

if(await dbConn.FindAsync<HistoryItem>(x => x.HistoryItemName == item.HistoryItemName) != null)
    await dbConn.UpdateAsync(item);
else
    await dbConn.InsertAsync(item);