Ví dụ greenDao 3

Persisting data là yêu cầu thiết yếu của bất kỳ ứng dụng nào. Trong Android, chúng ta có thể persist data thông thường bằng ba chế độ.

  • SQLite
  • SharedPreferences
  • File System

Cách đơn giản nhất để persist data là sử dụng cơ sở dữ liệu SQLite và làm việc thông qua SqliteOpenHelper. Cách tiếp cận này đòi hỏi phải viết các truy vấn thô và thao tác thông qua các con trỏ. Nó trở nên khó khăn để quản lý khi code base trở nên lớn và nó cũng dễ bị lỗi thủ công. Giải pháp cho việc này là sử dụng các Data Access Objects hoặc DAOs.

GreenDAO là một nguồn mở Android ORM làm cho sự phát triển cho cơ sở dữ liệu SQLite dễ dàng. Nó làm khiến developer nhẹ nhàng hơn từ xử lý yêu cầu cơ sở dữ liệu cấp thấp trong khi tiết kiệm thời gian phát triển. GreenDAO giải phóng bạn khỏi việc viết SQL và phân tích các kết quả truy vấn, là những công việc khá tẻ nhạt và tốn thời gian, bằng cách ánh xạ các đối tượng Java vào các bảng cơ sở dữ liệu (gọi là ORM "object / relational mapping"). Bằng cách này bạn có thể lưu trữ, cập nhật, xóa và truy vấn các đối tượng Java sử dụng một API hướng đối tượng đơn giản.

greenDAO 3 sử dụng Annotation Processing để generate các DAO class.

STEP 1:

Cung cấp Gradle dependency trong app/build.gradle.

compile 'org.greenrobot:greendao:3.2.2'

STEP 2:

Cung cấp greenDAO Gradle plugin cho Annotation processing trong build.gradle của project.

classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'

Sau đó sử dụng plugin này trong app/build.gradle, phía dưới plugin com.android.application:

apply plugin: 'org.greenrobot.greendao'

STEP 3:

GreenDAO yêu cầu chúng ta tạo schema của bảng trong form của class với greenDAO annotations. Hãy tạo một bảng User với mộ vài thuộc tính.

Tạo một class User.java

@Entity(nameInDb = "user")
public class User {

    @Id(autoincrement = true)
    private Long id;

    @Property(nameInDb = "name")
    private String name;

    @Property(nameInDb = "created_at")
    private String createdAt;

    @Property(nameInDb = "updated_at")
    private String updatedAt;
}

Khi bạn build project, nó sẽ tạo ra getter, setters, và constructor cho lớp này.

  • @Entity: định nghĩa tên bảng của database
  • @Id: định nghĩa primary key của bảng
  • @Property: định nghĩa tên các hàng trong bảng user

STEP 4: Explore class DAO được tạo ra tại app/build/generated/source/greendao. Chúng ta có thể thấy một vài class trong thư mục này:

  • DaoMaster: class định nghĩa các method cho việc tạo và thực thi trong database.
  • DaoSession: class cung cấp các class DAO cho truy cập các bảng trong database.
  • UserDao: class wrap bảng Uer và định nghĩa các Query cho nó.

STEP 5:

Để sử dụng database, chúng ta cần construct DaoSession Object.

Tạo một class DemoApp extends từ android.app.Application và mention nó trong AndroidManifest.xml.

public class DemoApp extends Application {

    private DaoSession mDaoSession;

    @Override
    public void onCreate() {
        super.onCreate();
        mDaoSession = new DaoMaster(
                new DaoMaster.DevOpenHelper(this, "greendao_demo.db").getWritableDb()).newSession();

        // USER CREATION FOR DEMO PURPOSE
        if(mDaoSession.getUserDao().loadAll().size() == 0){
            mDaoSession.getUserDao().insert(new User(1L, "Janishar Ali","", ""));
        }
    }

    public DaoSession getDaoSession() {
        return mDaoSession;
    }
}

Trong AndroidManifest.xml thêm android:name=".DemoApp":

application
    ...
    android:name=".DemoApp"
    ...

STEP 6:

Test bảng user trong MainActivity.java.

public class MainActivity extends AppCompatActivity {

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

        TextView textView = (TextView) findViewById(R.id.text);

        // Put this in a different thread or use AsyncSession in greenDAO.
        // For Demo purpose, this query is made on main thread but it should in a different thread.
        User user = ((DemoApp)getApplication()).getDaoSession().getUserDao().load(1L);

        if(user != null){
            textView.setText(user.getName());
        }
    }
}

Bạn có thể thấy user name xuất hiện trong main_activity textview.

STEP 7:

Bạn không nên sử dụng DevOpenHelper, như chúng ta đã sử dụng trong DemoApp DaoSession creation. Bởi vì với một version app mới, bạn có thể sẽ muốn modify database schema hoặc alter table. Với mục đích đó, chúng ta nên custom một OpenHelper cho DaoMaster.

Tạo một class DbOpenHelper.

public class DbOpenHelper extends DaoMaster.OpenHelper {

    public DbOpenHelper(Context context, String name) {
        super(context, name);
    }

    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {
        super.onUpgrade(db, oldVersion, newVersion);
        Log.d("DEBUG", "DB_OLD_VERSION : " + oldVersion + ", DB_NEW_VERSION : " + newVersion);
        switch (oldVersion) {
            case 1:
            case 2:
                //db.execSQL("ALTER TABLE " + UserDao.TABLENAME + " ADD COLUMN " + UserDao.Properties.Name.columnName + " TEXT DEFAULT 'DEFAULT_VAL'");
        }
    }
}

Reinstall App và giờ OpenHelper(DbOpenHelper) sẽ được sử dụng.

STEP 8:

Bạn sẽ cần xác định schema version của database vì thế bạn cần lấy old version và new version khi app upgraded. Để xác định nó, chúng ta cần add schema vào app/build.gradle.

android {
	...
}

greendao {
    schemaVersion 1
}

Khi bạn upgrade schema trong new app version, tăng schema Version này lên. Bạn nên tự handle code trong method onUpgrade của class DbOpenHelper.

Nguồn: https://mindorks.com/blog/powerful-android-orm-greendao-3-tutorial


All Rights Reserved