如何通过服务更新本地数据库?

how to update local database by service?

我尝试通过 WEB API 服务更新 UWP 应用程序中的本地数据库。 我需要将现有实体 ID 的列表发送到 Web 服务并从服务中获取其他实体。

我的模型

public class LibraryCategoryModel
{
    public int ID { get; set; }
    public string CategoryTitle { get; set; }
    public byte[] Picture { get; set; }
}

和我的 controllerweb api

 // GET: api/Category
    public IQueryable<LibraryCategoryModel> GetLibraryCategoryModels(HttpRequestMessage request)
    {
        var string1 = request.Content.ReadAsStringAsync();
        List<int> existingIdCategoryList = new List<int>();
        existingIdCategoryList = JsonConvert.DeserializeObject<List<int>>(string1.Result);
        var entityList = db.LibraryCategoryModels.ToList();
        foreach (var Id in existingIdCategoryList)
        {
            entityList = entityList.Where(item => item.ID != Id).ToList();
        }
        return entityList as IQueryable<LibraryCategoryModel>;
    }

和我的要求

 private async void LoadDataFromNetwork(List<int> CategoryIdList)
    {
        if (NetworkHelper.IsInternet() || NetworkHelper.HasInternet())
        {
            using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri(serviceUrl);
                // Set requast
                using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "Api/Category"))
                {
                    // Set the Accept header for BSON.
                    request.Headers.Accept.Clear();
                    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/bson"));
                    string Content = await Task.Factory.StartNew(() => JsonConvert.SerializeObject(CategoryIdList));
                    request.Content = new StringContent(Content, System.Text.Encoding.UTF8, "application/json");
                    var response = await client.SendAsync(request);
                    response.EnsureSuccessStatusCode();
                    // Use BSON formatter to deserialize the result.
                    MediaTypeFormatter[] formatters = new MediaTypeFormatter[] { new BsonMediaTypeFormatter() };
                    try
                    {
                        var newCategorys = await response.Content.ReadAsAsync<LibraryCategoryModel[]>(formatters);
                        foreach (var category in newCategorys)
                        {
                            _dataService.InsertCategory(category);
                            AllCategoryList.Add(new LibraryCategoryViewModel(category));
                            _newCategoryIdListFromNetWork.Add(category.ID);
                        }
                    }
                    catch (Exception)
                    {

                        throw;
                    }

                }

            }
        }
    }

这对我有用,但我不确定这种方式是正确的最佳解决方案。 请指导我。

首先,如果它有效并且没有您遇到的具体问题,那么它可能就足够了。
有很多方法可以改进,但 "proper way" 或 "best solution" 的定义将始终基于意见。

也就是说,这里有一些建议:

  • LibraryCategoryModel 中包含 "Model" 是多余的。我会删除它。
  • 您的 API 需要 return IQueryable 吗?或者 IEnumerable,或者 甚至 IList 就足够了吗? - 始终保持尽可能简单。
  • string1 是一个糟糕的变量名称,因为它没有任何意义。使用描述其所含内容的内容,例如 requestContent.
  • 让你的 API 方法直接接受 List<int> 然后你就可以不需要处理任何意外的输入。
  • 处理 API 方法中意外的、无效的或丢失的输入。
  • API 中 foreach 循环的逻辑可以大大简化,这样结果只需要设置一次,而不是通过传入的列表每次迭代都创建新列表。
  • 使用单个静态 HTTPClient 实例(参见 https://skimming.net/why-you-should-reuse-httpclient-instances/
  • 不要只是捕获异常然后抛出一个新异常。所有这一切都会丢失任何异常信息。至少你应该记录异常并向用户报告一些东西。
  • 您的 NetworkHelper 方法名称没有清楚地区分它们各自的作用。重命名它们以使它们的含义和区别更加清楚。
  • 如果不满足连接等条件,不要什么都不做。如果某些事情不可能,请向用户指出,并提供可以采取哪些措施来纠正问题或作为替代方案的指示。
  • 未发出成功的 HTTP 请求而引发未处理的错误绝不是一件好事。有很多您无法控制的原因,这可能意味着请求可能无法成功,而崩溃并不是处理它们的方法。
  • 或者,如果请求失败的处理是在与上述代码分开的代码中进行的,那么这将使维护上述代码变得更加困难。
  • 使用与您 API 不同的编码组合有可能在将来混淆其他人(甚至您自己)。除非你有充分的理由发送 JSON 但请求 BSON,否则你应该对两者使用相同的。
  • 假设您还将在其他地方使用它们,请为您的内容编码定义常量。避免在代码中使用魔法字符串——尤其是那些在代码库中重复的字符串。
  • 删除记录代码正在执行的操作的注释。通过阅读代码应该清楚这一点。如果需要,使代码更清晰。注释说明代码在做什么实际上会更加混乱。特别是如果代码曾经更改但注释没有更改。
  • 等待创建任务只是为了序列化 JSON 似乎没有必要。如果不是绝对需要,请删除。 (添加文档,如果是的话。)
  • LoadDataFromNetwork 做了很多,如果分成多个方法可能更易于维护:用于创建请求、发出请求和处理响应。
  • "category"的复数形式是"categories"
  • returned 类别的处理似乎很混乱。大概有 class 级变量和静态列表。 _newCategoryIdListFromNetWork 变量看起来应该与此方法更紧密地联系在一起,而不是 class 并且与它相关的任何逻辑都可能过度分布在 class.
  • 周围