IBM Cloud Data Services
http://elsmore.me/trains-planes-and-automobiles-talk/
Android | iOS | Web
Android | iOS | Web
Only following Android and Webcompile 'com.cloudant:cloudant-sync-datastore-android:latest.release'
npm install --save pouchdb
bower install --save pouchdb
Android:
DatastoreManager manager = new DatastoreManager(
ctx.getDir("cloudantsync", Context.MODE_PRIVATE)
);
Datastore ds = manmager.openDatastore("droidConRo16");
Javascript:
var db = new PouchDB('my_database');
Android:
MutableDocumentRevision revision = new MutableDocumentRevision();
Map<String,String> body = new HashMap<String, String>();
body.put("event", "droidcon";
body.put("type", "conference");
body.put("date", "2016-03-12");
revision.body = DocumentBodyFactory.create(body);
Javascript:
var doc = {
event: "droidcon",
type: "conference",
date: "2016-03-12"
}
Android:
DocumentRevision rev = datastore.createDocumentFromRevision(revision);
Javascript:
db.post(doc, [options], [callback]);
db.post(doc, function (err, response) {
if (err) { return console.log(err); }
// handle response
});
Android:
datastore.getDocument("droidcon");
Javascript:
db.get(docId, [options], [callback]);
db.get('droidcon', function(err, doc) {
if (err) { return console.log(err); }
// handle doc
});
Skip conflicts
Don't talk too much detail on interceptors
keep it simple
talk more about arch in the round about here's how it all looks.Android:
DocumentRevision rev = datastore.getDocument("droidcon");
MutableDocumentRevision mutable = rev.mutableCopy();
Map<String,Object> body = rev.body.asMap();
body.put("talk","Planes, Trains & Automobiles");
mutable.body = DocumentBodyFactory.create(body);
rev = datastore.updateDocumentFromRevision(mutable);
Javascript:
db.put(doc, [docId], [docRev], [options], [callback]);
db.get('droidcon', function(err, doc) {
if (err) { return console.log(err); }
db.put({
_id: 'droidcon',
_rev: doc._rev,
talk: "Planes, Trains & Automobiles"
}, function(err, response) {
if (err) { return console.log(err); }
// handle response
});
});
Android:
datastore.deleteDocumentRevision(rev);
// Or
datastore.deleteDocument("droidcon");
Javascript:
db.remove(docId, [docRev], [options], [callback]);
db.get('droidcon', function(err, doc) {
if (err) { return console.log(err); }
db.remove(doc, function(err, response) {
if (err) { return console.log(err); }
// handle response
});
});
Android:
IndexManager indexManager = new IndexManager(datastore);
Object[] fields = {"conference"};
indexManager.ensureIndexed(Arrays.toList(fields), "conference");
Map<String,Object> selector = new HashMap<String,Object>();
selector.put("conference","droidcon");
QueryResult result = indexManager.find(selector);
for(DocumentRevision rev:result){
// do something with the found document.
}
Javascript Design Doc:
db.query(fun, [options], [callback]);
// create a design doc
var ddoc = {
_id: '_design/index',
views: {
index: {
map: function mapFun(doc) {
if (doc.type) {
emit(doc.type);
}
}.toString()
}
}
}
Javascript MapReduce:
// save the design doc
db.put(ddoc, function (err) {
if (err && err.status !== 409) {
return console.log(err);
}
// ignore if doc already exists
// find docs where type === 'conference'
db.query('index', {
key: 'conference',
include_docs: true
}, function (err, result) {
if (err) { return console.log(err); }
// handle result
});
});
// Or use existing DDoc
Android:
URL remoteDB = new URL("http://example.com/db");
// pull
Replicator pull = ReplicatorBuilder.pull().from(remoteDB).to(datastore).build();
pull.start();
// push
Replicator push = ReplicatorBuilder.push().from(datastore).to(remoteDB).build();
push.start();
Javascript:
PouchDB.replicate(source, target, [options]); db.replicate.to(remoteDB, [options]); // or db.replicate.from(remoteDB, [options]);
Android:
Changes changes = datastore.changes(0, 25);
for (DocumentRevision rev : changes.getResults()){
// do something with the change
}
// get the next set of changes
changes = datastore.changes(changes.getLastSequence(),25);
//process those changes.
Javascript:
db.changes(options);
var changes = db.changes({
since: 'now',
live: true,
include_docs: true
}).on('change', function(change) {
// handle change
}).on('complete', function(info) {
// changes() was canceled
}).on('error', function (err) {
console.log(err);
});
changes.cancel();
public class LoggingInterceptor implements HttpConnectionRequestInterceptor,
HttpConnectionResponseInterceptor {
Logger logger = Logger.getLogger(LoggingInterceptor.class.getCanonicalName());
@Override
public HttpConnectionInterceptorContext interceptRequest(
HttpConnectionInterceptorContext context) {
HttpURLConnection connection = context.connection.getConnection();
logger.info("Making request to "+connection.getURL();
return context;
}
@Override
public HttpConnectionInterceptorContext interceptResponse(
HttpConnectionInterceptorContext context) {
HttpURLConnection connection = context.connection.getConnection();
String msg = "Request Complete: "+ connection.getURL()
+ "/" + connection.getResponseCode();
logger.info(msg);
return context;
}
Android APK: https://github.com/rhyshort/droidcon.ro16 PouchDB WebApp: https://github.com/ukmadlz/droidconro App for API Keys: https://github.com/ukmadlz/apikeyapp
/rhyshort
rhyshort@uk.ibm.com
/ukmadlz
mike.elsmore@uk.ibm.com
Caused By replication or cluster partition.
More detail: Blog post by Glynn Bird DevAdv @ IBM CDS https://cloudant.com/blog/introduction-to-document-conflicts-part-one
DocumentException
Primary Cause: - Document exists (Conflict)
DocumentNotFoundException
DocumentException
Casues:
DocumentException
causes: