Android資料庫——GreenDAO3.2.2的使用
阿新 • • 發佈:2019-01-28
廢話不多說,今天我們來學習:開源的Android資料庫ORM框架——greenDAO。
GreenDao介紹
greenDAO是Android的一個物件/關係對映(ORM)工具。它為關係資料庫SQLite提供面向物件的介面。
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目錄下生成三個檔案,如下:
編寫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按鈕,觀察日誌如下:
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按鈕,觀察日誌如下:
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按鈕時,觀察列印日誌如下:
查詢單個數據:
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:定義與多個實體物件的關係