To enable the encryption of local data stores on mobile devices, you must make updates to your application to include encryption capabilities and create encrypted data stores.
BEFORE (with IMFData/CloudantToolkit):
pod 'IMFDataLocal/SQLCipher'
pod 'CDTDatastore/SQLCipher'
pod install
#import <CloudantSync.h>
#import <CloudantSyncEncryption.h>
#import <CloudantToolkit/CloudantToolkit.h>
#import <IMFData/IMFData.h>
#import <CloudantSync.h>
#import <CloudantSyncEncryption.h>
//Get reference to data manager
IMFDataManager *manager = [IMFDataManager sharedInstance];
NSString *name = @"automobiledb";
NSError *error = nil;
// Initalize a key provider
id<CDTEncryptionKeyProvider> keyProvider = [CDTEncryptionKeychainProvider providerWithPassword: @"passw0rd" forIdentifier: @"identifier"];
//Initialize local store
CDTStore *localStore = [manager localStore: name withEncryptionKeyProvider: keyProvider error: &error];
let manager = IMFDataManager.sharedInstance()
let name = "automobiledb"
let keyProvider = CDTEncryptionKeychainProvider(password: "passw0rd", forIdentifier: "identifier")
var store:CDTStore?
do {
store = try manager.localStore(name, withEncryptionKeyProvider: keyProvider)
} catch let error as NSError {
// Handle error
}
// Get reference to datastore manager
CDTDatastoreManager *datastoreManager = existingDatastoreManager;
NSString *name = @"automobiledb";
NSError *error = nil;
// Create KeyProvider
id<CDTEncryptionKeyProvider> keyProvider = [CDTEncryptionKeychainProvider providerWithPassword: @"passw0rd" forIdentifier: @"identifier"];
//Create local store
CDTDatastore *datastore = [datastoreManager datastoreNamed:name withEncryptionKeyProvider:keyProvider error:&error];
// Get reference to datastore manager
let datastoreManager:CDTDatastoreManager = existingDatastoreManager
let name:String = "automobiledb"
//Create local store
var datastore:CDTDatastore?
let keyProvider = CDTEncryptionKeychainProvider(password: "passw0rd", forIdentifier: "identifier")
do{
datastore = try datastoreManager.datastoreNamed(name, withEncryptionKeyProvider: keyProvider)
}catch let error as NSError{
// Handle error
}
//Get reference to data manager
IMFDataManager *manager = [IMFDataManager sharedInstance];
NSString *databaseName = @"automobiledb";
// Initalize a key provider
id<CDTEncryptionKeyProvider> keyProvider = [CDTEncryptionKeychainProvider providerWithPassword:@"password" forIdentifier:@"identifier"];
// pull replication
CDTPullReplication *pull = [manager pullReplicationForStore: databaseName withEncryptionKeyProvider: keyProvider];
// push replication
CDTPushReplication *push = [manager pushReplicationForStore: databaseName withEncryptionKeyProvider: keyProvider];
//Get reference to data manager
let manager = IMFDataManager.sharedInstance()
let databaseName = "automobiledb"
// Initalize a key provider
let keyProvider = CDTEncryptionKeychainProvider(password: "password", forIdentifier: "identifier")
// pull replication
let pull:CDTPullReplication = manager.pullReplicationForStore(databaseName, withEncryptionKeyProvider: keyProvider)
// push replication
let push:CDTPushReplication = manager.pushReplicationForStore(databaseName, withEncryptionKeyProvider: keyProvider)
Replication with an encrypted database requires no changes from replication with an unencrypted database.

To encrypt data on an Android device, obtain encryption capabilities by including the correct libraries in your application. Then, you can initialize your local store for encryption and replicate data.
repositories {
mavenCentral()
}
dependencies {
compile 'com.ibm.mobile.services:cloudant-toolkit-local:1.0.0'
}
repositories {
mavenLocal()
maven { url "http://cloudant.github.io/cloudant-sync-eap/repository/" }
mavenCentral()
}
dependencies {
compile group: 'com.cloudant', name: 'cloudant-sync-datastore-core', version:'0.13.2'
compile group: 'com.cloudant', name: 'cloudant-sync-datastore-android', version:'0.13.2'
compile group: 'com.cloudant', name: 'cloudant-sync-datastore-android-encryption', version:'0.13.2'
}

// Get reference to DataManager
DataManager manager = DataManager.getInstance();
// Initalize a key provider
KeyProvider keyProvider = new AndroidKeyProvider(getContext(),"password","identifier");
// Create local store
String databaseName = "automobiledb";
Task<Store> storeTask = manager.localStore(databaseName, keyProvider);
storeTask.continueWith(new Continuation<Store, Void >() {
@Override
public Void then(Task<Store> task) throws Exception {
if (task.isFaulted()) {
// Handle error
} else {
// Do something with Store
Store store = task.getResult();
}
return null;
}
});

// Load SQLCipher libs
SQLiteDatabase.loadLibs(context);
// Create DatastoreManager
File path = context.getDir("databasedir", Context.MODE_PRIVATE);
DatastoreManager manager = new DatastoreManager(path.getAbsolutePath());
// Create encrypted local store
String name = "automobiledb";
KeyProvider keyProvider = new AndroidKeyProvider(context,"passw0rd","identifier");
Datastore datastore = manager.openDatastore(name, keyProvider);

//Get reference to data manager
DataManager manager = DataManager.getInstance();
String databaseName = "automobiledb";
// Initalize a key provider
KeyProvider keyProvider = new AndroidKeyProvider(getContext(),"password","identifier");
// pull replication
Task<PushReplication> pullTask = manager.pullReplicationForStore(databaseName, keyProvider);
// push replication
Task<PushReplication> pushTask = manager.pushReplicationForStore(databaseName, keyProvider);
Replication with an encrypted database requires no changes from replication with an unencrypted database.