Как проверить, существует ли запись с помощью sqlite- net -pcl на основе поля, отличного от первичного ключа в Xamarin Android? - PullRequest
0 голосов
/ 29 мая 2020

Я новичок в 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. Может ли синхронизация данных быть проблемой в таком случае с несколькими пользователями?

...