SnappyDB - banco de dados de valores-chave NoSQL para Android. É bastante fácil de usar e é uma boa opção se você deseja usar a versão NoSQL do banco de dados em seu projeto (mais detalhes aqui ).Segundo os desenvolvedores, nas operações de gravação e leitura, o Snappy é mais rápido que o SQLite:
Então, vamos começar. Primeiro você precisa adicionar dependências ao build.gradle: Agora, vamos começar, diretamente, trabalhando com o próprio banco de dados. Primeiro, vamos descobrir como usar o SnappyDB para trabalhar com tipos e matrizes primitivos, salvá-los e recuperá-los. Para maior clareza, crie uma pequena marcação:implementation 'com.snappydb:snappydb-lib:0.5.2'
implementation 'com.esotericsoftware.kryo:kryo:2.24.0'
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/filmNameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_centerInParent="true"
android:layout_margin="8dp"
/>
<TextView
android:id="@+id/filmBudgetTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="25sp"
android:layout_below="@+id/filmNameTextView"
android:layout_margin="8dp"
/>
<TextView
android:id="@+id/genreTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="25sp"
android:layout_below="@id/filmBudgetTextView"
android:layout_margin="8dp"
/>
<TextView
android:id="@+id/isAdult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/genreTextView"
android:textSize="25sp"
android:layout_centerInParent="true"
/>
</RelativeLayout>
Digamos que armazenaremos os dados do filme em nosso banco de dados.No MainActivity, criaremos o método PutValues:private void putValues(String name, int budget, boolean isAdult, String[] genres) throws SnappydbException {
DB snappyDB = DBFactory.open(this,"Film");
snappyDB.put("Name", name);
snappyDB.putInt("budget", budget);
snappyDB.putBoolean("isAdult", isAdult);
snappyDB.put("genres", genres);
}
Observe que o método no qual trabalhamos com o SnappyDB deve gerar uma SnappydbException.Agora, escrevemos o método setValues para obter dados do banco de dados e produzi-lo:private void setValues(DB snappyDB) throws SnappydbException {
TextView filmNameTextView = findViewById(R.id.filmNameTextView),
filmBudgetTextView = findViewById(R.id.filmBudgetTextView),
genresTextView = findViewById(R.id.genreTextView),
isAdultTextView = findViewById(R.id.isAdult);
String name = snappyDB.get("Name");
int budget = snappyDB.getInt("budget");
boolean isAdult = snappyDB.getBoolean("isAdult");
String[] genres = snappyDB.getObjectArray("genres", String.class);//2 =
filmNameTextView.setText(name);
filmBudgetTextView.setText(String.valueOf(budget));
isAdultTextView.setText(String.valueOf(isAdult));
for(int i = 0;i < genres.length;i++) {
genresTextView.setText(genresTextView.getText() + " " + genres[i]);
}
}
Chame os métodos criados no onCreate (certifique-se de cercá-los com um bloco try / catch):@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
putValues("Forrest Gump", 677000000,false, new String[] {"Drama","Melodrama"});
} catch (SnappydbException e) {
e.printStackTrace();
}
try {
DB snappyDB = DBFactory.open(this, "Film");
setValues(snappyDB);
} catch (SnappydbException e) {
e.printStackTrace();
}
}
Começamos e vemos que tudo está funcionando corretamente:
Agora vamos descobrir como trabalhar com nossas próprias classes e outros tipos complexos.Crie uma classe de filme com 3 campos:public class Film {
private String name;
private int budget;
private String[] genres;
public Film() {}
public Film(String name, int budget, String[] genres) {
this.name = name;
this.budget = budget;
this.genres = genres;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBudget() {
return budget;
}
public void setBudget(int budget) {
this.budget = budget;
}
public String[] getGenres() {
return genres;
}
public void setGenres(String[] genres) {
this.genres = genres;
}
}
Remova as chamadas dos métodos setValues e putValues em onCreate. Crie um novo objeto da classe Film e adicione-o ao banco de dados:Film film = new Film("Shawshank redemption",28000000, new String[] {"Drama"});
try {
DB snappyDB = DBFactory.open(this, "NewFilmDB");
snappyDB.put("FilmObj",film);
} catch (SnappydbException e) {
e.printStackTrace();
}
Retrabalhamos o método setValues:private void setValues(DB snappyDB) throws SnappydbException {
TextView filmNameTextView = findViewById(R.id.filmNameTextView),
filmBudgetTextView = findViewById(R.id.filmBudgetTextView),
genresTextView = findViewById(R.id.genreTextView);
Film film = snappyDB.getObject("FilmObj", Film.class);
String name = film.getName();
int budget = film.getBudget();
String[] genres = film.getGenres();
filmNameTextView.setText(name);
filmBudgetTextView.setText(String.valueOf(budget));
for(int i = 0;i < genres.length;i++) {
genresTextView.setText(genresTextView.getText() + " " + genres[i]);
}
}
Chame setValues em onCreate novamente:try {
DB snappyDB = DBFactory.open(this, "NewFilmDB");
setValues(snappyDB);
} catch (SnappydbException e) {
e.printStackTrace();
}
Começamos e vemos que tudo funciona:
Agora, vamos ver algumas funções mais interessantes do SnappyDB:1) A capacidade de procurar chaves por prefixo:Film film1 = new Film("Green mile",60000000,new String[] {"Drama", "Fantasy"}),
film2 = new Film("Gentlemen",22000000,new String[] {"Comedy", "Crime"}),
film3 = new Film("In Bruges",15000000,new String[] {"Comedy", "Crime", "Thriller"});
try {
DB snappyDB = DBFactory.open(this, "NewFilmDB");
snappyDB.put("FilmObj: Green Mile",film1);
snappyDB.put("FilmObj: Gentlemen",film2);
snappyDB.put("FilmObj: In Bruges",film3);
String[] filmKeys = snappyDB.findKeys("FilmObj:");
for(int i = 0;i < filmKeys.length;i++) {
Log.d("film_key: ", filmKeys[i] + "\n");
}
Log.d("film_name: ", snappyDB.getObject(filmKeys[2],Film.class).getName() + "\n");
// - , filmKeys
} catch (SnappydbException e) {
e.printStackTrace();
}
Saída de log2) iteração do banco de dados:try {
DB snappyDB = DBFactory.open(this, "NewFilmDB");
for (String[] batch : snappyDB.allKeysIterator().byBatch(1)) {
for (String key : batch) {
Log.d("film",snappyDB.getObject(key,Film.class).getName());
}
}
} catch (SnappydbException e) {
e.printStackTrace();
}
Sem usar o byBatch, você terá apenas um KeyIterator que não implementa o Iterator ou o Iterable; portanto, você não pode usá-lo em um loop.byBatch (n) cria um BatchIterable, que é Iterable e Iterator. Essencialmente, ele apenas chama next (n) para KeyIterator quando você chama next () para ele.Mas o byBatch deve ser usado apenas com uma grande quantidade de dados. Caso contrário, vale a pena usar findKeys / findKeysBetween.3) Removendo um item por chave:snappyDB.del("FilmObj: Gentlemen");
Elemento excluído4) Fechando e excluindo o banco de dados:snappyDB.close();
snappyDB.destroy();
5) Descubra se existe uma chave no banco de dados:snappyDB.put("FilmObj: Gentlemen",new Film());
boolean isExist = snappyDB.exists("FilmObj: Gentlemen");
snappyDB.del("FilmObj: Gentlemen");
isExist = snappyDB.exists("FilmObj: Gentlemen");
Então é só isso. Você decide se deve usar esse banco de dados em seus projetos. É rápido o suficiente e fácil de usar, mas a escolha é sua. Este não é o único banco de dados para Android. Talvez outro banco de dados seja melhor para o seu projeto (Room, SQLite, Realm, etc.). Muitas opções.PS: SnappyDB no GitHub (documentação oficial lá).Diferenças entre SQL e NoSQL: 1 , 2SQL vs banco de dados de valores-chave