Android資料庫—GreenDAO簡單詳解
簡單介紹
greenDao是一個將物件對映到SQLite資料庫中的輕量且快速的ORM解決方案。
關於greenDAO的概念可以看官網 (greenDAO)
greenDAO
官網中明確指明瞭其首要設計目標:
Maximum performance (probably the fastest ORM for Android):系能最大化
Easy to use APIs:便於使用
Highly optimized for Android:對於Android高度優化
Minimal memory consumption:最小化記憶體開銷
Small library size, focus on the essentials:較小的檔案體積,只集中在必要的部分上。
小總結:
1、一個精簡的庫
2、效能最大化
3、記憶體開銷最小化
4、易於使用的 APIs
5、對 Android 進行高度優化
GREENDAO 設計的主要特點
greenDAO 效能遠遠高於同類的 ORMLite,具體測試結果可見官網
greenDAO 支援 protocol buffer(protobuf) 協議資料的直接儲存,如果你通過 protobuf 協議與伺服器互動,將不需要任何的對映。
與 ORMLite 等使用註解方式的 ORM 框架不同,greenDAO 使用「Code generation」的方式,這也是其效能能大幅提升的原因。
優點:
效率很高,插入和更新的速度是sqlite的2倍,載入實體的速度是ormlite的4.5倍。官網測試結果:http:/
/greendao-orm.com/features/
檔案較小(<100K),佔用更少的記憶體 ,但是需要create Dao,
操作實體靈活:支援get,update,delete等操作
缺點:
學習成本較高。其中使用了一個java工程根據一些屬性和規則去generate一些基礎程式碼,類似於javaBean但會有一些規則,另外還有QueryBuilder、Dao等API,所以首先要明白整個過程,才能方便使用。沒有ORMLite那樣封裝的完整,不過greenDao的官網上也提到了這一點,正是基於generator而不是反射,才使得其效率高的多。
另外GreenDao支援Protocol buffers協議資料的直接儲存 ,如果通過protobuf協議和伺服器互動,不需要任何的對映。
Protocol Buffers協議:以一種高效可擴充套件的對結構化資料進行編碼的方式。google內部的RPC協議和檔案格式大部分都是使用它。
RPC:遠端過程呼叫(Remote Procedure Call,RPC)是一個計算機通訊協議,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。
DaoMaster:使用greendao切入點。daomaster儲存資料庫物件(SQLite資料庫管理)和DAO類對於一個特定的模式。通過 DaoMaster 的內部類 DevOpenHelper,你可以得到一個便利的 SQLiteOpenHelper 物件。
DaoSession:管理特定架構的所有可用的DAO物件,你可以使用一個getter方法獲得。daosession還提供了一些通用的永續性方法如插入、更新和刪除,重新整理載入,實體。
DAOs:資料訪問物件(DAO)堅持和查詢實體。每一個實體,greendao產生一道。它比daosession,更持久的方法例如:計數,loadall,和insertintx。
GreenDao 3.0使用
GreenDao 3.0採用註解的方式來定義實體類,通過gradle外掛生成相應的程式碼。
一,在as中匯入相關的包
compile'org.greenrobot:greendao:3.0.1'
compile'org.greenrobot:greendao-generator:3.0.0'
二,在build.gradle中進行配置:
apply plugin: 'org.greenrobot.greendao'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
}
}
三,自定義路徑
greendao {
schemaVersion 1
daoPackage 'com.anye.greendao.gen'
targetGenDir 'src/main/java'
}
在gradle的根模組中加入上述程式碼,就完成了我們的基本配置了。
屬性介紹:
schemaVersion–> 指定資料庫schema版本號,遷移等操作會用到;
daoPackage –> dao的包名,包名預設是entity所在的包;
targetGenDir –> 生成資料庫檔案的目錄;
四,建立一個User的實體類
public class User {
@Id
private Long id;
private String name;
@Transient
private int tempUsageCount; // not persisted
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
@Generated(hash = 873297011)
public User(Long id, String name) {
this.id = id;
this.name = name;
}
@Generated(hash = 586692638)
public User() {
}
}
五,MakeProject
編譯專案,User實體類會自動編譯,生成get、set方法並且會在com.anye.greendao.gen目錄下生成三個檔案;
public class MyApplication extends Application {
private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
public static MyApplication instances;
@Override
public void onCreate() {
super.onCreate();
instances = this;
setDatabase();
}
public static MyApplication getInstances(){
return instances;
}
/**
* 設定greenDao
*/
private void setDatabase() {
// 通過 DaoMaster 的內部類 DevOpenHelper,你可以得到一個便利的 SQLiteOpenHelper 物件。
// 可能你已經注意到了,你並不需要去編寫「CREATE TABLE」這樣的 SQL 語句,因為 greenDAO 已經幫你做了。
// 注意:預設的 DaoMaster.DevOpenHelper 會在資料庫升級時,刪除所有的表,意味著這將導致資料的丟失。
// 所以,在正式的專案中,你還應該做一層封裝,來實現資料庫的安全升級。
mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = mHelper.getWritableDatabase();
// 注意:該資料庫連線屬於 DaoMaster,所以多個 Session 指的是相同的資料庫連線。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
}
在清單檔案中註冊
獲取UserDao物件:
簡單的增刪改查實現:
ublic class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mAdd,mDelete,mUpdate,mFind;
private TextView mContext;
private User mUser;
private UserDao mUserDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
/** DaoSession:管理特定架構的所有可用的DAO物件,你可以使用一個getter方法獲得。daosession還提供了一些通用的永續性方法如插入、更新和刪除,重新整理載入,實體。**/
mUserDao = MyApplication.getInstances().getDaoSession().getUserDao();
}
private void initEvent() {
mAdd.setOnClickListener(this);
mDelete.setOnClickListener(this);
mUpdate.setOnClickListener(this);
mFind.setOnClickListener(this);
}
private void initView() {
mContext = (TextView) findViewById(R.id.textView);
mAdd = (Button) findViewById(R.id.button);
mDelete = (Button) findViewById(R.id.button2);
mUpdate = (Button) findViewById(R.id.button3);
mFind = (Button) findViewById(R.id.button4);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
addDate();
break;
case R.id.button2:
deleteDate();
break;
case R.id.button3:
updateDate();
break;
case R.id.button4:
findDate();
break;
}
}
/**
* 增加資料
*/
private void addDate() {
mUser = new User((long)3,"anye3");
mUserDao.insert(mUser);//新增一個
mContext.setText(mUser.getName());
}
/**
* 刪除資料
*/
private void deleteDate() {
deleteUserById(2);
}
/**
* 根據主鍵刪除User
*
* @param id User的主鍵Id
*/
public void deleteUserById(long id) {
mUserDao.deleteByKey(id);
}
/**
* 更改資料
*/
private void updateDate() {
mUser = new User((long)2,"anye0803");
mUserDao.update(mUser);
}
/**
* 查詢資料
*/
private void findDate() {
List<User> users = mUserDao.loadAll();
String userName = "";
for (int i = 0; i < users.size(); i++) {
userName += users.get(i).getName()+",";
}
mContext.setText("查詢全部資料==>"+userName);
}
}
greendao中的註解
(一) @Entity 定義實體
@nameInDb 在資料庫中的名字,如不寫則為實體中類名
@indexes 索引
@createInDb 是否建立表,預設為true,false時不建立
@schema 指定架構名稱為實體
@active 無論是更新生成都重新整理
(二) @Id
(三) @NotNull 不為null
(四) @Unique 唯一約束
(五) @ToMany 一對多
(六) @OrderBy 排序
(七) @ToOne 一對一
(八) @Transient 不儲存在資料庫中
(九) @generated 由greendao產生的建構函式或方法