防止SQLite数据库中的数据重复

时间:2016-04-18 16:42:51

标签: android mysql database sqlite

我正在开发一个使用SQLite作为本地数据库的Android应用程序。该应用程序同步从Web api获取的数据并将其存储在本地数据库中。所有模型类的ID属性都设置为主键,并且自动递增,因此我可以手动输入数据而无需指定ID。问题是当我将API中的数据插入SQlite时,会忽略该对象的ID,并且Sqlite会为该对象提供一个新ID。我希望存储的数据与存储的对象具有相同的ID。

web api返回ID类型为long的对象列表,但SQLite对象的主键为int。这是因为数据类型不匹配而未存储ID值的原因吗?我无法更改数据来源的SQL数据库中的数据类型,因为其中有数百个表。有办法吗?

这是在本地数据库中插入或更新数据的代码:

    }
    public async Task<string> insertUpdateVideoData(Video_Struct data)
    {
        try
        {
            var db = new SQLiteAsyncConnection(dbPath);
            var m = GetVideos();
            if (await db.FindAsync<Video_Struct>(f => f.VideoID == data.VideoID) != null)
            {

                await db.UpdateAsync(data);
            }
            else
            {
                if (await db.InsertAsync(data) != 0)
                {

                    await db.UpdateAsync(data);
                }

            }
            return "Single data file inserted or updated";
        }
        catch (SQLiteException ex)
        {
            return ex.Message;
        }
    }

这是从API获取数据对象的代码:

    public async Task<List<Video_Struct>> GetVideoData()
    {
        List<Video_Struct> vids = new List<Video_Struct>();
        WebClient mClient = new WebClient();
        var output = await mClient.DownloadDataTaskAsync(new Uri(GlobalVariables.host + "/api/media/getmedia"));
        var json = Encoding.UTF8.GetString(output);
        vids = JsonConvert.DeserializeObject<List<Video_Struct>>(json);
        return vids;
    }

1 个答案:

答案 0 :(得分:0)

如果您的本地数据库是Web数据的缓存而外部数据库为您提供唯一的ID,请不要在方案中使用自动增量,只需重新使用外部ID。

实际上,您可以拥有复杂(复合)主键,它取决于数据的唯一属性。

如果您不将数据用作结构化集,则可以尝试gson+SharedPreferences。只是不要忘记为数据模型重写equals和hashcode。

数据类型不是问题,因为sqlite使用INTEGER type