Android Small Talks: Backendless, czyli alternatywa dla Parse.com
Parse.com był jednym z najpopularniejszych serwisów typu MBaaS (Mobile backend as a service). Umożliwiał tworzenie bazy danych w chmurze i udostępniał do niej dostęp poprzez automatycznie generowane API. Niestety jakiś czas temu ogłoszono informację o zakończeniu tego projektu, co zmusiło nas do znalezienia alternatywy. Spośród wielu serwisów tego typu zdecydowałem się wybrać Backendless.com. Dlaczego właśnie to rozwiązanie uznałem za najlepsze?
Czemu wybrałem Backendless na mój serwis MBaaS?
W Backendless możemy korzystać nam z bardzo wielu funkcjonalności, takich jak:
- User Management,
- Data Persistenceter,
- Geolocation,
- Media Streaming,
- Publish/Subscribe Messaging,
- Push Notifications,
- Custom Business Logic,
- Analytics,
- Mobile Code Generation.
Do połączenia z bazą danych zostało udostępnione SDK zarówno dla Androida jak i iOS-a. Nie jest to jednak jedyna metoda łączenia – możemy to również robić poprzez REST API, dzięki czemu każdy może wybrać najwygodniejszy dla siebie sposób. Poniżej opiszę podstawowe funkcjonalności, takie jak zarządzenie użytkownikami, komunikacja z bazą danych oraz własną logikę biznesową.
Zarządzanie bazą użytkowników
Backendless posiada specjalną tabelę dla użytkowników. Jest ona tworzona dla każdej nowej aplikacji automatycznie. SDK udostępnia specjalne metody oraz klasy, pozwalające w łatwy sposób zarejestrować nowych użytkowników oraz przeprowadzić proces logowania. Do naszej dyspozycji został również oddany system, który umożliwia potwierdzenie utworzenia nowego konta poprzez wysłanie do użytkownika maila z linkiem aktywacyjnym.
Rejestracja
Rejestracja użytkownika jest bardzo prosta. SDK zaopatrzone jest w klasę BackendlessUser, która posiada pola takie jak e-mail oraz password. Ponadto możemy dodać dowolne pole poprzez ustawienie property przekazując klucz i wartość. Wszystkie zapytania z użyciem SDK odbywają się poprzez wywołanie statycznych metod z odpowiednich klas. W tym przypadku jest to klasa UserService. Dla każdego zapytania wykonywanego w tle przekazujemy odpowiedni callback, który jest wywoływany przy odpowiedzi z API.
public void registerUser(String username, String email, String password) {
BackendlessUser user = new BackendlessUser();
user.setEmail(email);
user.setPassword(password);
user.setProperty("username", username);
Backendless.UserService.register(user, new AsyncCallback<BackendlessUser>() {
@Override
public void handleResponse(BackendlessUser response) {
}
@Override
public void handleFault(BackendlessFault fault) {
}
});
}
Logowanie
Logowanie użytkowników przebiega w bardzo podobny sposób do rejestracji. Korzystamy również z klasy UserService. Do logowania potrzebny jest nam adres e-mail podany przy rejestracji oraz hasło.
public void loginUser(String username, String password, BaseDataCallback<UserProfile> callback) {
Backendless.UserService.login(username, password, new AsyncCallback<BackendlessUser>() {
@Override
public void handleResponse(BackendlessUser response) {
}
@Override
public void handleFault(BackendlessFault fault) {
}
});
}
Komunikacja z bazą danych
Backendless pozwala nam automatycznie mapować tabele bazy danych na nasze klasy. Jeśli nasza klasa posiada inną nazwę niż tabela to musimy dodać wywołanie metody mapującej (najlepiej w klasie aplikacji). Przykładowo:
Backendless.Persistence.mapTableToClass("BackendlessProduct", Product.class);
Teraz możemy już zapisywać i odczytywać dane działając na naszych obiektach. Po raz kolejny korzystamy ze statycznych metod.
Zapisanie produktu
public void saveProduct(Product product, BaseDataCallback<Product> callback) {
Backendless.Persistence.save(product, new AsyncCallback<Product>() {
@Override
public void handleResponse(Product response) {
}
@Override
public void handleFault(BackendlessFault fault) {
}
});
}
Pobranie listy produktów
public void getProducts(BaseDataCallback<ArrayList<Product>> callback) {
Backendless.Persistence.of(Product.class).find(new AsyncCallback<BackendlessCollection<Product>>() {
@Override
public void handleResponse(BackendlessCollection<Product> response) {
}
@Override
public void handleFault(BackendlessFault fault) {
}
});
}
Dla wszystkich tabel w bazie, które sami utworzyliśmy korzystamy z klasy Persistence. Udostępnia nam ona potrzebne metody do zarządzania zawartością tabel, takie jak save, remove, find, loadRelations.
Logika biznesowa
Jeśli musimy wykonać jakieś dodatkowe działania na bazie danych, np. podczas zapisywania obiektów, to Backendless nam w tym doskonale pomoże. Do takich celów udostępniony został specjalny moduł, pozwalający na dopisanie kodu, który zostanie wykonany przed lub po konkretnej akcji. Wybór akcji jest dość spory, między innymi usuwanie obiektów, zapisywanie, wyszukiwanie. Kod dla logiki biznesowej możemy pisać w języku Java, PHP lub JavaScript.
Prosty przykład wygląda następująco:
@Asset( "Product" )
public class ProductTableEventHandler extends com.backendless.servercode.extension.PersistenceExtender<Product> {
@Override
public void beforeCreate( RunnerContext context, Product product) throws Exception {
product.setDescription("This is cloud code generated description");
}
}
Wystarczy rozszerzyć klasę PersistenceExtender, a następnie nadpisać odpowiednie metody. W tym przypadku jest to metoda beforeCreate, która jak sama nazwa wskazuje jest wywoływana przed zapisaniem obiektu w bazie. Metody te możemy wykonywać synchronicznie lub asynchronicznie. Konfiguracja dla każdej klasy znajduje się w panelu deweloperskim.
Podsumowując, Backendless jest doskonałym wyborem dla osób szukających alternatywy dla Parse.com lub po prostu serwisu typu MBaaS. Jego głównymi zaletami są dostęp do bazy zarówno z użyciem SDK, jak i zapytań REST oraz możliwość pisania własnej logiki biznesowej.