استخدام قاعدة بيانات Snappy الرئيسية في Android

SnappyDB - قاعدة بيانات NoSQL ذات قيمة مفتاح لنظام Android. إنه سهل الاستخدام للغاية وهو خيار جيد إذا كنت ترغب في استخدام إصدار NoSQL من قاعدة البيانات في مشروعك (مزيد من التفاصيل هنا ).
وفقًا للمطورين ، في عمليات الكتابة والقراءة ، يكون Snappy أسرع من SQLite:

صورة

لذا ، لنبدأ. تحتاج أولاً إلى إضافة تبعيات إلى build.gradle: الآن ، فلنبدأ مباشرة في العمل مع قاعدة البيانات نفسها. أولاً ، دعنا نكتشف كيفية استخدام SnappyDB للعمل مع الأنواع والمصفوفات البدائية ، وحفظها واسترجاعها. للتوضيح ، أنشئ ترميزًا صغيرًا:

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>

لنفترض أننا سنقوم بتخزين بيانات الأفلام في قاعدة البيانات الخاصة بنا

في MainActivity سنقوم بإنشاء طريقة 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);
        //       
}

لاحظ أن الطريقة التي نعمل بها مع SnappyDB يجب أن ترمي SnappydbException.

الآن نكتب طريقة setValues ​​للحصول على البيانات من قاعدة البيانات وإخراجها:
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]);
        }
}


اتصل بالطرق التي تم إنشاؤها في onCreate (تأكد من إحاطةها بمجموعة محاولة / التقاط):
@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();
        }
}


نبدأ ونرى أن كل شيء يعمل بشكل صحيح:
صورة

الآن دعونا نكتشف كيفية العمل مع فصولنا الخاصة وأنواع أخرى معقدة.
إنشاء فصل فيلم مع 3 حقول:
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;
    }
}

قم بإزالة استدعاءات أسلوب setValues ​​وطريقة putValues ​​في onCreate. قم بإنشاء كائن جديد لفئة الفيلم فيه وإضافته إلى قاعدة البيانات:
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();
}


نعيد صياغة طريقة 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]);
        }
}

تعيين المكالمات القيم في onCreate مرة أخرى:
try {
        DB snappyDB = DBFactory.open(this, "NewFilmDB");
        setValues(snappyDB);
} catch (SnappydbException e) {
        e.printStackTrace();
}

نبدأ ونرى أن كل شيء يعمل:
صورة

الآن دعونا نلقي نظرة على بعض وظائف SnappyDB الأكثر إثارة للاهتمام:
1) القدرة على البحث عن المفاتيح بالبادئة:
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();
 }

صورة
إخراج السجل

2) تكرار قاعدة البيانات:
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();
}

بدون استخدام byBatch ، سيكون لديك KeyIterator فقط لا يطبق Iterator أو Iterable ، لذا لا يمكنك استخدامه في حلقة.
يقوم byBatch (n) بإنشاء BatchIterable ، وهو Iterable و Iterator. بشكل أساسي ، يقوم فقط باستدعاء next (n) لـ KeyIterator عند استدعاء next () لذلك.
ولكن يجب استخدام byBatch فقط مع كمية كبيرة من البيانات. خلاف ذلك ، يجدر استخدام findKeys / findKeysB Between.

3) إزالة عنصر عن طريق المفتاح:
snappyDB.del("FilmObj: Gentlemen");

صورة
تم حذف العنصر
4) إغلاق وحذف قاعدة البيانات:
snappyDB.close();
snappyDB.destroy();


5) معرفة ما إذا كان المفتاح موجودًا في قاعدة البيانات:
snappyDB.put("FilmObj: Gentlemen",new Film());
boolean isExist = snappyDB.exists("FilmObj: Gentlemen");// true
snappyDB.del("FilmObj: Gentlemen");
isExist = snappyDB.exists("FilmObj: Gentlemen");//false



هذا كل شيء. أنت تقرر ما إذا كنت تريد استخدام قاعدة البيانات هذه في مشاريعك. إنه سريع بما يكفي وسهل الاستخدام ، ولكن الخيار لك. هذه ليست قاعدة البيانات الوحيدة لنظام Android. ربما تكون قاعدة بيانات أخرى أفضل لمشروعك (الغرفة ، SQLite ، المجال ، إلخ). الكثير من الخيارات.

PS: SnappyDB على GitHub (الوثائق الرسمية هناك).
الاختلافات بين SQL و NoSQL: 1 ، 2
SQL مقابل Key-Value DB

All Articles