Android “一”;申请书;,多个软件包,数据库同步

Android “一”;申请书;,多个软件包,数据库同步,android,architecture,service,Android,Architecture,Service,摘要:按顺序将多个SQLite数据库与服务器端同步 我正在开发一个必然是模块化的Android应用程序:我们有一个启动器,它可以根据用户选择启动不同的应用程序模块(单独的可安装包)。就像现在一样,每个模块都有自己的SQLite数据库,而且运行良好。分配给我的任务要求使用MS Sync Framework 4.0(目前为10月CTP)在手持设备和服务器端(SQL server 2008 R2)之间进行数据同步。我根据Sync框架规范开发了android lib,这也很有效 我遇到的问题是,由于这种

摘要:按顺序将多个SQLite数据库与服务器端同步

我正在开发一个必然是模块化的Android应用程序:我们有一个启动器,它可以根据用户选择启动不同的应用程序模块(单独的可安装包)。就像现在一样,每个模块都有自己的SQLite数据库,而且运行良好。分配给我的任务要求使用MS Sync Framework 4.0(目前为10月CTP)在手持设备和服务器端(SQL server 2008 R2)之间进行数据同步。我根据Sync框架规范开发了android lib,这也很有效

我遇到的问题是,由于这种松散耦合的设计(以及一些其他限制),我需要在launcher中有一个按钮,强制所有模块逐个同步它们的数据库(顺序现在并不重要)

我目前的方法是在每个模块中继承一个抽象的BroadcastReceiver&Service(我现在才发现IntentService)类。所以在launcher I broadcast intent中,每个模块使用定制的BroadcastReceiver拾取它,并再次使用定制的服务同步其数据库。。。同时。我已经检查了有序的广播,但由于我有一个服务在做实际的工作,它并没有真正的帮助。我目前唯一能想到的另一种方法是使用一个系统范围的互斥锁,并使用它锁定每个服务中的同步调用

这是我的第一个与Android相关的任务,所以可能有更好的方法来解决这个问题,我不会从重新设计同步部分开始,如果这能让我们的团队未来的生活更轻松一点的话

[EDIT]因此看起来Java不支持命名互斥体


[EDIT2]对于模块(或单独的可安装软件包),我指的是每个模块的不同APK。因此,当启动一个模块时,实际上是为它启动了一个新的进程。

使用“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);
        }
    }
}
...

最后,我不得不使用服务器套接字实现全局锁,如下所示:

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();
  }
}

这是一个充满挑战、有趣的情况!我认为,在同步时,顺序确实很重要。您需要在设计方法时从一开始就牢记这一点。@CottonSilk,但每个模块都是一个单独的APK,因此它在自己的进程中运行,Java不支持系统范围的互斥(至少我的google fu告诉我)。我正在寻找替代方案,如插座/管道锁等。单独APK中的每个模块……您能否详细说明一下要求,因为到目前为止这还没有问题,或者我可能无法理解。“一个包含多个模块的应用程序:我认为所有功能都在一个APK中。”Cottonsilk补充了说明。为错误的描述道歉。这里有一个链接()将Android描述为RESTFul客户端并访问远程数据库。也许它会有用。