从通用“项目列表”填充SQLite数据库

时间:2018-02-20 14:32:49

标签: xamarin json.net sqlite-net

我使用SQLite数据库使用TodoItems的通用列表填充listview:

ListView.ItemsSource = await App.Database.GetItemsAsync("SELECT * FROM [TodoItem]");

我可以使用HttpClient类从数据库源读取同类数据,也可以通过

public async Task<List<TodoItem>> ReadDataAsync ()

....
    Items = new List<TodoItem> ();
....
    var content = await response.Content.ReadAsStringAsync ();
    Items = JsonConvert.DeserializeObject <List<TodoItem>> (content);
....
    return Items;

此后我也可以将其用作数据源:

ListView.ItemsSource = await App.ReadDataAsync();

两种方式都运作良好。

我现在想要的是结合两个例程来完成检查我们是否有在线连接的代码,如果是,则删除数据库并使用上面的ReadDataAsync结果填充它,如果不是,请保持数据库不变。

我发现没有办法直接将List分配给我的数据库,覆盖整个内容,我想到的是:

App.Database.Items = await App.ReadDataAsync();

但SQLite似乎没有直接公开数据存储。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:0)

例如,对于android,您可以尝试:无需删除数据库。

           //Check for internet connection 
            var connectivityManager = 
             (ConnectivityManager)this.GetSystemService("connectivity");
            var activeConnection = connectivityManager.ActiveNetworkInfo;
            if ((activeConnection != null) && activeConnection.IsConnected)
            {
                //Make call to the API
                var list = await App.ReadDataAsync();
                //Update or Insert local records
                foreach (var item in list)
                {
                    var success = UpdateOrInsert(item);
                    //Do something after - like retry incase of failure
                }
            } 

UpdatedOrInsert方法可能如下所示:

     private bool UpdateOrInsert(TodoItem item)
     {
        var rowsAffected = App.Database.Update(item);
        if (rowsAffected == 0)
        {
            // The item doesn't exist in the database, therefore insert it
            rowsAffected = App.Database.Insert(item);
        }
        var success = rowsAffected > 0;
        return success;
     }