как синхронизировать настольные приложения Sqlite данные базы данных с базой данных сервера MySql [дубликат]

Ссылка NullReferenceException или Object, не установленная на экземпляр объекта, возникает, когда объект класса, который вы пытаетесь использовать, не создается. Например:

Предположим, что у вас есть класс с именем Student.

public class Student
{
    private string FirstName;
    private string LastName;
    public string GetFullName()
    {
        return FirstName + LastName;
    }
}

Теперь рассмотрим другой класс, в котором вы пытаетесь получить полное имя учащегося.

public class StudentInfo
{      
    public string GetStudentName()
    {
        Student s;
        string fullname = s.GetFullName();
        return fullname;
    }        
}

Как видно из вышеприведенного кода, оператор Student s - объявляет только переменную типа Student, обратите внимание, что класс Student не создается в этой точке. Следовательно, когда выполняется выполнение инструкции s.GetFullName (), она выкинет исключение NullReferenceException.

66
задан Jonas 19 December 2011 в 05:00
поделиться

5 ответов

75
ответ дан p.marino 3 September 2018 в 15:53
поделиться

Я бы рекомендовал вам иметь столбец timestamp в каждой таблице, и каждый раз, когда вы вставляете или обновляете, обновляйте значение временной метки каждой затронутой строки. Затем вы перебираете все таблицы, проверяя, является ли метка времени более новой, чем та, что у вас есть в целевой базе данных. Если это новее, проверьте, нужно ли вам вставлять или обновлять.

Наблюдение 1: знать о физических ударах, поскольку строки удаляются из исходного db, и вы должны делать то же самое на сервере db , Вы можете решить это, избегая физических удалений или протоколирования всех удалений в таблице с отметками времени. Что-то вроде этого: DeletedRows = (id, table_name, pk_column, pk_column_value, timestamp) Итак, вы должны прочитать все новые строки таблицы DeletedRows и выполнить удаление на сервере с помощью table_name, pk_column и pk_column_value.

Наблюдение 2: знать FK с момента вставки данные в таблице, связанной с другой таблицей, могут завершиться неудачей. Вы должны деактивировать каждый FK до синхронизации данных.

5
ответ дан Bizhan 3 September 2018 в 15:53
поделиться

это отвечает разработчикам, которые используют инфраструктуру Xamarin (см. https://stackoverflow.com/questions/40156342/sync-online-offline-data )

Очень простой способ добиться этого с помощью платформы xamarin - использовать автономную синхронизацию данных Azure, поскольку она позволяет нажимать и извлекать данные с сервера по требованию. Операции чтения выполняются локально, а операции записи выполняются по требованию; Если сетевое соединение прерывается, операции записи помещаются в очередь до тех пор, пока соединение не будет восстановлено, а затем выполнено.

Реализация довольно проста:

1) создать мобильное приложение на лазурном портале ( вы можете попробовать это бесплатно здесь https://tryappservice.azure.com/ )

2) подключите своего клиента к мобильному приложению. https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-xamarin-forms-get-started/

3) код для настройки локального репозитория:

const string path = "localrepository.db";

//Create our azure mobile app client
this.MobileService = new MobileServiceClient("the api address as setup on Mobile app services in azure");

//setup our local sqlite store and initialize a table
var repository = new MobileServiceSQLiteStore(path);

// initialize a Foo table
store.DefineTable<Foo>();

// init repository synchronisation
await this.MobileService.SyncContext.InitializeAsync(repository);
var fooTable = this.MobileService.GetSyncTable<Foo>();

4), затем нажмите и потяните ваши данные, чтобы убедиться, что у нас есть последние изменения:

await this.MobileService.SyncContext.PushAsync();
await this.saleItemsTable.PullAsync("allFoos", fooTable.CreateQuery());

https: // azure.microsoft.com/en-us/documentation/articles/app-service-mobile-xamarin-forms-get-started-offline-data/

4
ответ дан Community 3 September 2018 в 15:53
поделиться

Предлагаю вам также взглянуть на Symmetricds . это библиотека репликации SQLite, доступная для систем Android. вы можете использовать его для синхронизации своей клиентской и серверной базы данных, я также предлагаю иметь отдельные базы данных на сервере для каждого клиента. Попытка хранить данные всех пользователей в одной базе данных mysql не всегда лучшая идея. Особенно, если пользовательские данные будут быстро расти.

0
ответ дан Hossein Shahdoost 3 September 2018 в 15:53
поделиться

Если кто-то имеет дело с подобной проблемой дизайна и нуждается в синхронизации изменений на нескольких устройствах Android, я рекомендую проверить Google Cloud Messaging для Android (GCM).

Я работаю над одно решение, в котором изменения, сделанные на одном клиенте, должны распространяться на других клиентов. И я только что реализовал доказательство реализации концепции (server & amp; client), и это работает как прелесть.

В принципе, каждый клиент отправляет изменения дельты на сервер. Например. Идентификатор ресурса ABCD1234 изменился со значения 100 до 99.

Сервер проверяет эти изменения дельты в своей базе данных и либо одобряет изменение (клиент находится в синхронизации), либо обновляет свою базу данных или отклоняет изменение (клиент отсутствует sync).

Если изменение одобрено сервером, сервер затем уведомляет других клиентов (за исключением тех, кто отправил изменение дельты) через GCM и отправляет многоадресное сообщение с тем же дельта-изменением. Клиенты обрабатывают это сообщение и обновляют свою базу данных.

Прохладно, что эти изменения распространяются почти мгновенно !!! если эти устройства подключены к сети. И мне не нужно внедрять какой-либо механизм опроса для этих клиентов.

Имейте в виду, что если устройство слишком длинное, и в очереди GCM для доставки ожидается более 100 сообщений, GCM отбросит эти и отправит специальное сообщение, когда устройства вернутся в сеть. В этом случае клиент должен выполнить полную синхронизацию с сервером.

Также проверьте этот учебник , чтобы начать с реализации клиента CGM.

5
ответ дан jogo 3 September 2018 в 15:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: