Menggunakan basis data nilai kunci Snappy di Android

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:

gambar

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 kita

Di 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");
        //     Film (      open)

        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  =  
        //  get...     

        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:
gambar

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:
gambar

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:");
            //   filmKeys    "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();
 }

gambar
Keluaran log

2) iterasi DB:
try {

            DB snappyDB = DBFactory.open(this, "NewFilmDB");

            for (String[] batch : snappyDB.allKeysIterator().byBatch(1)) {
                //    (batch),     
                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");

gambar
Elemen dihapus
4) 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");// true
snappyDB.del("FilmObj: Gentlemen");
isExist = snappyDB.exists("FilmObj: Gentlemen");//false



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 , 2
SQL vs Key-Value DB

All Articles