通过覆盖行来插入和替换sqlite中的现有值

时间:2018-01-08 12:26:47

标签: c# xamarin sqlite

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

  1. 频率
  2. 保存
  3. 我有一个定义为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中有一行应该覆盖/替换。请告知我如何实现这一目标。感谢。

1 个答案:

答案 0 :(得分:0)

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截断表并插入一行。
  2. P.S。:在SQL表中保留一行并不自然,您可以考虑使用其他一些缓存解决方案,以便有效地使用上述黑客攻击。