Skip to content
Use the Parse & Parse Live Query SDK's in Axway Titanium.
Branch: master
Clone or download
Latest commit f634c61 Apr 23, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
android Add basic Android parity Apr 14, 2018
example Add all remaining but useful where-chains, add "delete" API's for obj… Apr 23, 2018
ios Format all sources Apr 23, 2018
.gitignore Implement query and client Apr 13, 2018
LICENSE Add basic Android parity Apr 14, 2018 Add all remaining but useful where-chains, add "delete" API's for obj… Apr 23, 2018

Parse Live Query in Titanium

Use the Parse & Parse Live Query iOS and Android SDK's in Axway Titanium! Read more about the Parse Live Query API in the official native repositories:

Warning: While iOS is ready for production, Android is highly dependent on community contributions. Submit a pull request to expose new features, e.g. query subscriptions.


  • iOS: Swift 4.1+ (embedded into the hook in hooks/), iOS 8+
  • Android: Gradle, Android 4.1+
  • Titanium SDK 6.3.0+ (7.0.0+ for Android)

Usage with Ti.Facenook

If you use this module together with Ti.Facebook, you need to remove the Bolts.framework from


since it is already bundled with Ti.LiveQuery. Remember: In case you remove Ti.LiveQuery, put the framework back in our replace it with a fresh module version that contains the framework.



No additional setup required.


Add the following to the <android> manifest section of the tiapp.xml:

<application ...>
  <meta-data android:name="com.parse.SERVER_URL" android:value="YOUR_SERVER_URL" />
  <meta-data android:name="com.parse.APPLICATION_ID" android:value="YOUR_APP_ID" />




initialize(args: Dictionary)
  • applicationId (String)
  • clientKey (String)
  • server (String)
  • localDatastoreEnabled (Boolean)
createClient(args: Dictionary) iOS only
  • applicationId (String)
  • clientKey (String)
  • server (String)
  • className (String)
  • parameters (Dictionary)
  • callback (Function)

Constants iOS only


Client iOS only


isConnected() -> Boolean
  • query (Query)
  • className (String)
  • query (String)

Events iOS only

  • query (Query)
  • query (Query)
  • type (EVENT_TYPE_*)
  • object (Object)
  • query (Query)
  • error (String)
  • query (Query)

Query iOS only

Initializer (createQuery(args))

  • className (String)
  • predicate (String, optional, e.g. name = "hans")
  • predicateArguments (String, optional, e.g. myUsers)

Note: When using predicateArguments, you write a template based placeholder inside the predicate parameter and fill it with the arguments passed in predicateArguments, e.g.

var query = LiveQuery.createQuery({
  className: 'User',
  predicate: 'userId in %@'
  predicateArguments: users // an array of users

Note: If you use predicates, you may constraint your query for additional where clauses.


whereKeyContainedIn(key, array) -> Query
  • key (String)
  • array (Array)
whereKeyNotContainedIn(key, array) -> Query
  • key (String)
  • array (Array)
whereKeyContainsAllObjectsInArray(key, array) -> Query
  • key (String)
  • array (Array)
whereKeyEqualTo(key, object) -> Query
  • key (String)
  • object (Any)
whereKeyNotEqualTo(key, object) -> Query
  • key (String)
  • object (Any)
whereKeyLessThan(key, object) -> Query
  • key (String)
  • object (Any)
whereKeyLessThanOrEqualTo(key, object) -> Query
  • key (String)
  • object (Any)
whereKeyGreaterThan(key, object) -> Query
  • key (String)
  • object (Any)
whereKeyGreaterThanOrEqualTo(key, object) -> Query
  • key (String)
  • object (Any)
whereKeyExists(key) -> Query
  • key (String)
whereKeyDoesNotExist(key) -> Query
  • key (String)
includeKeys(keys) -> Query
  • keys (Array)
selectKeys(keys) -> Query
  • keys (Array)
orderByAscending(key) -> Query
  • key (String)
orderByDescending(key) -> Query
  • key (String)
  • callback (Function)

Object iOS only


parseClassName (String)
objectId (String)
createdAt (String)
updatedAt (String)
allKeys (Array)


objectForKey(key) -> Any
setObjectForKey(object, key)
deleteObject(callback) -> Varying

If a callback function is used, it will be called asynchronous. Otherwise, it returns a synchronous boolean indicating if it was completed successfully or not.

saveObject(callback) -> Varying

If a callback function is used, it will be called asynchronous. Otherwise, it returns a synchronous boolean indicating if it was completed successfully or not.

Compile native libraries


This project uses the following 5 Swift dependencies:

  • Bolds
  • BoldsSwift
  • Parse
  • ParseLiveQuery
  • Starscream

While Bolds and Parse are Obj-C based, the others are dynamic Swift libraries. This projects resolves all dependencies already for you, including setting the Swift version using the hook placed in hooks/.

Right now, Titanium only supports CocoaPods for Hyperloop, so in order to use it for classic modules, you need to create universal "fat" frameworks and strip the unused architectures again (this is taken care of by the SDK already). A universal library can be created by grabbing the frameworks from Debug-iphonesimulator (Simulator architectures) and Debug-iphoneos (Device architectures) and combine them using the following commands:

  1. Install CocoaPods (sudo gem install cocoapods) and run pod install in the native/ directory of this repository
  2. Create the following folder structures: sim/, device/ & universal/
  3. Copy the .framework files from Debug-iphonesimulator to sim/
  4. Copy the .framework files from Debug-iphoneos to device/
  5. Copy the .framework files from device to universal/ (they are the base for universal frameworks)
  6. For BoldsSwift and ParseLiveQuery, copy the Modules/*.swiftmodule to the universal directory of the framework
  7. Use the following command to merge the sim- and device-frameworks together:
lipo -create -output universal/<name>.framework/<name> sim/<name>.framework/<name> device/<name>.framework/<name>
  1. Replace the final frameworks in <module-project>/platform
  2. Make a pull request to this repo, so others can benefit from it as well

These steps are based on a Shell Script used natively.

Note: In the future, this will all be done by CocoaPods. Make sure to follow TIMOB-25927 regarding Swift support in the SDK.


  1. Install Gradle and go to android/
  2. Run gradle getDeps
  3. Validate that the libraries are copied to lib/


var ParseLiveQuery = require('ti.livequery');

var win = Ti.UI.createWindow({
  backgroundColor: '#fff'

var btn1 = Ti.UI.createButton({
  title: 'Initialize Parse',
  top: 100

var btn2 = Ti.UI.createButton({
  title: 'Subscribe',
  top: 200

btn1.addEventListener('click', function() {
    applicationId: '',
    clientKey: '',
    server: ''

// iOS only
btn2.addEventListener('click', function() {
  var client = ParseLiveQuery.createClient({
    applicationId: '',
    clientKey: '',
    server: ''

  client.addEventListener('subscribe', function(e) {'Subscribed!');
    // Subscribed

  client.addEventListener('unsubscribe', function(e) {'Unsubscribed!');
    // Unsubscribed

  client.addEventListener('event', function(e) {'Event!');


    // Event received, check with e.type

  client.addEventListener('error', function(e) {'Error!');;
    // Error received, check with e.error

  var query = ParseLiveQuery.createQuery({
    className: 'Posts',
    predicate: 'name = "Hans"'


  // Get existing objects
  query.findObjectsInBackground(function(e) {;
    var objects = e.objects;

    for (var i = 0; i < objects.length; i++) {

// Utility method to print objects by using "objectForKey"
function printObject(object) {
  var allKeys = object.allKeys;

  for (var i = 0; i < allKeys.length; i++) {
    var key = allKeys[i];
    var value = object.objectForKey(key); + ' = ' + value);



Hans Knöchel (@hansemannnn / Web)


Apache 2.0


Code contributions are greatly appreciated, please submit a new Pull-Request!

You can’t perform that action at this time.