Я новичок в xamarin и разрабатываю приложение xamarin android.
Как проверить, существует ли запись в android базе данных sqlite на основе поля, отличного от первичного ключа?
Мой класс ниже
public class Machine
{
[PrimaryKey, AutoIncrement]
public int MachineId { get; set; } //local database primary key
public int ServerId { get; set; } //primary key on server
//other properties
}
Получить соединение с базой данных
private static SQLiteAsyncConnection db;
public static SQLiteAsyncConnection GetDB()
{
if (db == null)
{
const string filename = "machineDB.db3";
var documentspath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
var path = Path.Combine(documentspath, filename);
db = new SQLiteAsyncConnection(path, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.FullMutex, true);
}
return db;
}
Это код, который я использую для обновления локальных данных с сервера
public async Task<List<Machine>> GetMachinesAsync()
{
//get data from server
List<Machine> Machines = await ServerHelper.GetFromServer();
//insert or update in database
foreach (var machine in Machines)
{
//check if record exists
bool exists = (await db.Table<Machine>().Where(f => f.ServerId == machine.ServerId).CountAsync())>0;
if (exists)
{
await db.UpdateAsync(machine);
}
else
{
await db.InsertAsync(machine);
}
}
var localmachines = await db.Table<Machine>().ToListAsync();
return localmachines;
}
Приведенный выше код иногда вставляет повторяющиеся записи. Во время загрузки я возвращаю первичный ключ с сервера (MySQL) и обновляю загруженную запись новым ServerId. Это правильный подход?
Как лучше всего проверить, существует ли ServerId в локальной базе данных?
Другой вариант, о котором я подумал, - это пометить поле ServerId ограничением UNIQUE. Может ли синхронизация данных быть проблемой в таком случае с несколькими пользователями?