2016-06-28 4 views
1

Я использую IBM Cloudant в своем приложении. Для подключения к удаленному db я использовал эту библиотеку: https://github.com/cloudant/sync-android . Я пытаюсь включить непрерывную репликацию в Android, но я не могу найти способ ее включить. Это код, который я использую:Репликация непрерывного непрерывного обновления Android

File path = getApplicationContext().getDir("datastores", Context.MODE_PRIVATE); 
DatastoreManager manager = new DatastoreManager(path.getAbsolutePath()); 

try { 
     Datastore ds = manager.openDatastore("mydatabase"); 
     IndexManager indexManager = new IndexManager(ds); 

    URI uri = new URI(myuri); 
    // Create a replicator that replicates changes from the remote 
    // database to the local datastore. 
    Replicator replicator = ReplicatorBuilder.pull().from(uri).to(ds).build(); 
    // Use a CountDownLatch to provide a lightweight way to wait for completion 
    CountDownLatch latch = new CountDownLatch(1); 
    Listener listener = new Listener(latch); 
    replicator.getEventBus().register(listener); 
    replicator.start(); 
    latch.await(); 
    replicator.getEventBus().unregister(listener); 
    if (replicator.getState() != Replicator.State.COMPLETE) { 
     System.out.println("Error replicating FROM remote"); 
     System.out.println(listener.error); 
    } 

    } catch (DatastoreException datastoreException) { 

    System.err.println("Problem opening datastore: "+datastoreException); 

    } catch (Exception documentException) { 

    System.err.println("Problem: "+documentException); 
} 

и слушатель определяется следующим образом:

private class Listener { 
    private final CountDownLatch latch; 
    public ErrorInfo error = null; 
    public int documentsReplicated; 
    public int batchesReplicated; 

    Listener(CountDownLatch latch) { 
     this.latch = latch; 
    } 
    @Subscribe 
    public void complete(ReplicationCompleted event) { 
     this.documentsReplicated = event.documentsReplicated; 
     this.batchesReplicated = event.batchesReplicated; 
     latch.countDown(); 
    } 
    @Subscribe 
    public void error(ReplicationErrored event) { 
     this.error = event.errorInfo; 
     latch.countDown(); 
    } 
} 

В IOS, я использую подобный код:

CBLReplication *pullReplication = [_cblDatabase createPullReplication:synchronizationURL]; 

//THIS IS THE PART THAT I WOULD LIKE TO HAVE IN ANDROID 
pullReplication.continuous = YES; 

[pullReplication start]; 

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

Есть ли способ добавить этот вариант в Android?

ответ

1

Cloudant Sync (библиотека, которую вы используете на android) не поддерживает непрерывные репликации, поскольку они влияют на срок службы батареи. Если вы действительно хотите иметь непрерывную репликацию, когда вы получите уведомление о завершении репликации в вашем методе public void complete(ReplicationCompleted event), вы должны перезапустить репликатор, используя метод start.