1. 程式人生 > >Android資料庫——GreenDAO3.2.2的使用

Android資料庫——GreenDAO3.2.2的使用

廢話不多說,今天我們來學習:開源的Android資料庫ORM框架——greenDAO。

GreenDao介紹

greenDAO是Android的一個物件/關係對映(ORM)工具。它為關係資料庫SQLite提供面向物件的介面。

greenDao

GreenDao優點

  • 效能最大化(Android平臺最快的ORM框架)
  • 簡潔直觀的API
  • 支援SQLCipher加密資料庫
  • 依賴體積小
  • 記憶體開銷最小化
  • 對Android進行高度優化

GreenDao的使用

在Android Studio專案 build.gradle(Project:專案名稱)檔案中引入:

buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
} dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin } }

在 build.gradle(Module.app)檔案中引入:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin

...
//greendao配置 greendao { schemaVersion 1 //資料庫版本號 daoPackage 'app.hjw.com.greendao.gen' //生成Dao,DaoMaster和DaoSession的包名(預設實體的包名) targetGenDir 'src/main/java' //自定義生成原始檔的路徑 } dependencies { ... compile 'org.greenrobot:greendao:3.2.2' // add library }

編寫程式碼示例

建立User實體類中的程式碼

@Entity
public class User { @Id(autoincrement = true) private Long id; @NotNull private String name; @NotNull private int age; @Transient private int tempUsageCount; ... }

MakeProject

編譯專案,自動編譯User實體類,並在User類中生成get、set方法以及在app.hjw.com.greendao.gen目錄下生成三個檔案,如下:

gen

編寫Application中的程式碼

public class MyApplication extends Application {

    private DaoMaster.DevOpenHelper mHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;

    public static MyApplication instances;

    public static MyApplication getInstances() {
        return instances;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instances = this;
        setDataBase();

    }

    private void setDataBase() {
        mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
        //通過DaoMaster.DevOpenHelper得到SQLiteOpenHelper物件
        db = mHelper.getWritableDatabase();
        //該資料庫連線屬於 DaoMaster,所以多個 Session 指的是相同的資料庫連線。
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }

    public DaoSession getmDaoSession() {
        return mDaoSession;
    }

    public SQLiteDatabase getDb() {
        return db;
    }
}

最後不要忘記在我們的AndroidManifest.xml中指定MyApplication。

在MainAcitivity中onCreate獲取Dao物件

 daoSession = MyApplication.getInstances().getmDaoSession();
 userDao = daoSession.getUserDao();

Insert

 private void insertData() {
        User user = new User();
        try {
            user.setName("hjw");
            user.setAge(23);
            userDao.insert(user);
            Log.d(TAG, "insertData: " + user.getId());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

當我們點選Insert按鈕,觀察日誌如下:

insert

Delete

根據條件刪除資料:

private void deleteData(long id) {

        List<User> userList = null;
        try {
            userList = (List<User>) userDao.queryBuilder().where(UserDao.Properties.Id.le(id)).build().list();
            for (User user : userList) {
                userDao.delete(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

當我們點選Delete按鈕,就可以根據Id刪除想要刪除的資料。

首先我們通過where查詢條件,這裡id傳入的小於等於id的資料,where可以有多個引數(多個查詢條件),最後list()表示查詢結果是一個List集合。(unique表示查詢一條資料)。

根據主鍵刪除:

 private void deleteDataById(long id){
        userDao.deleteByKey(id);
    }

刪除所有的資料:

 private void deleteDataAll() {
        userDao.deleteAll();
    }

Update

根據Id修改資料:

  private void updateData(long id) {

        try {
            User user = new User(id,"hxn",18);
            userDao.update(user);
            Log.d(TAG, "updateData: " + user.getName());
        } catch (Exception e) {
            Log.d(TAG, "updateData failed" + e.getMessage());
        }

    }

當我們點選Update按鈕,觀察日誌如下:

update

Query

查詢全部資料:

private void queryAll() {

        try {
            List<User> users = userDao.loadAll();
            for (User u : users) {
                Log.d(TAG, "queryAll: "
                        + "  id:" + u.getId()
                        + "  name" + u.getName()
                        + "  age" + u.getAge());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

當我們點選Query按鈕時,觀察列印日誌如下:

queryAll

查詢單個數據:

private void queryByName() {
        User hjw = userDao.queryBuilder().where(UserDao.Properties.Name.eq("hjw")).unique();
        Log.d(TAG, "queryByName: " + "  name" + hjw.getName() + "  age" + hjw.getAge() + "  id" + hjw.getId());
    }

資料庫升級

升級資料庫分為兩個步驟:

  • 修改gradle
    首先module中的gradle檔案中修改資料庫的版本號:
schemaVersion 2  //最新版本號
  • 修改實體類(比如增加或刪除欄位)

最後我們MakeProject編譯專案即可。一般的資料庫升級這樣就可以了,特殊情況可能需要自己編寫資料庫遷移指令碼。

註解

實體@Entity註解

schema:告知GreenDao當前實體屬於哪個schema
active:標記一個實體處於活動狀態,活動實體有更新、刪除和重新整理方法
nameInDb:在資料中使用的別名,預設使用的是實體的類名
indexes:定義索引,可以跨越多個列
createInDb:標記建立資料庫表

基礎屬性註解

@Id :主鍵 Long型,通過@Id(autoincrement = true)設定自增長
@Property:設定一個非預設關係對映所對應的列名,預設是的使用欄位名 舉例:@Property (nameInDb="name")
@NotNul:設定資料庫表當前列不能為空
@Transient :新增次標記之後不會生成資料庫表的列

索引註解

@Index:使用@Index作為一個屬性來建立一個索引,通過name設定索引別名,也可以通過unique給索引新增約束
@Unique:向資料庫列添加了一個唯一的約束

關係註解

@ToOne:定義與另一個實體(一個實體物件)的關係
@ToMany:定義與多個實體物件的關係

總結