Basic Object Retrieval¶
Backendless supports multiple data search and retrieval operations. These include finding an object by its objectId
, finding first or last object in the collection or retrieving the entire persisted collection. Each method is available in both blocking and non-blocking formats:
Retrieving Data Objects¶
Blocking API¶
Retrieve data objects with the default paging setting from a table:
IList<Dictionary<string, object>> Backendless.Data.Of( "TABLE-NAME" ).Find()
Dictionary<string, object> Backendless.Data.Of( "TABLE-NAME" ).FindFirst()
Dictionary<string, object> Backendless.Data.Of( "TABLE-NAME" ).FindLast()
Dictionary<string, object> Backendless.Data.Of( "TABLE-NAME" ).FindById( string objectId )
Retrieve data objects with the default paging setting from a table. Returned collection will contain objects of type E (the name of the class must match the name of the table):
IList<E> Backendless.Data.Of<E>().Find()
E Backendless.Data.Of<E>().FindFirst()
E Backendless.Data.Of<E>().FindLast()
E Backendless.Data.Of<E>().FindById( string objectId )
Non-Blocking API¶
Retrieve data objects with the default paging setting from a table:
public void Backendless.Data.Of( "TABLE-NAME" ).Find(
AsyncCallback<IList<Dictionary<string, object>>> callback )
public void Backendless.Data.Of( "TABLE-NAME" ).FindFirst(
AsyncCallback<Dictionary<string, object>> callback )
public void Backendless.Data.Of( "TABLE-NAME" ).FindLast(
AsyncCallback<Dictionary<string, object>> callback )
public void Backendless.Data.Of( "TABLE-NAME" ).FindById(
string objectId,
AsyncCallback<Dictionary<string, object>> callback )
Retrieve data objects with the default paging setting from a table. Returned collection will contain objects of type E (the name of the class must match the name of the table):
public void Backendless.Data.Of<E>().Find( AsyncCallback<IList<E>> callback );
public void Backendless.Data.Of<E>().FindFirst( AsyncCallback<E> callback )
public void Backendless.Data.Of<E>().FindLast( AsyncCallback<E> callback )
public void Backendless.Data.Of<E>().FindById( string objectId,
AsyncCallback<E> callback )
where:
Argument | Description |
---|---|
TABLE-NAME |
Name of the table from where the data is retrieved from. |
E |
a .NET class identifying the table where from where the data must be loaded from. |
callback |
a callback object which will receive a callback when the method successfully returns a result or an error. Applies to the non-blocking methods only. |
Example¶
The following code demonstrates various search queries:
Load contacts using default paging¶
** Blocking call**
``` csharp
IList<Dictionary<string, object>> result = Backendless.Data.Of( "Contact" ).Find();
```
** Non-blocking call**
``` csharp
AsyncCallback<IList<Dictionary<string, object>>> callback;
callback = new AsyncCallback<IList<Dictionary<string, object>>>(
foundContacts =>
{
},
error =>
{
System.Console.WriteLine( "Server returned an error " + error.Message );
} );
Backendless.Data.Of( "Contact" ).Find( callback );
```
Find first contact¶
** Blocking call**
``` csharp
Dictionary<string, object> firstContact = Backendless.Data.Of( "Contact" ).FindFirst();
```
** Non-blocking call**
``` csharp
AsyncCallback<Dictionary<string, object>> callback;
callback = new AsyncCallback<Dictionary<string, object>>(
foundContacts =>
{
},
error =>
{
System.Console.WriteLine( "Server returned an error " + error.Message );
} );
Backendless.Data.Of( "Contact" ).FindFirst( callback );
```
Find last contact¶
** Blocking call**
``` csharp
Dictionary<string, object> lastContact = Backendless.Data.Of( "Contact" ).FindLast();
```
** Non-blocking call**
``` csharp
AsyncCallback<Dictionary<string, object>> callback;
callback = new AsyncCallback<Dictionary<string, object>>(
foundContacts =>
{
},
error =>
{
System.Console.WriteLine( "Server returned an error " + error.Message );
} );
Backendless.Data.Of( "Contact" ).FindLast( callback );
```
Find contact by objectId¶
** Blocking call**
``` csharp
// Save a contact object first. Once it is saved, we will retrieve it by the assigned objectId
Dictionary<string, object> contact = new Dictionary<string, object>();
contact.Add( "name", "Jack Daniels" );
contact.Add( "age", 147 );
contact.Add( "phone", "777-777-777" );
contact.Add( "title", "Favorites" );
// save object synchronously
Dictionary<string, object> savedContact = Backendless.Data.Of( "Contact" ).Save( contact );
// now retrieve the object using it's objectId
Dictionary<string, object> foundContact = Backendless.Data.Of( "Contact" ).
FindById( (string) savedContact[ "objectId" ] );
```
** Non-blocking call**
``` csharp
// Save a contact object first. Once it is saved, we will retrieve it by the assigned objectId
Dictionary<string, object> contact = new Dictionary<string, object>();
contact.Add( "name", "Jack Daniels" );
contact.Add( "age", 147 );
contact.Add( "phone", "777-777-777" );
contact.Add( "title", "Favorites" );
AsyncCallback<Dictionary<string, object>> getObjectCallback =
new AsyncCallback<Dictionary<string, object>>(
foundContact =>
{
},
error =>
{
System.Console.WriteLine( "Server returned an error " + error.Message );
} );
AsyncCallback<Dictionary<string, object>> saveObjectCallback =
new AsyncCallback<Dictionary<string, object>>(
savedContact =>
{
// now retrieve the object using it's objectId
Backendless.Data.Of( "Contact" ).FindById( (string) savedContact[ "objectId" ], getObjectCallback );
},
error =>
{
System.Console.WriteLine( "Server returned an error " + error.Message );
} );
// save object asynchronously
Backendless.Data.Of( "Contact" ).Save( contact, saveObjectCallback );
```
Consider the following class:
public class Contact
{
public string objectId { get; set; }
public string name { get; set; }
public int age { get; set; }
public string phone { get; set; }
public string title { get; set; }
}
Load contacts using default paging¶
** Blocking call**
``` csharp
IList<Contact> result = Backendless.Data.Of<Contact>().Find();
```
** Non-blocking call**
``` csharp
AsyncCallback<IList<Contact>> getContactsCallback =
new AsyncCallback<IList<Contact>>(
foundContacts =>
{
},
error =>
{
System.Console.WriteLine( "Server returned an error " + error.Message );
} );
Backendless.Data.Of<Contact>().Find( getContactsCallback );
```
Find first contact¶
** Blocking call**
``` csharp
Contact firstContact = Backendless.Data.Of<Contact>().FindFirst();
```
** Non-blocking call**
``` csharp
AsyncCallback<Contact> getContactCallback =
new AsyncCallback<Contact>(
foundContact =>
{
},
error =>
{
System.Console.WriteLine( "Server returned an error " + error.Message );
});
Backendless.Data.Of<Contact>().FindFirst( getContactCallback );
```
Find last contact¶
** Blocking call**
``` csharp
Contact lastContact = Backendless.Data.Of<Contact>().FindLast();
```
** Non-blocking call**
``` csharp
AsyncCallback<Contact> getContactCallback =
new AsyncCallback<Contact>(
foundContact =>
{
},
error =>
{
System.Console.WriteLine( "Server returned an error " + error.Message );
});
Backendless.Data.Of<Contact>().FindLast( getContactCallback );
```
Find contact by objectId¶
** Blocking call**
``` csharp
// Save a contact object first. Once it is saved, we will retrieve it by assigned objectId
Contact contact = new Contact();
contact.Name = "Jack Daniels";
contact.Age = 147;
contact.Phone = "777-777-777";
contact.Title = "Favorites";
// save object synchronously
Contact savedContact = Backendless.Data.Of<Contact>().Save( contact );
// now retrieve the object using it's objectId
Contact foundContact = Backendless.Data.Of<Contact>().FindById( savedContact.ObjectId );
```
** Non-blocking call**
``` csharp
// Save a contact object first. Once it is saved, we will retrieve it by assigned objectId
Contact contact = new Contact();
contact.Name = "Jack Daniels";
contact.Age = 147;
contact.Phone = "777-777-777";
contact.Title = "Favorites";
AsyncCallback<Contact> loadContactCallback = new AsyncCallback<Contact>(
foundContact =>
{
},
error =>
{
System.Console.WriteLine( "Server returned an error " + error.Message );
} );
AsyncCallback<Contact> saveContactCallback = new AsyncCallback<Contact>(
savedContact =>
{
Backendless.Data.Of<Contact>().FindById( savedContact.ObjectId );
},
error =>
{
System.Console.WriteLine( "Server returned an error " + error.Message );
} );
// save object asynchronously
Backendless.Data.Of<Contact>().Save( contact, saveContactCallback );
```
Find a data object by object ID with the queryBuilder parameter¶
Signature Blocking Method¶
BackendlessAPI.Data.FindById( String id, DataQueryBuilder queryBuilder );
BackendlessAPI.Data.FindById( T entity, DataQueryBuilder queryBuilder );
Signature Non-Blocking Method:¶
BackendlessAPI.Data.FindByIdAsync( String id, DataQueryBuilder queryBuilder );
BackendlessAPI.Data.FindByIdAsync( T entity, DataQueryBuilder queryBuilder );
Signature Async Callback Method:¶
BackendlessAPI.Data.FindById( String id, DataQueryBuilder queryBuilder, AsyncCallback<T> responder );
BackendlessAPI.Data.FindById( T entity, DataQueryBuilder queryBuilder, AsyncCallback<T> responder );
Example Blocking Method¶
DataQueryBuilder queryBuilder = DataQueryBuilder.Create();
queryBuilder
.AddRelated("relationA")
.AddRelated("relationB");
var result = Backendless.Data.Of("TableName").FindById("objectId", queryBuilder);
//
//Some operations with result
DataQueryBuilder queryBuilder = DataQueryBuilder.Create();
queryBuilder
.AddRelated("relationA")
.AddRelated("relationB");
var result = Backendless.Data.Of<TableName>().FindById("objectId", queryBuilder);
//
//Some operations with result
Example Non-Blocking Method¶
DataQueryBuilder queryBuilder = DataQueryBuilder.Create();
queryBuilder
.AddRelated("relationA")
.AddRelated("relationB");
var result = Backendless.Data.Of("TableName").FindById("objectId", queryBuilder);
//
//Some operations with result
DataQueryBuilder queryBuilder = DataQueryBuilder.Create();
queryBuilder
.AddRelated("relationA")
.AddRelated("relationB");
var result = Backendless.Data.Of<TableName>().FindById("objectId", queryBuilder);
//
//Some operations with result
Example Async Callback Method¶
DataQueryBuilder queryBuilder = DataQueryBuilder.Create();
queryBuilder
.AddRelated("relationA")
.AddRelated("relationB");
var result = Backendless.Data.Of("TableName").FindById("objectId", queryBuilder);
//
//Some operations with result
DataQueryBuilder queryBuilder = DataQueryBuilder.Create();
queryBuilder
.AddRelated("relationA")
.AddRelated("relationB");
var result = Backendless.Data.Of<TableName>().FindById("objectId", queryBuilder);
//
//Some operations with result
where:
Argument | Description |
---|---|
queryBuilder |
Instance of com.backendless.persistence.DataQueryBuilder. When present in the arguments, the object must contain a whereClause query. The query is used by the server to identify a collection of objects. |
objectId |
object ID of the object to find. For the details about objectId, see the Data Object section of the documentation. |
response |
handles successful result of an asynchronous call. |
fault |
handles fault result of an asynchronous call. |
Codeless Reference¶
The data table employees
presented below is used throughout all Codeless examples as the main reference:
Find First Object¶
The example below retrieves the first object stored in the "employees"
data table.
where:
Argument | Description |
---|---|
table name |
Name of the data table from where the required object is retrieved. |
relations |
Name of the related property to load. For example, if table employees has a relation column homeAddress pointing to an object in the Address table, the value of the parameter would be homeAddress . The syntax allows to add relations of relations. For example, if the same Address table has a relation country pointing to the Country table, then homeAddress .country would instruct the backend to load the related Country object. |
relations depth |
Depth of the relations to include into the response. |
properties |
Names of the properties/columns for which to load the corresponding values. |
exclude properties |
Names of the properties/columns that should not be included in the response. |
The operation has returned the following result:
Find Last Object¶
The example below retrieves the last object stored in the "employees"
data table.
The operation has returned the following result:
Find Object By ID¶
Consider the following scenario where you want to retrieve an object associated with both the object id
: "2B6392CA-B720-4930-8E1C-14C7B06E4397"
and the name "Alex Lincoln"
. In the example provided below, the operation searches for an object by its object id
and returns it as part of the response:
where:
Argument | Description |
---|---|
table name |
Name of the data table from where the required object is retrieved. |
object id |
Unique identifier of the object to retrieve. |
relations |
Name of the related property to load. For example, if table employees has a relation column homeAddress pointing to an object in the Address table, the value of the parameter would be homeAddress . The syntax allows to add relations of relations. For example, if the same Address table has a relation country pointing to the Country table, then homeAddress .country would instruct the backend to load the related Country object. |
relations depth |
Depth of the relations to include into the response. |
properties |
Names of the properties/columns for which to load the corresponding values. |
exclude properties |
Names of the properties/columns that should not be included in the response. |
The result of this operation will look as shown below after the Codeless logic runs.
Load All Objects From Data Table¶
The example below loads all objects from the employees
data table.
where:
Argument | Description |
---|---|
table name |
Name of the data table from where the objects are retrieved. |
where clause |
A search query used by the server it to determine objects matching the condition. Refer to the Search With The Where Clause topic for more information. |
having clause |
Sets a condition on a aggregate function to filter groups. |
relations |
Name of the related property to load. For example, if table employees has a relation column homeAddress pointing to an object in the Address table, the value of the parameter would be homeAddress . The syntax allows to add relations of relations. For example, if the same Address table has a relation country pointing to the Country table, then homeAddress .country would instruct the backend to load the related Country object. |
properties |
Names of the properties/columns for which to load the corresponding values. |
exclude properties |
Names of the properties/columns that should not be included in the response. |
relations depth |
Depth of the relations to include into the response. |
relations page size |
Sets the number of related objects returned in the response. |
sort by |
Lists properties by which the returned collection should be sorted by. |
group by |
Sets the name of the columns to group the results by. |
page size |
Sets the page size which is the number of objects to be returned in the response. |
page offset |
Zero-based index of the object in the persistent store from which to run the search. This parameter should be used when implementing paged access to data. Suppose the first request returned 20 objects (if pageSize is set to 20) and there are 100 objects total. The subsequent request can set offset to 20, so the next batch of objects is loaded sequentially. |
distinct |
Used to return only unique values from a column. |
file reference prefix |
This property allows replacing the default URL file prefix. For instance, when the operation returns a path to a file stored on the server ("https://yourdomain.backendless.app/my-file.jpg" ), then you can reconstruct it by passing the new file name that must start with a slash - "/wonderful_forest.jpg" . It is useful when you want the client application to open a specific file locally. |
The result of this operation will look as shown below after the Codeless logic runs.