我正在开发一个使用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;
}
答案 0 :(得分:0)
如果您的本地数据库是Web数据的缓存而外部数据库为您提供唯一的ID,请不要在方案中使用自动增量,只需重新使用外部ID。
实际上,您可以拥有复杂(复合)主键,它取决于数据的唯一属性。
如果您不将数据用作结构化集,则可以尝试gson+SharedPreferences。只是不要忘记为数据模型重写equals和hashcode。
数据类型不是问题,因为sqlite使用INTEGER type。