QuickBlox Documentation

QuickBlox provides powerful Chat API and SDK to add real-time messaging and video calls to your web and mobile apps. Learn how to integrate QuickBlox across multiple platforms.

Custom Objects

Learn how to store and sync data with QuickBlox key-value storage.

Custom Objects module provides flexibility to define any data structure (schema) you need, build one-to-many relations between schemas and control permissions for all operations made on data. Schema is defined in QuickBlox Dashboard.

There are two key concepts in Custom Objects:
- Class represents your schema and contains field names and types.
- Record represents the data you put into your schema.

Class and Record are similar to table and row in relational database. Every class in Custom Object module comes with five mandatory predefined fields: _id, user_id, parent_id, created_at, and updated_at.

Allowed data types: Integer (or Array of Integer); String (or Array of String); Float (or Array of Float); Boolean (or Array of Boolean); Location (Array of [< longitude >, < latitude >]); File; Date.

Before you begin

  1. Visit our Key Concepts page to get an overall understanding of the most important QuickBlox concepts.
  2. Register a QuickBlox account. This is a matter of a few minutes and you will be able to use this account to build your apps.
  3. Configure QuickBlox SDK for your app. Check out our Setup page for more details.
  4. Create a user session to be able to use QuickBlox functionality. See our Authentication page to learn how to do it.

Create class

πŸ“˜

Make sure that you have already added the appropriate dependency to your app-level build.gradle file. Review this section for more details.

To start using Custom Objects module, create a class:

  1. Go to QuickBlox Dashboard.
  2. Follow Custom => Add => Add new class direction. As a result, Add new class popup will appear.
  3. Enter a class name, add any fields you want.
  1. Click Create class button to create a new class.

Create records

The easiest way to create a new record from the QuickBlox Dashboard, do the following:

  1. Follow Custom => Current class => Your Class direction.
  2. Click Add => Add record button and Add new record popup will appear.
  3. Fill in any fields you want.
  4. Click Add record button and a new record will be added and shown in the table.

To create a single object, use the code snippet below.

QBCustomObject customObject = new QBCustomObject();

// Put fields
customObject.putString("text", "Lorem ipsum dolor sit amen");
customObject.putInteger("version", 7);
customObject.putArray("tags", Arrays.asList("#test", "#customobjects", "#quickblox-android-sdk"));
customObject.putArray("friendsIds", Arrays.asList(12345, 12346, 12347));

// Set the class name
customObject.setClassName("CustomObject2");

QBCustomObjects.createObject(customObject).performAsync(new QBEntityCallback<QBCustomObject>() {
    @Override
    public void onSuccess(QBCustomObject createdObject, Bundle params) {
        // Object created successfully
    }

    @Override
    public void onError(QBResponseException errors) {
        // Error occured
    }
});
val customObject = QBCustomObject()

// Put fields
customObject.putString("text", "Lorem ipsum dolor sit amen")
customObject.putInteger("version", 7)
customObject.putArray("tags", arrayListOf("#test", "#customobjects", "#quickblox-android-sdk"))
customObject.putArray("friendsIds", arrayListOf(12345, 12346, 12347))

// Set the class name
customObject.className = "CustomObject2"

QBCustomObjects.createObject(customObject).performAsync(object : QBEntityCallback<QBCustomObject> {
    override fun onSuccess(createdObject: QBCustomObject, params: Bundle) {
        // Object created successfully
    }

    override fun onError(errors: QBResponseException) {
        // Error occured
    }
})

To create multiple objects, use the code snippet below.

QBCustomObject customObject1 = new QBCustomObject();
customObject1.putString("text", "Lorem ipsum dolor sit amen");
customObject1.putInteger("version", 1000);
customObject1.putArray("tags", Arrays.asList("#test", "#customobjects", "#quickblox-android-sdk"));
customObject1.putArray("friendsIds", Arrays.asList(12345, 12346, 12347));
customObject1.setClassName("CustomObject2");

QBCustomObject customObject2 = new QBCustomObject();
customObject2.putString("text", "Lorem ipsum dolor sit amen");
customObject2.putInteger("version", 1001);
customObject2.putArray("tags", Arrays.asList("#test", "#customobjects", "#quickblox-android-sdk"));
customObject2.setClassName("CustomObject2");

List<QBCustomObject> customObjects = new ArrayList<>();
customObjects.add(customObject1);
customObjects.add(customObject2);

QBCustomObjects.createObjects(customObjects).performAsync(new QBEntityCallback<ArrayList<QBCustomObject>>() {
    @Override
    public void onSuccess(ArrayList<QBCustomObject> qbCustomObjects, Bundle bundle) {
        // New records created
    }

    @Override
    public void onError(QBResponseException errors) {
        // Handle error
    }
});
val customObject1 = QBCustomObject()
customObject1.putString("text", "Lorem ipsum dolor sit amen")
customObject1.putInteger("version", 1000)
customObject1.putArray("tags", Arrays.asList("#test", "#customobjects", "#quickblox-android-sdk"))
customObject1.putArray("friendsIds", Arrays.asList(12345, 12346, 12347))
customObject1.className = "CustomObject2"

val customObject2 = QBCustomObject()
customObject2.putString("text", "Lorem ipsum dolor sit amen")
customObject2.putInteger("version", 1001)
customObject2.putArray("tags", Arrays.asList("#test", "#customobjects", "#quickblox-android-sdk"))
customObject2.className = "CustomObject2"

val customObjects = ArrayList<QBCustomObject>()
customObjects.add(customObject1)
customObjects.add(customObject2)

QBCustomObjects.createObjects(customObjects).performAsync(object : QBEntityCallback<ArrayList<QBCustomObject>> {
    override fun onSuccess(qbCustomObjects: ArrayList<QBCustomObject>, bundle: Bundle) {
        // New records created
    }

    override fun onError(errors: QBResponseException) {
        // Handle error
    }
})

🚧

Make sure that className is the same in all objects.
The current Class should be created in the Admin Panel previously.
You can create multiple items for a single custom class. The name will be taken from the first item in the list.

Retrieve records by IDs

To get records with a particular record ID, use the getObjectsByIds() method. Set the record ID using the coIDs object. Go over Filter and Search operators sections to learn about filters and search operators you can use to retrieve records.

StringifyArrayList<String> coIDs = new StringifyArrayList<String>();
coIDs.add("50e67e6e535c121c66004c74");
coIDs.add("50e67e6d535c127f66004f47");
coIDs.add("50e67e6b535c121c66004c72");
coIDs.add("50e59f81535c121c660015fd");

QBCustomObjects.getObjectsByIds("Note", coIDs).performAsync(new QBEntityCallback<ArrayList<QBCustomObject>>() {
    @Override
    public void onSuccess(ArrayList<QBCustomObject> customObjects, Bundle params) {
        // Records retrieved
    }

    @Override
    public void onError(QBResponseException errors) {
        // Handle error
    }
});
val coIDs = StringifyArrayList<String>()
coIDs.add("50e67e6e535c121c66004c74")
coIDs.add("50e67e6d535c127f66004f47")
coIDs.add("50e67e6b535c121c66004c72")
coIDs.add("50e59f81535c121c660015fd")

QBCustomObjects.getObjectsByIds("Note", coIDs).performAsync(object : QBEntityCallback<ArrayList<QBCustomObject>> {
    override fun onSuccess(customObjects: ArrayList<QBCustomObject>, params: Bundle) {
        // Records retrieved
    }

    override fun onError(errors: QBResponseException) {
        // Handle error
    }
})
var 
    className = "Note",
  filter = {
    '_id': {
      'in' ['5f59b10fa0eb4772bd5e9976','5f59a76ca28f9a28032944d3']
    }
  };

QB.data.list(className, filter, function(err, result) {
  if (err) {
  } else {
  }
});

Retrieve records

Search for records of a particular class using filters and/or search operators.

QBRequestGetBuilder requestBuilder = new QBRequestGetBuilder();
requestBuilder.gt("rating", "5.5");
requestBuilder.setLimit(5);
requestBuilder.eq("documentary", "false");
requestBuilder.sortAsc("rating");

QBCustomObjects.getObjects("Movie", requestBuilder).performAsync(new QBEntityCallback<ArrayList<QBCustomObject>>() {
    @Override
    public void onSuccess(ArrayList<QBCustomObject> customObjects, Bundle params) {
        // Objects Successfully Loaded
    }

    @Override
    public void onError(QBResponseException errors) {
        // Handle error
    }
});
val requestBuilder = QBRequestGetBuilder()
requestBuilder.gt("rating", "5.5")
requestBuilder.limit = 5
requestBuilder.eq("documentary", "false")
requestBuilder.sortAsc("rating")

QBCustomObjects.getObjects("Movie", requestBuilder).performAsync(object : QBEntityCallback<ArrayList<QBCustomObject>> {
    override fun onSuccess(customObjects: ArrayList<QBCustomObject>, params: Bundle) {
        // Objects Successfully Loaded
    }

    override fun onError(errors: QBResponseException) {
        // Handle error
    }
})

Filters

Here are the filters that you can use to retrieve records.

Filter

Applicable to types

Description

{field_name}

All types

Search records with the field which contains the specified value.

{field_name}[{search_operator}]

All types

Search a record with the field which contains the value according to the specified value and operator.

sort_asc

All types

Search results will be sorted by the specified field in ascending order.

sort_desc

All types

Search results will be sorted by the specified field in descending order.

skip

Integer

Skip N records in search results. Useful for pagination. Default (if not specified): 0.

limit

Integer

Limit search results to N records. Useful for pagination. Default value: 100. If limit is equal to 1, only the last record will be returned.

count

Integer

Count search results. Response will contain only count of records found.

output[include]

All types

The output parameter takes the form of a record with a list of fields for inclusion or exclusion from the result set. output[include] specifies the fields to include. The _id field is, by default, included in the result set. To exclude the _id field from the result set, you need to specify in the output[exclude] value the exclusion of the _id field.

output[exclude]

All types

The output parameter takes the form of a record with a list of fields for inclusion or exclusion from the result set. output[exclude] specifies the fields to exclude. The _id field is, by default, included in the result set. To exclude the _id field from the result set, you need to specify in the output[exclude] value the exclusion of the _id field.

near

Location

Search records in a specific radius with current position in meters. Format: field_name, longitude, latitude, radius (in meters).

Search operators

Here are the search operators that you can use to retrieve records.

Search operators

Applicable to types

Description

lt

Integer, Float

Less Than operator.

lte

Integer, Float

Less Than or Equal to operator.

gt

Integer, Float

Greater Than operator.

gte

Integer, Float

Greater Than or Equal to operator.

ne

Integer, Float, String, Boolean

Not Equal to operator.

in

Integer, Float, String

IN array operator.

nin

Integer, Float, String

Not IN array operator.

all

Array

ALL are contained in array.

or

Integer, Float, String

All records that contain a value 1 or value 2.

ctn

String

All records that contain a particular substring.

Update records

You can update a single record. You should have the name of the class and the CustomObjectId to update the object. To update your Custom Objects, use the code snippet below.

QBCustomObject record = new QBCustomObject();
record.setClassName("Movie");
HashMap<String, Object> fields = new HashMap<>();
fields.put("rating", "7.88");
record.setFields(fields);
record.setCustomObjectId("502f7c4036c9ae2163000002");

QBCustomObjects.updateObject(record).performAsync(new QBEntityCallback<QBCustomObject>() {
    @Override
    public void onSuccess(QBCustomObject object, Bundle params) {
        // Record updated
    }

    @Override
    public void onError(QBResponseException errors) {
        // Handle error
    }
});
val record = QBCustomObject()
record.className = "Movie"
val fields = HashMap<String, Any>()
fields.put("rating", "7.88")
record.fields = fields
record.customObjectId = "502f7c4036c9ae2163000002"

QBCustomObjects.updateObject(record).performAsync(object : QBEntityCallback<QBCustomObject> {
    override fun onSuccess(`object`: QBCustomObject, params: Bundle) {
        // Record updated
    }

    override fun onError(errors: QBResponseException) {
        // Handle error
    }
})

You can update multiple records using the code snippet below.

QBCustomObject co1 = new QBCustomObject("Note");
co1.putInteger("rating", 10);
co1.setCustomObjectId("50e3f85f535c123376000d32");

QBCustomObject co2 = new QBCustomObject("Note");
co2.putInteger("rating", 8);
co2.setCustomObjectId("50e3f85f535c123376000d31");

QBCustomObject co3 = new QBCustomObject("Note");
co3.putInteger("rating", 12);
co3.setCustomObjectId("50e3f85f535c123376000d30");

List<QBCustomObject> customObjectList = new LinkedList<>();
customObjectList.add(co1);
customObjectList.add(co2);
customObjectList.add(co3);

QBCustomObjects.updateObjects(customObjectList).performAsync(new QBEntityCallback<ArrayList<QBCustomObject>>() {
    @Override
    public void onSuccess(ArrayList<QBCustomObject> objects, Bundle params) {
        // Records updated
    }

    @Override
    public void onError(QBResponseException errors) {
        // Handle error
    }
});
val co1 = QBCustomObject("Note")
co1.putInteger("rating", 10)
co1.customObjectId = "50e3f85f535c123376000d32"

val co2 = QBCustomObject("Note")
co2.putInteger("rating", 8)
co2.customObjectId = "50e3f85f535c123376000d31"

val co3 = QBCustomObject("Note")
co3.putInteger("rating", 12)
co3.customObjectId = "50e3f85f535c123376000d30"

val customObjectList = LinkedList<QBCustomObject>()
customObjectList.add(co1)
customObjectList.add(co2)
customObjectList.add(co3)

QBCustomObjects.updateObjects(customObjectList).performAsync(object : QBEntityCallback<ArrayList<QBCustomObject>> {
    override fun onSuccess(objects: ArrayList<QBCustomObject>, params: Bundle) {
        // Records updated
    }

    override fun onError(errors: QBResponseException) {
        // Handle error
    }
})

Delete records

To delete a single record, use the code snippet below. You should know the name of the class and the CustomObjectId.

QBCustomObject customObject = new QBCustomObject("Movie", "502f83ed36c9aefa62000002");

QBCustomObjects.deleteObject(customObject).performAsync(new QBEntityCallback<Void>() {
    @Override
    public void onSuccess(Void aVoid, Bundle bundle) {
        // Record deleted
    }

    @Override
    public void onError(QBResponseException errors) {
        // Handle error
    }
});
val customObject = QBCustomObject("Movie", "502f83ed36c9aefa62000002")

QBCustomObjects.deleteObject(customObject).performAsync(object : QBEntityCallback<Void> {
    override fun onSuccess(aVoid: Void, bundle: Bundle) {
        // Record deleted
    }

    override fun onError(errors: QBResponseException) {
        // Handle error
    }
})

To delete multiple records, use the code snippet below.

StringifyArrayList<String> deleteIds = new StringifyArrayList<>();
deleteIds.add("50e3f85f535c123376000d31");
deleteIds.add("50e3f85f535c123376000d32");

QBCustomObjects.deleteObjects("Note", deleteIds).performAsync(new QBEntityCallback<ArrayList<String>>() {
    @Override
    public void onSuccess(ArrayList<String> strings, Bundle bundle) {
        // Records deleted
    }

    @Override
    public void onError(QBResponseException errors) {
        // Handle error
    }
});
val deleteIds = StringifyArrayList<String>()
deleteIds.add("50e3f85f535c123376000d31")
deleteIds.add("50e3f85f535c123376000d32")

QBCustomObjects.deleteObjects("Note", deleteIds).performAsync(object : QBEntityCallback<ArrayList<String>> {
    override fun onSuccess(strings: ArrayList<String>, bundle: Bundle) {
        // Records deleted
    }

    override fun onError(errors: QBResponseException) {
        // Handle error
    }
})

Relations

It is possible to create a relation between objects of two different classes via _parent_id field.

For example, we have the class Rating that contains score, review, and comment fields. We also have a Movie class. So we can create a record of class Rating that will point to the record of the class Movie via its _parent_id field, so the _parent_id field will contain the ID of record from class Movie.

🚧

This is not a simple soft link. This is actually a hard link. When you delete the Movie class record then all its children (records of class Rating with _parent_id field set to the Movie class record ID) will be automatically deleted as well.

πŸ“˜

If you need to retrieve all children, you can retrieve records with the filter _parent_id=<id_of_parent_class_record>.

Permissions

Access Control List (ACL) is a list of permissions attached to some object. An ACL specifies which users have access to objects as well as what operations are allowed on given objects. Each entry in a typical ACL specifies a subject and an operation. ACL models may be applied to collections of objects as well as to individual entities within the system hierarchy.

πŸ“˜

Access Control List available only for Custom Objects module.

Permission schema

QuickBlox Permission schema contains five permissions levels:

  • Open (open)
    Such permission schema means that any user within the application can access the record/records in the class and is allowed to perform an action with the current permission level.
  • Owner (owner)
    Owner permission level means that only Owner (a user who created a record) is allowed to perform action with the current permission level.
  • Not allowed (not_allowed)
    No one (except for the Account Administrator) can make a chosen action.
  • Open for groups (open_for_groups)
    Users having a specified tag/tags (see more info about how to set tags for the user in Users section) will be included in the group that is allowed to perform an action with the current permission level. The current permission level can consist of one or several groups (number of groups is not limited). Tags can be added/deleted in the user’s profile.
  • Open for user ids (open_for_users_ids)
    Only users that are specified in the permission level can make a required action with a record. One or several users can be specified (the number of users is not limited).

Actions available for the entity

  • Create
    Create a record.
  • Read
    Retrieve and read the info about the chosen record.
  • Update
    Update any parameter for the chosen record (only those parameters that can be set by the user can be updated).
  • Delete
    Delete a record.

Permission levels

There are two access levels in the Permissions schema: Class and Record.

Class entity

Only the Account Administrator can create a class in the Custom object module and make all possible actions with it. Operations with Class entity are not allowed in API.

All actions (Create, Read, Update, and Delete) are available for the class entity and are applicable for all records in the class. Every action has a separate permission level available. The exception is a Create action that is not available for the Owner permission level.

To set a permission schema for the Class, do the following:

  1. Go to the Custom Objects tab.
  2. Open a required class.
  3. Click Edit permissions button to open a class and edit it.

Default Class permission schema is used while creating a class:

  • Create: Open
  • Read: Open
  • Update: Owner
  • Delete: Owner

πŸ“˜

Mark checkboxes to enable class permissions.

Record entity

A record is an entity within the class in the Custom Objects module that has its own permission levels. You can create a record in the Dashboard and API (see Create Record request for more details). All permission levels except for the Not Allowed are available for the record and there are only three actions available and applicable for the record: Read, Update, and Delete.

Default Record permission schema is used while creating a class:

  • Read: Open
  • Update: Owner
  • Delete: Owner

To set a permission level open the required Class and click the record to edit it.

Choosing a permission schema

Only one permission level can be applicable to the record: class permission schema or record permission schema. To apply class permission levels to all records in the class tick the checkbox in the Use Class permissions column near the required Action in the Dashboard.

πŸ“˜

Using a class permission schema means that a record permission schema will not affect a reсord.

πŸ“˜

In case, the Admin does not tick the checkbox in the Dashboard a user has a possibility to change permission levels for every separate record in the table or create a new one with the ACL that a user requires.

Create record with permissions

Let's create a record with the next permissions:

  • READ: Open.
  • UPDATE: Users in groups golf, man.
  • DELETE: Users with IDs 3060, 63635.
QBCustomObject newRecord = new QBCustomObject("Note");
newRecord.put("rating", 99);
newRecord.put("description", "Hello world");

//
// set permissions:
// READ
QBPermissions permissions = new QBPermissions();
permissions.setReadPermission(QBPermissionsLevel.OPEN);

//
// UPDATE
ArrayList<String> usersTags = new  ArrayList<String>();
usersTags.add("golf");
usersTags.add("man");
       permissions.setDeletePermission(QBPermissionsLevel.OPEN_FOR_GROUPS, usersTags);

//
// DELETE
ArrayList<String> usersIDS = new  ArrayList<String>();
usersIDS.add("0602");
usersIDS.add("1986");
       permissions.setDeletePermission(QBPermissionsLevel.OPEN_FOR_USER_IDS, usersIDS);

newRecord.setPermission(permissions);

QBCustomObjects.createObject(newRecord).performAsync(new QBEntityCallback<QBCustomObject>() {
    @Override
    public void onSuccess(QBCustomObject qbCustomObject, Bundle bundle) {
    }

    @Override
    public void onError(QBResponseException e) {
    }
});
val newRecord = QBCustomObject("Note")
newRecord.put("rating", 99)
newRecord.put("description", "Hello world")
  
//
// set permissions:
// READ
val permissions = QBPermissions()
permissions.setReadPermission(QBPermissionsLevel.OPEN)

//
// UPDATE
val usersTags = ArrayList<String>()
usersTags.add("golf")
usersTags.add("man")
       permissions.setDeletePermission(QBPermissionsLevel.OPEN_FOR_GROUPS, usersTags)
  
//
// DELETE
val usersIDS = ArrayList<String>()
usersIDS.add("0602")
usersIDS.add("1986")
      
permissions.setDeletePermission(QBPermissionsLevel.OPEN_FOR_USER_IDS, usersIDS)

newRecord.permission = permissions
        
QBCustomObjects.createObject(newRecord).performAsync(object : QBEntityCallback<QBCustomObject> {
    override fun onSuccess(qbCustomObject: QBCustomObject?, bundle: Bundle?) {

    }

    override fun onError(e: QBResponseException?) {
    }
})

Retrieve record permissions

You can obtain info about record permissions by its ID.

QBCustomObjects.getObjectPermissions("Note", "53f44e7befa3573473000002").performAsync(new QBEntityCallback<QBPermissions>() {
    @Override
    public void onSuccess(QBPermissions qbPermissions, Bundle bundle) {
    }

    @Override
    public void onError(QBResponseException e) {
    }
});
QBCustomObjects.getObjectPermissions("Note", "53f44e7befa3573473000002").performAsync(object : QBEntityCallback<QBPermissions> {
    override fun onSuccess(qbPermissions: QBPermissions?, bundle: Bundle?) {
    }

    override fun onError(e: QBResponseException?) {
    }
})

🚧

Only info about the user's own records is available.

Update record permissions

Let's update record's permissions to next:

  • READ: Users in groups car, developers.
  • UPDATE: Owner.
  • DELETE: Owner.
QBCustomObject record = new QBCustomObject();
record.setClassName("Note");
record.setCustomObjectId("52b30274535c12fbf80121bd");

//
// update permissions:
// READ
QBPermissions permissions = new QBPermissions();
ArrayList<String> usersTags = new  ArrayList<String>();
usersTags.add("car");
usersTags.add("developers");
       permissions.setDeletePermission(QBPermissionsLevel.OPEN_FOR_GROUPS, usersTags);

//
// UPDATE
permissions.setUpdatePermission(QBPermissionsLevel.OWNER);

//
// DELETE
permissions.setDeletePermission(QBPermissionsLevel.OWNER);

record.setPermission(permissions);

QBCustomObjects.updateObject(record).performAsync(new QBEntityCallback<QBCustomObject>() {
    @Override
    public void onSuccess(QBCustomObject qbCustomObject, Bundle bundle) {
    }

    @Override
    public void onError(QBResponseException e) {
    }
});
val record = QBCustomObject()
record.className = "Note"
record.customObjectId = "52b30274535c12fbf80121bd"

//
// update permissions:
// READ
val permissions = QBPermissions()
val usersTags = ArrayList<String>()
usersTags.add("car")
usersTags.add("developers")
       permissions.setDeletePermission(QBPermissionsLevel.OPEN_FOR_GROUPS, usersTags)

//
// UPDATE
permissions.setUpdatePermission(QBPermissionsLevel.OWNER)

//
// DELETE
permissions.setDeletePermission(QBPermissionsLevel.OWNER)

record.permission = permissions

QBCustomObjects.updateObject(record).performAsync(object : QBEntityCallback<QBCustomObject> {
    override fun onSuccess(qbCustomObject: QBCustomObject?, bundle: Bundle?) {
    }

    override fun onError(e: QBResponseException) {
    }
})

Files

Custom Objects module supports the File field type. It is created to work easily with content from the Custom Objects module. There is an ability to upload, download, update, and delete the content of file fields.

Upload/Update file

Use the code lines below to upload/update a file.

// get file
File file = new File();

QBCustomObject customObject = new QBCustomObject("Note", "p38a06v6l123o50v66");
        
QBCustomObjectsFiles.uploadFile(file, customObject, "avatar", new QBProgressCallback() {
    @Override
    public void onProgressUpdate(int progress) {
    }
}).performAsync(new QBEntityCallback<QBCustomObjectFileField>() {
    @Override
    public void onSuccess(QBCustomObjectFileField qbCustomObjectFileField, Bundle bundle) {
    }

    @Override
    public void onError(QBResponseException e) {
    }
});
// get file
val file = ...

val customObject = QBCustomObject("Note", "p38a06v6l123o50v66")

QBCustomObjectsFiles.uploadFile(file, customObject, "avatar", object : QBProgressCallback {
    override fun onProgressUpdate(progress: Int) {
    }
}).performAsync(object : QBEntityCallback<QBCustomObjectFileField> {
    override fun onSuccess(qbCustomObjectFileField: QBCustomObjectFileField?, bundle: Bundle?) {
    }

    override fun onError(e: QBResponseException?) {
    }
})

Download file

To download a file, use the code snippet below.

QBCustomObject customObject = new QBCustomObject("Note", "p38a06v6l123o50v66");

QBCustomObjectsFiles.downloadFile(customObject, "avatar", new QBProgressCallback() {
    @Override
    public void onProgressUpdate(int i) {
    }
}).performAsync(new QBEntityCallback<InputStream>() {
    @Override
    public void onSuccess(InputStream inputStream, Bundle bundle) {
    }

    @Override
    public void onError(QBResponseException e) {
    }
});
val customObject = QBCustomObject("Note", "p38a06v6l123o50v66")

QBCustomObjectsFiles.downloadFile(customObject, "avatar", object : QBProgressCallback {
    override fun onProgressUpdate(i: Int) {
    }
}).performAsync(object : QBEntityCallback<InputStream> {
    override fun onSuccess(inputStream: InputStream?, bundle: Bundle?) {
    }

    override fun onError(e: QBResponseException?) {
    }
})

Delete file

To delete a file, use the code snippet below.

QBCustomObject customObject = new QBCustomObject("Note", "p38a06v6l123o50v66");
        
QBCustomObjectsFiles.deleteFile(customObject, "avatar").performAsync(new QBEntityCallback<Void>() {
    @Override
    public void onSuccess(Void aVoid, Bundle bundle) {
    }

    @Override
    public void onError(QBResponseException e) {
    }
});
val customObject = QBCustomObject("Note", "p38a06v6l123o50v66")

QBCustomObjectsFiles.deleteFile(customObject, "avatar").performAsync(object : QBEntityCallback<Void> {
    override fun onSuccess(void: Void?, b: Bundle?) {
    }

    override fun onError(e: QBResponseException?) {
    }
})

Updated about a month ago


What's Next

Address Book

Custom Objects


Learn how to store and sync data with QuickBlox key-value storage.

Suggested Edits are limited on API Reference Pages

You can only suggest edits to Markdown body content, but not to the API spec.