【问题标题】:Insert and Replace existing value in sqlite by overriding the row通过覆盖行在 sqlite 中插入和替换现有值
【发布时间】:2018-01-08 12:26:46
【问题描述】:

我有一个远程 Web 服务,它返回两个 int 值,即:

  1. 频率
  2. 保存

我有一个定义为Parameters 的模型,如下所示:

public class Parameters
{
    public int Frequency { get; set; }
    public int Conserve { get; set; }
}

每次启动应用程序时,都会调用 Web 服务以获取值。在应用程序第一次启动时,这些值被保存到一个 sqlite 数据库中。

随后,每次启动应用程序后,都会调用 Web 服务以获取值。每次将值保存到 sqlite db。

做的方法是:

public async Task InsertParams()
{
        await con.CreateTableAsync<Parameters>();

        ParamService ps = new ParamService();

        Parameters pm = new Parameters();

        pm = await ps.GetParams(); // call to webservice

        await con.InsertOrReplaceAsync(pm);
}

问题是,如果最初在 web 服务上频率的值是 30,它会将其插入到数据库中。但是当值更改为50 时,它不会覆盖sqlite db 中的行。

我只想要 sqlite db 中应该覆盖 /replace 的单行。请告知我该如何实现这一目标。谢谢。

【问题讨论】:

标签: c# xamarin sqlite


【解决方案1】:

InsertOrReplace 方法 requires a unique identifier ID
否则,您希望它如何检查行是否存在并在需要时对其进行更新?

所以你必须选择:
1.添加一个Id属性,一直保持不变。

public class Parameters
{
    [PrimaryKey]
    public int Id { get; set; }
    public int Frequency { get; set; }
    public int Conserve { get; set; }
}

...
// TODO: Hacky solution
pm = await ps.GetParams(); // call to webservice
pm.Id = 1;
await con.InsertOrReplaceAsync(pm);
...
  1. 不是InsertOrReplace,而是截断表格并插入一行。

P.S.:在 SQL 表中保留单行感觉不自然,您可以考虑使用其他一些缓存解决方案,以便有效地使用上述技巧。

【讨论】:

  • 在哪里可以添加 Id 属性,如何始终保持不变?
  • 我更新了我的答案。希望你现在有一个更好的主意。
  • 但是 Web 服务为 Id 属性返回值 0。
  • 当然可以。由于 Web 响应不包含 Id,因此反序列化器将 Id 属性值设置为 default(int),即 0。
  • 最后一个问题。如何仅检索 sqlite 中的频率字段? var result = await _con.ExecuteAsync("SELECT Frequency from Parameters WHERE Id = ?", 1);返回结果。频率;它不工作。
猜你喜欢
  • 2013-11-10
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多