Developing Mobile Apps for .NET: Couchbase Connect 2014

36
Developing Mobile Apps for .NET Zack Gramana | Senior Software Engineer, Couchbase

description

Speaker: Zack Gramana, Couchbase This talk will present an overview of building apps using Couchbase Lite on the Xamarin platform. * A demonstration of a Xamarin app that is able to sync data between two devices. * An overview of the major components of Couchbase Lite: – Sync – Documents – Views and Queries * A description of how document conflict resolution works. * An overview of the resources and sample projects available. By the end of the talk you should have a high enough level of understanding to design and build your own app on top of Couchbase Lite.

Transcript of Developing Mobile Apps for .NET: Couchbase Connect 2014

Page 1: Developing Mobile Apps for .NET: Couchbase Connect 2014

Developing Mobile Apps for .NET

Zack Gramana | Senior Software Engineer, Couchbase

Page 2: Developing Mobile Apps for .NET: Couchbase Connect 2014

Couchbase Lite In A Nutshell

Page 3: Developing Mobile Apps for .NET: Couchbase Connect 2014

Highlights

• Document Database

• Map Reduce Queries

• Sync

• Small: Assembly is < 500KB

Page 4: Developing Mobile Apps for .NET: Couchbase Connect 2014

Document Database Overview

• Semi-structured

• Key-value pairs

• Schemaless

• JSON-backed

• Very low-friction

Page 5: Developing Mobile Apps for .NET: Couchbase Connect 2014

Map Reduce Queries Overview

• Functional queries, instead of set-theoretic

• Write query logic in pure C#, not SQL

• Can be one-off, or auto-updating as data

changes

• You probably already know how to use it:

– Map is like LINQ’s Select method

– Reduce is like LINQ’s Aggregate method

Page 6: Developing Mobile Apps for .NET: Couchbase Connect 2014

Sync Overview

• Master-master replication

• Uses HTTP + REST

• Offline mode for free

• Manual or continuous modes

• Automatic retry on failure

• Responds to network changes

Page 7: Developing Mobile Apps for .NET: Couchbase Connect 2014

Programming Model

• You: make your changes to docs

• Queries: will reflect those changes

• Replicators: sync changes for you

Page 8: Developing Mobile Apps for .NET: Couchbase Connect 2014

Getting Started with Documents

Page 9: Developing Mobile Apps for .NET: Couchbase Connect 2014

Opening a Database

var db = Manager.SharedInstance.GetDatabase("foo");

Debug.Assert(db != null);

var db = Manager.SharedInstance.GetExistingDatabase("foo");

Debug.Assert(db == null);

Page 10: Developing Mobile Apps for .NET: Couchbase Connect 2014

Getting a Document

var doc = db.GetDocument("foo-doc");

Debug.Assert(doc != null);

var doc = db.GetExistingDocument("foo-doc");

Debug.Assert(doc == null);

Page 11: Developing Mobile Apps for .NET: Couchbase Connect 2014

Creating a Document

var doc = db.CreateDocument();

Debug.Assert(doc.Id != null);

Page 12: Developing Mobile Apps for .NET: Couchbase Connect 2014

Deleting a Document

doc.Delete();

Debug.Assert(doc.Deleted);

Page 13: Developing Mobile Apps for .NET: Couchbase Connect 2014

Updating a New Document

var rev = doc.CreateRevision();

var props = new Dictionary<string, object>

{

{ "foo", "bar"},

{ "fizz", "buzz"}

};

rev.SetUserProperties(props);

rev.Save();

Page 14: Developing Mobile Apps for .NET: Couchbase Connect 2014

Updating an Existing Document

var props = doc.Properties;

var newProps = new Dictionary<string, object>(props)

{

{ "foo", "bar"}

};

doc.PutProperties(newProps); // Saves a new revision

Page 15: Developing Mobile Apps for .NET: Couchbase Connect 2014

Dealing with Changes

doc.Change += (sender, e) => {

// e.g. if we get a conflict...if (e.Change.IsConflict){

// we can resolve it!}

};

Page 16: Developing Mobile Apps for .NET: Couchbase Connect 2014

DocumentChange Members

String

Boolean

Boolean

String

Uri

RevisionInternal

DocumentId

IsConflict

IsCurrentRevision

RevisionId

SourceUrl

WinningRevision

Page 17: Developing Mobile Apps for .NET: Couchbase Connect 2014

Handling Conflicts

var current = doc.CurrentRevision;foreach(var rev in doc.ConflictingRevisions){

var newRev = rev.CreateRevision();if (rev.Equals(current)) {

newRev.SetProperties(mergedProps);} else {

newRev.IsDeletion = true;}newRev.Save();

}

Page 18: Developing Mobile Apps for .NET: Couchbase Connect 2014

Auto-merging Properties using LINQ

Dictionary<string, object> mergedProps;

try

{

mergedProps = doc.ConflictingRevisions

.SelectMany(rev => rev.UserProperties)

.Distinct()

.ToDictionary(

kvp => kvp.Key,

kvp => kvp.Value

);

} catch (ArgumentException ex) {

// Merge conflict requires manual resolution.

}

Page 19: Developing Mobile Apps for .NET: Couchbase Connect 2014

Getting Started with Queries

Page 20: Developing Mobile Apps for .NET: Couchbase Connect 2014

Create a View

var view = db.GetView("foo");

Debug.Assert(view != null);

var view = db.GetExistingView("foo");

Debug.Assert(view == null);

Page 21: Developing Mobile Apps for .NET: Couchbase Connect 2014

Add a Map Function

view.SetMap((doc, emit) =>

{

var foo = (String)doc["foo"];

if (foo.Equals("bar")) {

emit ("text", doc["text"]);

}

}, "1");

Page 22: Developing Mobile Apps for .NET: Couchbase Connect 2014

Using a Reduce Function

ReduceDelegate reducer = (keys, values, rereduce) => {

var i = 0; var wordCount = 0;foreach(var key in keys) {

if (key == "text") {var str = (String)values[i];wordCount += str.Split(' ').Length;

}}return wordCount;

};view.SetMapReduce(mapper, reducer, "1");

Page 23: Developing Mobile Apps for .NET: Couchbase Connect 2014

Create a Query

var query = view.CreateQuery();

// Options, like...

query.Completed += (sender, e) => {Log("Results: {0}", e.Rows);

};

query.Descending = true;

// Get records...

var rows = await query.RunAsync();rows.Where(row => ...);

Page 24: Developing Mobile Apps for .NET: Couchbase Connect 2014

Create a LiveQuery

var liveQuery = query.ToLiveQuery();

// Respond to changes in the view.

liveQuery.Changed += (sender, e) =>

{

Log("Updates: {0}", e.Rows.Count);

};

Page 25: Developing Mobile Apps for .NET: Couchbase Connect 2014

Getting Started with Replication

Page 26: Developing Mobile Apps for .NET: Couchbase Connect 2014

Pull Replicator

var uri = new Uri(syncGatewayUrl);

var pull = db.CreatePullReplication(uri);

pull.Continuous = true;

pull.Changed += ReplicationChanged;

pull.Start();

Page 27: Developing Mobile Apps for .NET: Couchbase Connect 2014

Push Replicator

var uri = new Uri(syncGatewayUrl);

var push = db.CreatePushReplication(uri);

push.Continuous = true;

push.Changed += ReplicationChanged;

push.Start();

Page 28: Developing Mobile Apps for .NET: Couchbase Connect 2014

Next Steps

Page 29: Developing Mobile Apps for .NET: Couchbase Connect 2014

Couchbase Developer Portaldeveloper.couchbase.com/mobile

Page 30: Developing Mobile Apps for .NET: Couchbase Connect 2014

Xamarin Component Store

https://components.xamarin.com/view/couchb

ase-lite-net

Page 31: Developing Mobile Apps for .NET: Couchbase Connect 2014

Nugethttps://www.nuget.org/packages/couchbase.lite/

Page 32: Developing Mobile Apps for .NET: Couchbase Connect 2014

Questions and Answers

Page 33: Developing Mobile Apps for .NET: Couchbase Connect 2014

Additional Resources

Page 34: Developing Mobile Apps for .NET: Couchbase Connect 2014

Mailing List

groups.google.com/d/forum/mobile-

couchbase

Page 35: Developing Mobile Apps for .NET: Couchbase Connect 2014

Contact [email protected] (email)

@zgramana (twitter)

Page 36: Developing Mobile Apps for .NET: Couchbase Connect 2014

Thanks!

©2014 Couchbase, Inc. 36