Na construção de aplicativos mobile, a necessidade de tratamento de dados, ou ainda o famoso CRUD (create, read, update e delete), é extremamente comum. Nas principais plataformas mobile, as possibilidades oferecidas se assemelham bastante. Basicamente temos estas opções:
- Mídia interna: as plataformas oferecem um sistema de arquivo específico para o aplicativo.
- Mídia externa: basicamente podemos resumir esta opção ao SDCard.
- Acesso à rede de dados: enviar os dados para um web service e este, por sua vez, persistir as informações também pode ser considerado uma alternativa para aplicativos mobile;
- Banco de dados relacional: todas as principais plataformas fornecem uma implementação do SQLite nativa;
- Um par chave-valor: as principais plataformas permitem que um par de dados, composto por um valor associado a uma chave, seja persistido mesmo quando a aplicação seja fechada pelo usuário. Para os programadores Java, uma analogia pode ser feita com a classe Imagine essa classe estática dentro do ambiente do sistema operacional.
Uma das opções mais utilizadas é o banco de dados relacional com o SQLite. Nas duas principais plataformas, Android e iOS, esse trabalho não é muito amigável. Para os desenvolvedores iniciantes, chega a ser um ponto de cuidado no desenvolvimento de novas aplicações.
Quem já precisou implementar uma classe que estende de SQLiteOpenHelpder e trabalhar com os métodos de CRUD da classe SQliteDatabase sabe do que estou falando. E para os desenvolvedores Apple, compartilho com vocês o processo penoso, pelo menos para os viajantes inexperientes, de configurar o(s) arquivo(s) xcdatamodel, os modelos de dados, os coordenadores de persistência e o contexto.
Porém, trago-lhes boas novas! A primeira delas se chama Realm. Essa biblioteca promete (e cumpre) deixar o trabalho com dados mais simples e, o mais importante, mais rápido que qualquer outra biblioteca ORM (Object-Relational Mapping). Sobre esta última promessa, posso afirmar que nos testes que fiz com o SQLite puro do Android SDK, realmente foi mais rápido. Porém, não posso concluir categoricamente que eles cumprem esse requisito.
Para o leitor ter noção da beleza do código gerado com a Realm, veja este exemplo retirado da própria página oficial (Android):
public class Dog extends RealmObject { public String name; public int age; } Dog dog = new Dog(); dog.name = "Rex"; dog.age = 1; Realm realm = Realm.getDefaultInstance(); realm.beginTransaction(); realm.copyToRealm(dog); realm.commitTransaction(); RealmResults<Dog> pups = realm.where(Dog.class) .lessThan("age", 2) .findAll();
O seu código ficará condizente com o restante do projeto, com uma roupagem mais adequada ao mundo orientado a objetos. Além disso, perceba que o uso de cláusulas de pesquisa de dados também fica mais compreensível e poderoso.
Bem, mas as novidades não param por aí. Vamos passar para o próximo nível de uma aplicação mobile de nível médio para cima. Com muita frequência, temos um suporte de um sistema back end – seja como fornecedor de dados ou como um mantenedor de informações geradas pelo mobile. Independentemente da razão, esse caminho de mão dupla entre cliente e servidor deve ser construído.
E, para piorar o cenário, temos a questão de notificações. Por exemplo: imagine uma aplicação para Internet das Coisas que alerta o usuário caso o nível de gás na cozinha ultrapasse um dado valor. Quando o servidor recebe um valor alarmante, o aplicativo móvel deve ser avisado e, consequentemente, alertar o usuário.
A boa nova que trago nesse caso se chama Firebase. Uma das principais estrelas do último Google IO, permite File Storage e Google Cloud Messaging Push Notification, dentre outras coisas.
No site da ferramenta, é possível criar uma base de dados NOSql com JSON. E na aplicação (Android, iOS, Rect, dentre outros), basta colocar um listener para mudança de dados. Simples assim. A aplicação recebe listagem de dados. Tem possibilidade de filtros. E o mais importante: qualquer mudança na base de dados dispara automaticamente um push para seu listener, que pode atualizar a interface gráfica quase que em tempo real.
Para deixar mais claro, segue um exemplo da própria página oficial do Firebase para uso no iPhone com Swift:
// Get a reference to our posts var ref = Firebase(url:"https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts") // Get the data on a post that has changed ref.observeEventType(.ChildChanged, withBlock: { snapshot in let title = snapshot.value.objectForKey("title") as? String println("The updated post title is \(title)") })
Existe uma diversidade de frameworks, bibliotecas e APIs (Application Programming Interface) que trabalham com dados. Porém, confesso aos amigos leitores que a Realm e o Firebase impressionaram de verdade este que vos fala. Com esse par de ferramentas, a parte de dados da sua aplicação, incluindo a parte de servidor e push notifications, pode ser feita, na sua totalidade, em algumas horas.
***
Artigo publicado originalmente na Revista iMasters #19