2016-04-18 5 views
0

Я разрабатываю приложение для Android, которое использует SQLite в качестве локальной базы данных. Приложение синхронизирует данные, полученные из веб-api, и сохраняет их в локальной базе данных. Все классы модели имеют свой ID-свойство, заданный как Первичный ключ, и Auto incremented, поэтому я могу вручную вводить данные без указания идентификатора. Проблема в том, что когда я вставляю данные из API в SQlite, идентификатор объекта игнорируется, а Sqlite дает объекту новый идентификатор. Я хочу, чтобы данные хранились с тем же идентификатором, что и объект, который хранится.Предотвращение дублирования данных в базе данных SQLite

Веб-api возвращает списки объектов, у которых есть свой ID-тип, но объекты SQLite имеют свои первичные ключи как int. Это причина, по которой значения идентификатора не сохраняются, потому что их типы данных не совпадают? Я не могу изменить тип данных в моей базе данных 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

На основе [этого ответа] (http://stackoverflow.com/questions/3388098/sqlite-data-types) типы данных SQLite для каждого значения, а не для столбца, поэтому любой тип, который вы пишете, должен быть тем, что вы получаете назад. –

+0

Если значения идентификатора совпадают, то почему вставленные данные получают значение, отличное от того, которое я получаю от объекта API? –

+0

Покажите нам код, в котором вы читаете и пишите. –

ответ

0

Если локальная БД является кеш для веб-данных и внешней БД дает вам уникальные идентификаторы, не используйте автоматическое увеличение в схеме, просто повторно используйте внешние идентификаторы.

На самом деле, у вас может быть комплексный (составной) первичный ключ, это зависит от уникальных свойств данных.

Если вы не работаете со своими данными в виде структурированного набора, вы можете попробовать gson+SharedPreferences. Просто не забудьте переопределить равные и хэш-коды для ваших моделей данных.

Тип данных не является проблемой, поскольку sqlite использует INTEGER type.

+0

Я мог бы это сделать, но это мешает мне вводить данные в локальную БД вручную без указания их идентификатора. –

+0

Зачем вручную вводить данные? Если это для тестов, вы можете запросить самый высокий идентификатор, а затем увеличивать его до вставки. –

+0

Как и когда мне нужно вставлять объекты данных из приложения, я могу указать значения всех других свойств, кроме ID. Да, это может быть одно решение. –