1. 程式人生 > >第三方開源庫:資料庫:GreenDao

第三方開源庫:資料庫:GreenDao

簡介

GreenDao是一個用於Android開發的物件/關係對映(ORM)工具。它向SQLite資料庫提供了一個物件導向的介面。主要是將物件對映到SQLite資料庫中,GreenDao3.0是greendao的一個新的版本。

真機中沒看到資料庫檔案,查了網上資料,可能是手機沒有root就看不到我們建立的資料庫。

步驟

  • 配置GreenDao
  • 創阿資料庫管理類
  • 增刪改查

Step1:配置GreenDao

步驟

  • 配置project的build.gradle
  • 配置module的build.gradle
  • 新建實體類
  • make project 點小錘子

Step1-1:配置project的build.gradle

也可以把這個配置程式碼放在module的build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
    }
}

Step1-2:配置module的build.gradle

GreenDao 含義
schemaVersion 資料庫版本號
daoPackage dao所在的包名
targetGenDir 自動生成的資料庫檔案的目錄

如果上面不指定目錄的話,資料庫檔案就會生成到build/generated/source/greendao下面,還需要拷貝到自己的目錄中,所以這裡還是指定生成目錄為好。

apply plugin: 'org.greenrobot.greendao'


dependencies {
    compile 'org.greenrobot:greendao:3.2.0'
}

greendao{
    schemaVersion=1
    daoPackage 'com.cqc.greendao05.dao.gen'
    targetGenDir 'src/main/java'
}

Step1-3:新建實體類

這裡寫圖片描述

Step1-4:小錘子

點選小錘子(make project)會生成3個數據庫管理類:DaoMaster``DaoSession``PersonInfoDao,以及PersonInfogets and sets

這裡寫圖片描述 或: 這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

Step2:創阿資料庫管理類

public class GreenDaoManager {

    private DaoMaster.DevOpenHelper helper;
    private DaoMaster daoMaster;
    private DaoSession daoSession;
    private static GreenDaoManager greenDaoManager;

    private GreenDaoManager() {
        helper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "GreenDao_DB");
        daoMaster = new DaoMaster(helper.getWritableDb());
        daoSession = daoMaster.newSession();
    }

    public static GreenDaoManager getInstance() {
        if (greenDaoManager == null) {
            greenDaoManager = new GreenDaoManager();
        }
        return greenDaoManager;
    }

    public DaoMaster.DevOpenHelper getDevOpenHelper() {
        return helper;
    }

    public DaoMaster getDaoMaster() {
        return daoMaster;
    }

    public DaoSession getDaoSession() {
        return daoSession;
    }

    public void closeDB() {
        if (helper != null) {
            helper.close();
        }
    }
}

並在Application中初始化,別忘了在AndroidManifest.xml中配置name

public class MyApplication extends Application {

    private static Context context ;
    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
        GreenDaoManager.getInstance();
    }

    public static Context getContext() {
        return context;
    }
}

Step3:增刪改查

dao是增刪改查的操作類

PersonInfoDao dao = GreenDaoManager.getDaoSession().getPersonInfoDao();

由於查詢用的最多,這裡想介紹查詢,GreenDao採用了構造這模式
查詢結果為集合 :

List<PersonInfo> usersList = dao.queryBuilder().build().list();

查詢結果為實體類:where表示條件

PersonInfo info = dao.queryBuilder().where(PersonInfoDao.Properties.Id.eq(id)).build().unique();

增*

PersonInfo info = new PersonInfo(id, name, age);
dao.insert(info);

刪除一個物件:

PersonInfo info = dao.queryBuilder().where(PersonInfoDao.Properties.Id.eq(id)).build().unique();
dao.delete(info);

刪除多個物件

List<PersonInfo> userList = dao.queryBuilder().where(PersonInfoDao.Properties.Name.eq(name)).build().list();
for (PersonInfo info : userList) {
    dao.delete(info);
}

刪除全部資料

dao.deleteAll()

先根據條件查詢到資料,再進行修改

String id = et1.getText().toString().trim();
PersonInfo info = dao.queryBuilder().where(PersonInfoDao.Properties.Id.eq(id)).build().unique();

info.setName(info.getName() + "update");
dao.update(info);

註解

註解名稱 說明
schema 使得GreenDao知道當前實體屬於哪個schema
active 標記一個實體處於活動狀態,活動實體有更新、刪除和重新整理方法
nameInDb 在資料中使用的別名,預設使用的是實體的類名
indexes 定義索引,可以跨越多個列
createInDb 標記建立資料庫表
@Entity greendao的一個實體註解,因為有了它,我們的實體類才回被greendao識別並生成一個dao
@Id 主鍵 Long型(預設是自增長的)也可以通過@Id(autoincrement = true)設定自增長
@NotNull @NotNull 標記後,表示這個屬性在資料表中的這一列不能為空
@Transient 新增這個標記之後,我們在實體類中的屬性不會自動在資料表中生成這個屬性表示的這一列
@Unique 向資料庫列添加了一個唯一的約束
schema 使得GreenDao知道當前實體屬於哪個schema
active 標記一個實體處於活動狀態,活動實體有更新、刪除和重新整理方法
nameInDb 在資料中使用的別名,預設使用的是實體的類名
indexes 定義索引,可以跨越多個列
createInDb 標記建立資料庫表
@Property 設定一個非預設關係對映所對應的列名,預設是的使用欄位名 比如:@Property (nameInDb=”name”)
@Index 使用@Index作為一個屬性來建立一個索引,通過name設定索引別名,也可以通過unique給索引新增約束
@ToOne 定義與另一個實體(一個實體物件)的關係,即一對一
@ToMany 定義與多個實體物件的關係 即一對多
@JoinEntity 多對多
referencedJoinProperty 指定目標實體中與源實體相對應的外來鍵
joinProperty 對於複雜一點的關係可以定義一組@JoinProperty註解。每個@JoinProperty註解都需要有源實體中的源屬性和對應實體中的引用屬性。

問題

1(table PERSON_INFO has no column named SEX (code 1): …

開始沒有sex屬性,執行正確,再新增sex屬性,點選這裡寫圖片描述,結果報錯。

報錯截圖:
這裡寫圖片描述
報錯的資訊是:沒有sex這一列,但是我已經添加了,無論是PersonInfo,還是PersonInfoDao,都有sex.
這裡寫圖片描述

這裡寫圖片描述

那麼問題出在哪裡呢。

解決方法:

解除安裝原app,在執行程式碼即可解決。所以我覺得是AS的問題。