SnappyDB - Basis data nilai-kunci NoSQL untuk Android. Ini sangat mudah digunakan dan merupakan pilihan yang baik jika Anda ingin menggunakan versi database NoSQL di proyek Anda (lebih detail di sini ).Menurut pengembang, dalam operasi tulis dan baca Snappy lebih cepat daripada SQLite:
Jadi, mari kita mulai. Pertama, Anda perlu menambahkan dependensi ke build.gradle: Sekarang, mari kita mulai, secara langsung, bekerja dengan database itu sendiri. Pertama, mari kita cari tahu cara menggunakan SnappyDB untuk bekerja dengan tipe dan array primitif, menyimpan dan mengambilnya. Untuk kejelasan, buat markup kecil: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>
Katakanlah kita akan menyimpan data film di basis data kitaDi MainActivity kita akan membuat metode 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);
}
Perhatikan bahwa metode di mana kami bekerja dengan SnappyDB harus melempar SnappydbException.Sekarang kita menulis metode setValues ββuntuk mendapatkan data dari database dan mengeluarkannya: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]);
}
}
Panggil metode yang dibuat di onCreate (pastikan untuk mengelilinginya dengan blok coba / tangkap):@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();
}
}
Kami memulai dan melihat bahwa semuanya berfungsi dengan baik:
Sekarang mari kita cari tahu cara bekerja dengan kelas kita sendiri dan tipe kompleks lainnya.Buat kelas Film dengan 3 bidang: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;
}
}
Hapus panggilan setValues ββdan metode putValues ββdi onCreate. Buat objek baru dari kelas Film di dalamnya dan tambahkan ke database: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();
}
Kami mengerjakan ulang metode 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]);
}
}
Panggil setValues ββdi onCreate lagi:try {
DB snappyDB = DBFactory.open(this, "NewFilmDB");
setValues(snappyDB);
} catch (SnappydbException e) {
e.printStackTrace();
}
Kami memulai dan melihat bahwa semuanya berfungsi:
Sekarang mari kita lihat beberapa fungsi SnappyDB yang lebih menarik:1) Kemampuan untuk mencari kunci dengan awalan: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();
}
Keluaran log2) iterasi DB: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();
}
Tanpa menggunakan byBatch, Anda hanya akan memiliki KeyIterator yang tidak mengimplementasikan Iterator atau Iterable, sehingga Anda tidak dapat menggunakannya dalam satu lingkaran.byBatch (n) menciptakan BatchIterable, yaitu Iterable dan Iterator. Pada dasarnya, itu hanya memanggil next (n) untuk KeyIterator ketika Anda memanggil next () untuk itu.Tetapi byBatch harus digunakan hanya dengan sejumlah besar data. Kalau tidak, ada baiknya menggunakan findKeys / findKeysBetween.3) Menghapus item dengan kunci:snappyDB.del("FilmObj: Gentlemen");
Elemen dihapus4) Menutup dan menghapus basis data:snappyDB.close();
snappyDB.destroy();
5) Cari tahu apakah ada kunci dalam database:snappyDB.put("FilmObj: Gentlemen",new Film());
boolean isExist = snappyDB.exists("FilmObj: Gentlemen");
snappyDB.del("FilmObj: Gentlemen");
isExist = snappyDB.exists("FilmObj: Gentlemen");
Jadi itu saja. Anda memutuskan apakah akan menggunakan database ini dalam proyek Anda. Ini cukup cepat dan mudah digunakan, tetapi pilihan ada di tangan Anda. Ini bukan satu-satunya basis data untuk Android. Mungkin basis data lain lebih baik untuk proyek Anda (Kamar, SQLite, Realm, dll.). Banyak pilihan.PS: SnappyDB di GitHub (dokumentasi resmi di sana).Perbedaan antara SQL dan NoSQL: 1 , 2SQL vs Key-Value DB