mvvmlogo
سورس کد آموزش الگوی طراحی MVVM و RxJava
۱۳۹۶-۰۸-۱۸
telegrambotlogo
سورس کد ربات تلگرام با سی شارپ
۱۳۹۶-۰۸-۲۷

سورس کد فریم ورک های دیتابیس اندروید

greenlogo

فریم ورک های بسیاری در زمینه دیتابیس اندروید ارائه شده که هرکدام مزیت ها وکمبود های خاص خود را دارند و این به عهده برنامه نویس است که با شناسایی نیاز های خود بتواند بهترین را برگزیند و استفاده کند.

درادامه سورس کد ۴ فریم ورک رایج دیتابیس را به شما عزیزان ارائه خواهیم داد تا بتوانید یک دید کلی برروی آنها داشته باشید و قدرت انتخاب بالاتری داشته باشید.

سورس کد فریم ورک ها و انجین های دیتابیس اندروید

ما برای ۴ کتابخانه دیتابیس REALM ,SQLite ,SUGAR ORM ,GREEDAO سورس کد شامل ۴ دستور اصلی SELECT , READ , INSERT , UPDATE تهیه و به شما عزیزان ارائه کردیم

برای دانلود سورس کد میتونید به کانال تلگرام ما مراجعه کنید

SQLite

تعریفی که SQLite از خود دارد

SQLite is a self-containedhigh-reliabilityembeddedfull-featuredpublic-domain, SQL database engine. SQLite is the most useddatabase engine in the world

یک انجین پایگاه داده بسیار کاربردی و محبوب بین برنامه نویسان که از ویژگی های گفته شده : مستق , مطمئن, تعبیه شده , کامل از آپشن های مورد نیاز و عمومی است

که همانطور که از نامش مشخص است با دستورات SQL که به صورت String نوشته میشود کار میکند و همین امر مشخص کننده این است که ک نمیتوان متوجه خطاهایی دستور نوشته شده شد

.

چون کامپایل نمیشود پس باید آشنایی لازم با دستورات SQL داشته باشید تا در سینتکس دستورات دچار اشتباه نشوید.

برای شروع کار باید یک بانک داده SQLite با استفاده از ابزارهای مختلفی مثل sqlite manager که به عنوان افزونه یا plugin برای کروم و فایرفاکس ارائه شده و یا ابزار سیستمی navicat که امکان مدیریت ارتباطات بین جداول را به شما میدهد , با هر تعداد جدول مورد نیاز ایجاد کنید(ما در این آموزش تنها یک جدول Person با فیلد Name ,ID داریم) و به فولدر databases در فولدر assests اضافه کنید

sqlite

sqlite

برای ایجاد فولدر assests هم تنها کافی ست برروی ماژول app کلیک راست کرده و New/ Folder / Assest Folder رو انتخاب کنید.

برای اضافه کردن این کتابخانه به پروژه کافی ست خط زیر را به گریدل پروژه اضافه کنید
compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'

سپس یک کلاس برای اتصال به دیتابیس که مشخص کننده نام و ورژن دیتابیس هست ایجاد کنید به صورت زیر

package com.tejariapp.sqlite;

import android.content.Context;

import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;

public class DatabaseOpenHelper extends SQLiteAssetHelper {
    private static final String DATABASE_NAME = "Persondb.db";
    private static final int DATABASE_VERSION = 1;

    public DatabaseOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
}

 

.

و سپس یک کلاس دیگر برای ایجاد دستورات و کوئری های بانک

package com.tejariapp.sqlite;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.nfc.tech.NfcA;
import android.util.Log;

import java.util.ArrayList;

public class DatabaseAccess {
    private SQLiteOpenHelper openHelper;
    private SQLiteDatabase database;
    private static DatabaseAccess instance;

    /**
     * Private constructor to aboid
     * object creation from outside classes.
     *
     * @param context
     */
    private DatabaseAccess(Context context) {
        this.openHelper = new DatabaseOpenHelper(context);
    }

    /**
     * Return a singleton instance of DatabaseAccess.
     *
     * @param context the Context
     * @return the instance of DabaseAccess
     */
    public static DatabaseAccess getInstance(Context context) {
        if (instance == null) {
            instance = new DatabaseAccess(context);
        }
        return instance;
    }

    /**
     * Open the database connection.
     */
    public void open() {
        this.database = openHelper.getWritableDatabase();
    }

    /**
     * Close the database connection.
     */
    public void close() {
        if (database != null) {
            this.database.close();
        }
    }

    /**
     * Read all person from the database.
     *
     * @return a List of persons
     */
    public ArrayList<Person> getAllPersons() {
        ArrayList<Person> persons = new ArrayList<>();
        Cursor cursor = database.rawQuery("SELECT * FROM Person "
                , null);
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            persons.add(new Person(cursor.getInt(
                    cursor.getColumnIndex("ID"))
                    , cursor.getString(
                    cursor.getColumnIndex("Name"))));
            cursor.moveToNext();
        }
        cursor.close();
        return persons;
    }

    /**
     * Insert record into Person
     *
     * @return a boolean value base of inserting or not
     */
    public Person insertSQLite(String name) {
        Person person = null;
        try {
            database.execSQL("INSERT INTO Person(Name) VALUES('"
                    + name + "')");
            Cursor cursor = database
                    .rawQuery("SELECT * FROM " +
                                    "Person ORDER BY ID DESC LIMIT 1"
                            , null);
            if (cursor.moveToFirst())
                person = new Person(cursor.getInt(
                        cursor.getColumnIndex("ID"))
                        , cursor.getString(
                                cursor.getColumnIndex("Name")));
        } catch (Exception e) {
            Log.e("insert SQLite bug", e.toString());
            person = null;
        }
        return person;
    }

    /**
     * Update record into Person
     *
     * @return a boolean value base of updating or not
     */
    public boolean updateSQLite(String name, int id) {
        try {
            database.execSQL("UPDATE Person SET Name='"
                    + name + "' WHERE ID=" + id);
            return true;
        } catch (Exception e) {
            Log.e("update SQLite bug", e.toString());
            return false;
        }
    }

    /**
     * Delete record from Person
     *
     * @return a boolean value base of deleting or not
     */
    public boolean deleteSQLite(int id) {
        try {
            database.execSQL("DELETE FROM Person WHERE ID=" + id);
            return true;
        } catch (Exception e) {
            Log.e("delete SQLite bug", e.toString());
            return false;
        }
    }
}

حالا خیلی راحت میتونیم از کلاس فوق برای دسترسی به اطلاعات بانک استفاده کنیم بدین صورت

 


/*
*  insert a record in database
*/
private void insertSQLite() {
    String newName = nameEditText.getText().toString().trim();
    if (!newName.isEmpty()) {
        DatabaseAccess databaseAccess =
                DatabaseAccess.getInstance(this);
        databaseAccess.open();
        Person person = databaseAccess.insertSQLite(newName);
        if (person != null) {
            personsList.add(person);
            customAdapter.notifyItemInserted(
                    personsList.size() - 1);
        }
        databaseAccess.close();
    }
}

/*
*  update a record in database by id of that
*/
private void updateSQLite() {
    String newName = nameEditText.getText()
            .toString().trim();
    if (!newName.isEmpty()) {
        DatabaseAccess databaseAccess =
                DatabaseAccess.getInstance(this);
        databaseAccess.open();
        Person person=personsList.get(position);
        if (databaseAccess.updateSQLite(
                newName,person.getId())){
            person.setName(newName);
            personsList.set(position,person);
            customAdapter.notifyItemChanged(position);
        }
        databaseAccess.close();
        position=-1;
    }
}

/*
*  delete record from database
*/
private void deleteSQLite() {
    DatabaseAccess databaseAccess=
            DatabaseAccess.getInstance(this);
    databaseAccess.open();
    if (databaseAccess.deleteSQLite(
            personsList.get(position).getId())){
        personsList.remove(position);
        customAdapter.notifyDataSetChanged();
    }
    position=-1;
    databaseAccess.close();
}

/*
*  read all database records
*/
private void readSQLite() {
    DatabaseAccess databaseAccess =
            DatabaseAccess.getInstance(this);
    databaseAccess.open();
    personsList = databaseAccess.getAllPersons();
    databaseAccess.close();

    for (Person person : personsList)
        Log.d("person info", person.getName());
}

برای دانلود سورس آموزش SQLiet به کانال تلگرام ما مراجعه کنید.

Sugar ORM

فریم ورک Sugar orm از نوع ORM هاست پس بهتره قبل از پرداختن به این فریم ورک کاربردی دیتابیس , مفهوم ORM یا Object-relational mapping رو متوجه بشیم !

به نقل از wikipedia

Object-relational mapping (ORMO/RM, and O/R mapping tool) in computer science is a programming technique for converting data between incompatible type systems using object-oriented programming languages. This creates, in effect, a “virtual object database” that can be used from within the programming language.

به عبارتی ORM یک تکنیک برنامه نویسی است که برای ذخیره و بازیابی اطلاعات به صورت کاملا شی گرایی است بدین معنی که دیگر نیازی به دستورات SQL نیست و تنها کافی است با زبان شی گرایی با بانک مجازی ایجاد شده صحبت کنیم 😀

.

حالا که با مفهوم ORM آشنا شدیم میشه حدس زد که فریم ورک هایی که از ORM پشتیبانی میکنند مثل Sugar ORM و دیگر فریم ورک ها که در ادامه آشنا میشیم , چه ویژگی دارند که باعث برتری آنها شده و اون دسترسی به اطلاعات بانک بصورت کاملا شی گرایی ست.

نکات مثبت فریم ورک Sugar orm را میتوان چنین نام برد

  • سادگی و دستورات ساده فارغ از پیچیدگی ها
  • حجم پایین 
  • قابلیت پشتیبانی از دستورات SQL برای دستورات خاص که ممکن است با دستورات Sugar orm پیاده سازی نشودندیا مشکل باشند مثل joinهای تو درتو
  • مدیریت ساده ارتباطات بین جداول

قبل از شروع پروژه وابستگی Sugar orm رو به گردل اضافه میکنیم

compile 'com.github.satyan:sugar:1.5'

 

تنظیمات manifest

قبل از شروع به ایجاد جدول و مدل سازی باید یک سری تنظیمات برای ایجاد بانک به manifest در تگ application اضافه کنیم 

<application
...>
    <meta-data
        android:name="DATABASE"
        android:value="testdb.db" />
    <meta-data
        android:name="VERSION"
        android:value="16" />
    <meta-data
        android:name="QUERY_LOG"
        android:value="true" />
    <meta-data
        android:name="DOMAIN_PACKAGE_NAME"
        android:value="com.tejariapp.sugarorm" />
 
</application>

 

حالا باید بریم سراغ Model پروژه

توی قسمت SQLite ما ابتدا یک بانک SQLite ایجاد کردیم که مدل ما معرفی میشد.

اما در Sugar ORM ما گفتیم که همه چیز شی گرایی ست! پس Model ماهم یک کلاس خواهد بود

پس برای هر جدول باید یک کلاس ایجاد کنیم که از کلاس SugarRecord پشتیبانی میکنند

package com.tejariapp.sugarorm;

import android.support.annotation.Size;

import com.orm.SugarRecord;

import java.util.List;

/**
 * Created by Marjan on 04/11/2017.
 */

public class Person extends SugarRecord {


    String Name;

    public Person(){}

    public Person(String name){
        this.Name=name;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        this.Name = name;
    }
}

همانطور ک مشخص است یک کلاس ساده با getter , setter است اما درصورت نیاز میتونید از انوتیشن های @NotNull و @Uniq استفاده کنید.

.

حالا خیلی راحت میتونیم با دستورات زیر به اطلاعات درون بانک دسترسی پیدا کنیم

/*
*  insert a record in database
*/
private void insertSugarORM() {
    String name = nameEditText.getText().toString();

    try {
        Person person = new Person();
        person.setName(name);
        person.save();
        personsList.add(person);
        customAdapter.notifyItemInserted(
                personsList.size() - 1);
    } catch (Exception e) {
        Log.e("e", e.toString());
    }

    nameEditText.setText("");
}

/*
* read all object from database
*/
private void readSugarORM() {
    personsList = Person.listAll(Person.class);
    for (Person person : personsList)
        Log.e("person", String.valueOf(
                person.getId()) + person.getName());
}

/*
* delete a record by position in list
*/
private void deleteSugarORM() {
    Person person = Person.findById(
            Person.class, personsList.get(position).getId());
    person.delete();
    personsList.remove(position);
    customAdapter.notifyDataSetChanged();

    position = -1;
    nameEditText.setText("");
}

/*
* update a record in database
*/
private void updateSugarORM() {
    String newName = nameEditText.getText().toString().trim();

    if (position -1 && !newName.isEmpty()) {

        Person person = personsList.get(position);
        person.setName(newName);
        person.save();

        personsList.set(position, person);
        customAdapter.notifyItemChanged(position);

        position = -1;
        nameEditText.setText("");
    }
}

درصورتی هم یک نیاز به داشتن یک بانک پبشفرض در اپلیکیشن بود میتونید یک دیتابیس رو با استفاده از ابزارهای SQLite که در بخش قبل صحبت کردیم ایجاد کنید به فولدر assets اضافه کنید

.

و بعد کلاس زیر را به پروژه خود اضافه کنید که وظیفه انتقال دیتابیس از SQLite به فریم ورک های ORM رادارد

package com.tejariapp.sugarorm;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * Created by Marjan on 06/11/2017.
 */

public class DataBaseHelper extends SQLiteOpenHelper {

    //The Android's default system path of your application database.
    private static String DB_PATH =
            "/data/data/com.tejariapp.sugarorm/databases/";

    private static String DB_NAME = "testdb.db";

    private SQLiteDatabase myDataBase;

    private final Context myContext;

    /**
     * Constructor
     * Takes and keeps a reference of the passed context
     * in order to access to the application assets and resources.
     *
     * @param context
     */
    public DataBaseHelper(Context context) {

        super(context, DB_NAME, null, 1);
        this.myContext = context;
    }

    /**
     * Creates a empty database on the system and
     * rewrites it with your own database.
     * */
    public void createDataBase() throws IOException {

        boolean dbExist = checkDataBase();

        if(dbExist){
            //do nothing - database already exist
        }else{

            //By calling this method and empty database will be created into the default system path
            //of your application so we are gonna be able to overwrite that database with our database.
            this.getReadableDatabase();

            try {
                copyDataBase();

            } catch (IOException e) {

                Log.e("copy error",e.toString());

            }
        }

    }

    /**
     * Check if the database already exist to avoid
     * re-copying the file each time you open the application.
     *
     * @return true if it exists, false if it doesn't
     */
    private boolean checkDataBase(){

        File dbFile = myContext.getDatabasePath(DB_NAME);
        return dbFile.exists();
    }

    /**
     * Copies your database from your local
     * assets-folder to the just created empty database in the
     *
     * system folder, from where it can be accessed and handled.
     * This is done by transfering bytestream.
     * */
    private void copyDataBase() throws IOException{

        //Open your local db as the input stream
        InputStream myInput = myContext.getAssets().open(DB_NAME);

        // Path to the just created empty db
        String outFileName = myContext.getDatabasePath(DB_NAME).getPath();

        //Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);

        //transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }

        //Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }

    public void openDataBase() throws SQLException {

        //Open the database
        String myPath = myContext
                .getDatabasePath(DB_NAME).getPath();
        myDataBase = SQLiteDatabase.openDatabase(
                myPath, null, SQLiteDatabase.OPEN_READONLY);

    }

    @Override
    public synchronized void close() {

        if(myDataBase != null)
            myDataBase.close();

        super.close();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db,
                          int oldVersion, int newVersion) {

    }

    // Add your public helper methods to
    // access and get content from the database.
    // You could return cursors by doing
    // "return myDataBase.query(....)" so it'd be easy
    // to you to create adapters for your views.

}

.

و سپس تکه کد زیر که برای اجرای کلاس فوق است را در MainActivity خود یا کلاسی که از Application ارث بری میکند (چون حتما باید اجرا شود) قرار دهید

/*
 *  if you have a database and you want to load it by default in app
*/
  DataBaseHelper myDB;
myDB = new DataBaseHelper(getApplicationContext());

try {
    myDB.createDataBase();
}
catch(IOException e)
{
    // do nothing
}

برای دانلود سورس آموزش Sugar ORM به کانال تلگرام ما مراجعه کنید.

 Realm

فریم ورک Realm هم یک ORM دیگست !

پس یعنی کاملا شی گرایی رو پشتیبانی میکنه و آپشن های Sugar orm رو داره که البته تا حدودی پیشرفته تر  با اپشن های بیشتر و پیچیده تر  ارائه شده.

خب بدون معطلی میریم سراغ دستورات و ساختار فریم ورک Realm 

قبل از هرچیز باید به گردل اضافه ش کنیم پس برای اینکار ابتدا (build.gradle(project: Realm رو کلیک میکنیم و پلاگین زیر رو به dependencies بدین صورت اضافه میکنیم

buildscript {
    repositories {
       ...
    }
    dependencies {
      ...
        classpath "io.realm:realm-gradle-plugin:4.1.1"
    }
}
و سپس در (build.gradle(Module: app هم پلاگین Realm رو ابتدای کدها اضافه میکنم

 


apply plugin: 'com.android.application'
apply plugin: 'realm-android' //add this

حالا میتونیم مدل یا جدول دیتابیس رو بصورت کلاس زیر اضافه کنیم

package com.tejariapp.realm;

import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;

/**
 * Created by Marjan on 01/11/2017.
 */

public class Person extends RealmObject {

    @PrimaryKey
    private int id;
    private String name;

    public Person(){}
    public Person(int id,String name){
        this.id=id;
        this.name=name;
    }

    public int getId() {
       return id;
    }

    public String getName() {
        return name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

.

قبل از نوشتن متد های read , delete , update , insert برای کلاس Realm باید ابجکتی از نوع Realm ایجاد و مقداردهی کنیم تا برای اعمال این فانکشن ها از آن استفاده کنیم.

پس در onCreate اکتیویتی یا فرگمنت این کار رو انجام میدیم

Realm realm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //bind butter knife
    ButterKnife.bind(this);

    //initialize realm object
    Realm.init(this);
    realm = Realm.getDefaultInstance();

    //read all Person table records for show in list view
    realmRead();

    customAdapter = new CustomAdapter(personsList, this);
    recyclerView.setLayoutManager(new 
            LinearLayoutManager(this));
    recyclerView.setAdapter(customAdapter);
}

همانطور که مشخصه ما از کتابخانه ButterKnife برای درسترسی ساده تر به viewها در سورس کدها استفاده کردیم که برای آموزش کامل این کتابخانه میتوانید به پست مربوط “همه چیز درباره کتابخانه ButterKnife” مراجعه کنید.

و دستورات دسترسی و ویرایش اطلاعات بانک

در جداولی که در فریم ورک Realm ایجاد میکنیم آپشن identity برای فیلد ID جداول وجود ندارد و این امر باعث میشود که ما به صورت دستی id هارو وارد کنیم

که برای این کار هم ما یک متد ایجاد کردیم که بزرگترین id موجود جدول را پیدا میکند و یک واحد بزرگتر از آن را به ما برمیگرداند.

/*
* create a id base of maximum id in database
*/
public int getNextKey() {
    try {
        Number number = realm.where(Person.class).max("id");
        if (number != null) {
            return number.intValue() + 1;
        } else {
            return 0;
        }
    } catch (ArrayIndexOutOfBoundsException e) {
        return 0;
    }
}

/*
*  insert a record in database
*/
private void realmInsert() {
    String name = nameEditText.getText()

            .toString().trim();
    if (!name.isEmpty()) {
        realm.beginTransaction();

        Person person = realm.createObject(
                Person.class, getNextKey());
        person.setName(name);

        realm.commitTransaction();
    }
    nameEditText.setText("");
}

/*
* read all object from database
*/
private void realmRead() {
    // list=new ArrayList<>();
    personsList = realm.where(Person.class)
            .findAllSorted("id", Sort.ASCENDING);
    //list.addAll(realm.copyFromRealm(personsList));
    for (Person student : personsList) {
        Log.e("students", String.valueOf(
                student.getId() + " " + student.getName()));
    }
}

/*
* delete a record by position in list
*/
private void realmDelete() {
    if (position > -1) {
        realm.beginTransaction();

        Person person = personsList.get(position);
        person.deleteFromRealm();

        realm.commitTransaction();
        nameEditText.setText("");
        position = -1;
    }

}

/*
* update a record in database
*/
private void realmUpdate() {
    String newName = nameEditText.
            getText().toString().trim();

    if (position > -1 && !newName.isEmpty()) {
        realm.beginTransaction();

        Person person = personsList.get(position);
        person.setName(newName);

        realm.commitTransaction();
        position = -1;
        nameEditText.setText("");
    }
}

برای دانلود سورس آموزش Realm به کانال تلگرام ما مراجعه کنید.

 GreenDAO

فریم ورک GreenDao پرسرعت ترین و پیشرفته ترین فریم ورک دیتابیس ORM است که ارائه شده.

با استفاده از فریم ورک GreenDAO شما قادر به ذخیره و بازیابی چندین هزار رکورد در چند ثانیه خواهید بود و این خیلی خوبه!

میتوان گفت فریم ورک GreenDAO برای افراد مبتدی چندان مناسب نیست چون بهتر است با مسائل multi threading و rx و.. تا حدودی آشنایی داشته باشند.

نکته قابل توجه فریم ورک GreenDAO این است که با وجود امکاناتی که به صورت کامل و جامع به شما ارائه میده حجم بسیار کمی نیز به اپ شما اضا فه میکن درحد چندکیلو بایت.

.

برای استفاده از فریم ورک پرسرعت GreenDAO نیز مثل فریم ورک های قبل باید ابتدا وابستگی آن را به گردل اضافه کرد

ابتدا در (build.gradle(Module:app عبارت زیر را اضافه میکنیم

compile 'org.greenrobot:greendao:3.2.0'

سپس در (build.gradle(Prioject:greendaoapp نیز پلاگین را اضافه میکنیم

buildscript {
    repositories {
        ...
    }
    dependencies {
     ...
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
    }
}

حالا باید یک Module دیگر مبنی بر GreenDao Generator  که برای تعریف ساختار بانک ما خواهد بدین صورت ایجاد میکنیم

greendao1

greendao1

و سپس با انتخاب Android Library و انتخاب نام ماژول را ایجاد میکنم

حالا خواهید دید که پروژه شما دو ماژول app , greendaogenerator دارد.

greendao-app-creating-module

greendao-app-creating-module

حال در فایل گردل ماژول جدید هم باید greendao رو معرفی کنیم پس 

apply plugin: 'java'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'org.greenrobot:greendao-generator:3.2.0'
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"

خب حالا باید درون کلاسی که با نام MyGenerator ایجاد کردیم برای ایجاد کلاسی که به عنوان جدول ما شناخانه میشود بدین صورت کد نویسی کنیم

.

 


package com.example;

import org.greenrobot.greendao.generator.DaoGenerator;
import org.greenrobot.greendao.generator.Entity;
import org.greenrobot.greendao.generator.Property;
import org.greenrobot.greendao.generator.Schema;

public class MyGenerator {
    public static void main(String[] args) {
        // Your app package name and the (.db)
        // is the folder where the DAO files will be generated into.
        Schema schema = new Schema(1, "com.tejariapp.greendao.db");
        schema.enableKeepSectionsByDefault();


        addTables(schema);

        try {
            new DaoGenerator().generateAll(schema, "./app/src/main/java");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void addTables(final Schema schema) {
        addUserEntities(schema);

    }

    // This is use to describe the colums of your table
    private static Entity addUserEntities(final Schema schema) {
        Entity user = schema.addEntity("User");
        user.addIdProperty().primaryKey().autoincrement();
        user.addStringProperty("first_name");
        return user;
    }

}

خب همونطور که مشخصه باید هنگام تعریف schema نام پکیج خود به علاوه .db قرار دهید تا کلاس های دیتابیس درون آن مسیر ذخیره شوند

حالا با run کردن generator خواهید دید که کلاس User برای شما Generate میشود با فیلدهایی که مشخص کردید و خصیصه هایی که برای آنها در نظر گرفتید

*در صورت نیاز به تغییر هم میتوانید تغییرات را اعمال کنید و ورژن دیتابیس را یک واحد بالا ببرید و دوباره run کنید*

پس بدین صورت کلاس MyGenerate را run کنید

greendao2

greendao2

درصورت اجرا شدن کامل و بدون اشکال خواهید دید که کلاس های مربوطه در ماژول app ایجاد شده اند

 

greendao3

greendao3

حالا باید یک کلاس مشتق شده از Application در ماژول app ایجاد کنیم تادستورات ایجاد بانک را از طریق این کلاس ایجاد کنیم و دلیل این کار هم این است که میخواهیم حتما و تنها یکبار  این دستورات اجرا شوند.

package com.tejariapp.greendao;

import android.app.Application;

import com.tejariapp.greendao.db.DaoMaster;
import com.tejariapp.greendao.db.DaoSession;

import org.greenrobot.greendao.database.Database;

/**
 * Created by Marjan on 07/11/2017.
 */

public class AppController extends Application {
    public static final boolean ENCRYPTED = true;
    private DaoSession daoSession;

    @Override
    public void onCreate() {
        super.onCreate();

        //The users-db here is the name of our database.
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(
                this,"users-db");
        Database db = helper.getWritableDb();
        daoSession = new DaoMaster(db).newSession();

        ///// Using the below lines of code we can toggle ENCRYPTED
        /// to true or false in other to use either an encrypted database or not.
//      DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper
// (this, ENCRYPTED ? "users-db-encrypted" : "users-db");

//      Database db = ENCRYPTED ? helper.getEncryptedWritableDb
// ("super-secret") : helper.getWritableDb();

//      daoSession = new DaoMaster(db).newSession();
    }

    public DaoSession getDaoSession() {
        return daoSession;
    }
}

مشخصا عملیات رمزگذاری و رمزگشایی هم میتونیم برای بالا بردن امنیت بانک خود داشته باشیم و greenDAO کاملا از این عملیات پشتیبانی میکند.

.

user-db هم نام دیتابیس ما تعیین شده  و همچنین در manifest باید این کلاس را در application به صورت زیر قراردارد.

<application
    android:name=".AppController"
...
>
</application>

حال قبل از نوشتن متد های دسترسی و ویرایش اطلاعات بانک باید یک سری آبجکت را درون onCreate اکتیویتی مقداردهی کنیم پس

DaoMaster.DevOpenHelper helper;
SQLiteDatabase db;
DaoMaster daoMaster;
DaoSession daoSession;
UserDao userDao;

@BindView(R.id.nameEditText)
EditText nameEditText;
@BindView(R.id.nameRecyclerView)
RecyclerView recyclerView;

CustomAdapter customAdapter;

ArrayList personsList=new ArrayList();

int position = -1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ButterKnife.bind(this);

    helper = new DaoMaster.DevOpenHelper(this, "users-db", null);
    db = helper.getWritableDatabase();
    daoMaster = new DaoMaster(db);
    daoSession = daoMaster.newSession();
    daoSession = daoMaster.newSession();
    userDao = daoSession.getUserDao();

    QueryBuilder.LOG_SQL = true;
    QueryBuilder.LOG_VALUES = true;

    ButterKnife.bind(this);
    readDAO();

    customAdapter = new CustomAdapter(personsList, this);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(customAdapter);
}

حالا میتونیم با استفاده از ابجکت های تعریف شده فوق متدهای insert , delete ,update , read را بدین صورت بنویسیم

 

/*
* insert in database
*/
private void insertDAO() {
    String newName=nameEditText.getText()
            .toString().trim();
    if (!newName.isEmpty()) {
        User person = new User();
        person.setFirst_name(newName);
        userDao.insertOrReplace(person);
        personsList.add(person);
        customAdapter.notifyItemInserted(
                personsList.size() - 1);
    }
}

/*
* read all from database
*/
private void readDAO() {
    personsList= userDao.queryBuilder()
            .orderAsc(UserDao.Properties.Id)
            .list();

    for (User user : personsList)
        Log.e("user", String.valueOf(user.getId()) +
                user.getFirst_name());
}

/*
* update special record in database
*/
private void updateDAO() {
    String newName=nameEditText.getText().toString().trim();
    if (!newName.isEmpty() && position >-1) {
        User user = userDao.queryBuilder()
                .where(UserDao.Properties.Id.eq(
                        personsList.get(position)
                                .getId())).limit(1).unique();
        user.setFirst_name(newName);
        userDao.insertOrReplace(user);
        personsList.set(position, user);
        customAdapter.notifyItemChanged(position);
        position=-1;
    }
}

/*
* delete a record base of id
*/
private void deleteDAO() {
    if (position >-1) {
        User user = userDao.queryBuilder().where(
                UserDao.Properties.Id.eq(
                        personsList.get(position).getId())).limit(1).unique();
        userDao.delete(user);
        personsList.remove(position);
        customAdapter.notifyDataSetChanged();
        position=-1;
    }
}

برای دانلود سورس آموزش GreenDAO به کانال تلگرام ما مراجعه کنید.

موفق و پیروز باشید 🙂

 

دیدگاه ها بسته شده است