Search code examples
androidcouchbasecouchbase-litecouchbase-sync-gateway

How to setup sync URL in couchbase sync gateway to connect to couchbase server


I am trying to use CouchBase Lite for my mobile app. I have seen in tutorial of couchbase but it shows how to add sync URL for walrus server not couchbase server. How can I set up sync URL for couchbase server.

Following is the code which I am using but unable to put or get data from couchbase server

private URL createSyncURL(boolean isEncrypted){ URL syncURL = null; String host = "https://127.0.0.1"; String port = "4986"; bucketName = "sync_gateway"; try { syncURL = new URL(host + ":" + port + "/" + bucketName); } catch (MalformedURLException me) { me.printStackTrace(); } return syncURL; }

config.json file for sync gateway is below

{
    "log":["CRUD+", "REST+", "Changes+", "Attach+"],
    "interface":":4986",
   "adminInterface":":14985",
    "databases": {
    "sync_gateway": {
        "server":"http://localhost:8091",
        "bucket":"sync_gateway",
        "sync":`
            function (doc) {
            channel (doc.channels);
        }`,
        "users": {
            "GUEST": {
                "disabled": false,
                "admin_channels": ["*"]
            }
        }
    }
    }
}

and below is the android app code

package com.couchbase.examples.couchbaseevents;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.util.Log;

import com.couchbase.lite.CouchbaseLiteException;
import com.couchbase.lite.Database;
import com.couchbase.lite.Document;
import com.couchbase.lite.Manager;
import com.couchbase.lite.android.AndroidContext;
import com.couchbase.lite.replicator.Replication;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    public static final String DB_NAME = "couchbaseevents";
    final String TAG = "CouchbaseEvents";
    Database database = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(TAG, "Begin Couchbase Events App");
    Manager manager = null;
    try {
        manager = new Manager(new AndroidContext(this), Manager.DEFAULT_OPTIONS);
        database = manager.getDatabase(DB_NAME);
    } catch (Exception e) {
        Log.d(TAG, "Error getting database", e);
        return;
    }
    Document createdDocument = createDocument(database);
    Log.d(TAG, "createdDocument=" + String.valueOf(createdDocument.getProperties()));
    // retrieve the document from the database
    Document retrievedDocument = database.getDocument(createdDocument.getId());
// display the retrieved document
    Log.d(TAG, "retrievedDocument=" + String.valueOf(retrievedDocument.getProperties()));
    updateDoc(database, createdDocument.getId());
    Document updatedDocument = database.getDocument(createdDocument.getId());
    Log.d(TAG, "updatedDocument=" + String.valueOf(updatedDocument.getProperties()));
    try {
        startReplications();
    } catch (CouchbaseLiteException e) {
        e.printStackTrace();
    }
    Log.d(TAG, "End Couchbase Events App");
    }
    private void updateDoc(Database database, String documentId) {
    Document document = database.getDocument(documentId);
    try {
        // Update the document with more data
        Map<String, Object> updatedProperties = new HashMap<String, Object>();
        updatedProperties.putAll(document.getProperties());
        updatedProperties.put("eventDescription", "Everyone is invited!");
        updatedProperties.put("address", "123 Elm St.");
        // Save to the Couchbase local Couchbase Lite DB
        document.putProperties(updatedProperties);
    } catch (CouchbaseLiteException e) {
        Log.e(TAG, "Error putting", e);
    }
    }
    private Document createDocument(Database database) {
    // Create a new document and add data
    Document document = database.createDocument();
    String documentId = document.getId();
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("name", "Big Party");
    map.put("location", "My House");
    try {
        // Save the properties to the document
        document.putProperties(map);
    } catch (CouchbaseLiteException e) {
        Log.e(TAG, "Error putting", e);
    }
    Document document1 = database.createDocument();
    documentId = document1.getId();
    Map<String, Object> map1 = new HashMap<String, Object>();
    map1.put("name", "Yagyank");
    map1.put("location", "GGn");
    try {
        // Save the properties to the document
        document1.putProperties(map1);
    } catch (CouchbaseLiteException e) {
        Log.e(TAG, "Error putting", e);
    }
    Document document2 = database.createDocument();
    documentId = document2.getId();
    Map<String, Object> map2 = new HashMap<String, Object>();
    map2.put("name", "Farheen");
    map2.put("location", "GGn");
    try {
        // Save the properties to the document
        document2.putProperties(map2);
    } catch (CouchbaseLiteException e) {
        Log.e(TAG, "Error putting", e);
    }
    return document2;
    }
    private URL createSyncURL(boolean isEncrypted){
    URL syncURL = null;
    String host = "127.0.0.1";
    String port = "4986";
    String dbName = "sync_gateway";
    try {
        syncURL = new URL("http://127.0.0.1:4986/sync_gateway");
        //syncURL = new URL(host + ":" + port + "/" + dbName);
    } catch (Exception me) {
        me.printStackTrace();
    }
    Log.d(syncURL.toString(),"URL");
    return syncURL;
    }
    private void startReplications() throws CouchbaseLiteException {
    Replication pull = database.createPullReplication(this.createSyncURL(false));
    Replication push = database.createPushReplication(this.createSyncURL(false));
    pull.setContinuous(true);
    push.setContinuous(true);
    pull.start();
    push.start();
    if(!pull.isRunning()){
        Log.d(TAG, "MyBad");
    }
    /*if(!push.isRunning()) {
        Log.d(TAG, "Replication is not running due to " +push.getLastError().getMessage());
        Log.d(TAG, "Replication is not running due to " +push.getLastError().getCause());
        Log.d(TAG, "Replication is not running due to " +push.getLastError().getStackTrace());
        Log.d(TAG, "Replication is not running due to " +push.getLastError().toString());
    }*/
    }

}

Solution

  • You can't sync directly to Couchbase Server. You have to sync with the Sync Gateway. The Sync Gateway can have two backends: Walrus (in-memory backend) and Couchbase Server.

    From your mobile app perspective the backend does not matter. You need to give the sync gateway URL. Assuming the Sync Gateway is running on your local machine, and that you are using the android emulator to test your app, the URL should be http://10.0.2.2:5984/sync_gateway