Одно «приложение», несколько пакетов, синхронизация базы данных - PullRequest
1 голос
/ 01 февраля 2011

Сводка : последовательная синхронизация нескольких баз данных SQLite со стороной сервера.

Я работаю над приложением Android, которое должно быть модульным: у нас есть средство запуска, которое запускает намеренияПо выбору пользователя запускать разные модули приложения (отдельные устанавливаемые пакеты).Как и сейчас, каждый модуль имеет свою собственную базу данных SQLite, и это прекрасно работает.Задача, на которую я наделен, требует синхронизации данных между контроллером и сервером (SQL Server 2008 R2) с использованием MS Sync Framework 4.0 (в настоящее время CTP октября).Я разработал Android lib в соответствии со спецификациями Sync Framework, и это тоже работает.

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

Мой текущий подход состоит в том, чтобы иметь абстрактные классы BroadcastReceiver & Service (я только сейчас обнаружил IntentService), которые наследуются в каждом модуле.Таким образом, в модуле запуска я передаю намерение, каждый модуль выбирает его, используя настроенный BroadcastReceiver, и синхронизирует свою базу данных, используя, опять же, настроенный сервис ... Параллельно.Я проверил заказанные трансляции, но поскольку у меня есть служба, выполняющая реальную работу, она не очень помогает.Единственный другой способ, которым я могу сейчас придумать, - это иметь общесистемный мьютекс и использовать его для блокировки синхронизирующего вызова в каждой службе.

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

[ EDIT ] Так что, похоже, Java не поддерживает именованные мьютексы.

[ EDIT2 ] Под модулями (или отдельными устанавливаемыми пакетами) я подразумевал разные APK для каждого модуля.Поэтому при запуске модуля вы фактически запускаете новый процесс для него.

Ответы [ 2 ]

0 голосов
/ 11 марта 2011

В конце я должен был реализовать глобальную блокировку, используя сокет сервера, как это:

ServerSocket mServerSocket;

/**
 * Simulates global locking using server socket
 * @return If lock was successful
 */
private synchronized boolean lock() {
  try {
    Log.v(serviceName, "Trying to acquire a lock...");
    // any port from 49152 through 65535 should work
    mServerSocket = new ServerSocket(51515);
    return true;
  } catch (IOException ioe) {
    return false;
  }         
}

/**
 * Simulates global unlocking
 */
private synchronized void unlock() {
  try {
    Log.v(serviceName, "Releasing a lock.");
    if (mServerSocket != null) {
      if (!mServerSocket.isClosed()) {
        mServerSocket.close();
      }
      mServerSocket = null;     
    }
  } catch (IOException e) {
    e.printStackTrace();
  }
}
0 голосов
/ 01 февраля 2011

Используя 'synchronized', вы можете реализовать мьютекс в Java, как показано ниже. Это очень минимальный пример.

private final Object mutex = new Object();
...
synchronized (mutex) {
    if (myCondition) {
        try {
            mutex.wait(n);
        } catch (XYZException e) {
            throw new PQRException(“Wait() issue!”, e);
        }
    }
}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...