作者:鄒峰立萝招,微博:zrunker,郵箱:zrunker@yahoo.com朴爬,微信公眾號(hào):書(shū)客創(chuàng)作即寒,個(gè)人平臺(tái):www.ibooker.cc。
本文選自書(shū)客創(chuàng)作平臺(tái)第9篇文章召噩。閱讀原文 母赵。
在了解greenDao之前首要知道什么是SQLite,什么是ORM具滴?
SQLite是一款輕量級(jí)嵌入式關(guān)系型數(shù)據(jù)庫(kù)凹嘲,也是移動(dòng)端最為常用的一種關(guān)系型數(shù)據(jù)庫(kù)。
ORM對(duì)象關(guān)系映射构韵,簡(jiǎn)單一點(diǎn)說(shuō)就是實(shí)現(xiàn)數(shù)據(jù)庫(kù)表結(jié)構(gòu)與對(duì)象一一對(duì)印周蹭。
greenDao簡(jiǎn)介
官網(wǎng)解釋:greenDAO: Android ORM for your SQLite database。
greenDAO是Android中對(duì)SQLite進(jìn)行對(duì)象關(guān)系映射的一個(gè)框架疲恢。
greenDao之所以很流行凶朗,跟它的優(yōu)點(diǎn)是息息相關(guān)的:
- 一個(gè)精簡(jiǎn)的庫(kù)
- 性能最大化
- 內(nèi)存開(kāi)銷最小化
- 易于使用的 API
- 對(duì) Android 進(jìn)行高度優(yōu)化
Android中ORM框架有很多,如OrmLite显拳,ActiveAndroid等棚愤,但是相對(duì)而言,greenDao性能更加優(yōu)秀杂数。
greenDao-Generator2使用
在使用greenDao之前要生成相應(yīng)的表宛畦,Bean,Dao文件等揍移,這個(gè)生成過(guò)程可以利用Eclipse/MyEclipse/Android Studio等相關(guān)工具來(lái)實(shí)現(xiàn)次和。
如果使用Eclipse/MyEclipse實(shí)現(xiàn),需要添加greendao-generator:2.1.0和freemaker兩個(gè)jar那伐。
如果使用Android Studio實(shí)現(xiàn)踏施,只要在創(chuàng)建的Java Module中添加greendao-generator:2.1.0即可。
下面將以Android Studio為例罕邀,實(shí)現(xiàn)這一功能读规。
配置:首先創(chuàng)建一個(gè)Android工程,然后添加一個(gè)Module(Java Library)燃少,最后在Module的build.gradle文件中中添加greendao-generator:2.1.0依賴束亏。
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'de.greenrobot:greendao-generator:2.1.0'
}
使用:greendao-generator是用來(lái)生成相應(yīng)的表,Bean阵具,Dao文件等碍遍。假如要生成一個(gè)用戶表定铜,一個(gè)朋友表,一個(gè)用戶可以有多個(gè)朋友怕敬,一個(gè)朋友數(shù)據(jù)最多對(duì)應(yīng)一個(gè)用戶揣炕,那么該如何實(shí)現(xiàn)呢?
public class ZGenerator {
public static void main(String args[]) {
// 創(chuàng)建一個(gè)模式Shcema
// 參數(shù)1-版本东跪,參數(shù)2-包名
Schema schema = new Schema(1, "cc.ibooker.daogenerator");
// 添加Entity-相當(dāng)于表-用戶對(duì)象
// 參數(shù)-代表生成對(duì)象類名
Entity user = schema.addEntity("User");
user.addIdProperty().autoincrement();// 添加ID-自增
user.addLongProperty("uId");
user.addStringProperty("uRealname");
user.addStringProperty("uSex");
user.addStringProperty("uBirthday");
user.addFloatProperty("uHeight");
user.addFloatProperty("uWeight");
user.addStringProperty("uDomicile");
user.addLongProperty("uPhone");
user.addStringProperty("uEmail");
user.addStringProperty("uWeibo");
// 朋友表/對(duì)象
Entity friend = schema.addEntity("Friend");
friend.addIdProperty().autoincrement();// 添加ID-自增
friend.addStringProperty("fGname");
// 添加外鍵-只能關(guān)聯(lián)User主鍵
Property fUid = friend.addLongProperty("fUid").getProperty();
friend.addToOne(user, fUid);// 一對(duì)一
user.addToMany(friend, fUid).setName("friends");// 一對(duì)多
// 生成相關(guān)文件
try {
// 參數(shù)1-schema畸陡,參數(shù)2-生成路徑
new DaoGenerator().generateAll(schema, "app/src/main/java");
} catch (Exception e) {
e.printStackTrace();
}
}
}
1、創(chuàng)建Schema(設(shè)置模式)
/**
* @param version 版本號(hào)-可以理解為數(shù)據(jù)庫(kù)版本號(hào)
* @param defaultJavaPackage 默認(rèn)包名-即文件生成路徑
**/
Schema schema = new Schema(int version, String defaultJavaPackage);
2虽填、添加表對(duì)象
/**
* @param className 生成Bean文件的類名
**/
Entity entity = schema.addEntity(String className);
// 添加主鍵-并實(shí)現(xiàn)主鍵自增
entity.addIdProperty().autoincrement();
// 添加字段名-根據(jù)添加類型進(jìn)行設(shè)置
entity.addStringProperty(String propertyName);
entity.addLongProperty(String propertyName);
添加外鍵-只能關(guān)聯(lián)主鍵
// 添加外鍵-只能關(guān)聯(lián)User主鍵
Property property = entity.addLongProperty(String propertyName).getProperty();
一對(duì)一關(guān)聯(lián)
/**
* @param target 目標(biāo)表對(duì)象(關(guān)聯(lián)對(duì)象)
* @param fkProperty 外鍵
**/
entity.addToOne(Entity target, Property fkProperty);
一對(duì)多關(guān)聯(lián)
/**
* @param target 目標(biāo)表對(duì)象(關(guān)聯(lián)對(duì)象)
* @param fkProperty 外鍵
**/
ToMany tomany = entity.addToMany(Entity target, Property fkProperty);
// 設(shè)置外鍵對(duì)象名稱
tomany.setName(String name);
3丁恭、編譯執(zhí)行
try {
// 參數(shù)1-schema,參數(shù)2-生成根路徑
new DaoGenerator().generateAll(schema, "app/src/main/java");
} catch (Exception e) {
e.printStackTrace();
}
greenDao2使用
配置:在build.gradle(app)中加入greendao:2.1.0依賴斋日。
dependencies {
compile 'de.greenrobot:greendao:2.1.0'
}
使用:greendao:2.1.0主要是用來(lái)操作數(shù)據(jù)庫(kù)牲览,而對(duì)于數(shù)據(jù)庫(kù)的操作主要是增刪改查。
在實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查之前必須對(duì)相關(guān)Dao文件進(jìn)行實(shí)例化恶守,那么該如何進(jìn)行實(shí)例化呢第献?
// 獲取一個(gè)可讀可寫數(shù)據(jù)庫(kù)對(duì)象,參數(shù)1-上下文對(duì)象兔港,參數(shù)2-數(shù)據(jù)庫(kù)名稱庸毫,參數(shù)3-游標(biāo)工廠CursorFactory
SQLiteDatabase db = new DaoMaster.DevOpenHelper(this, "ibookerdata.db", null).getWritableDatabase();
// 獲取DAO模式
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
FriendDao friendDao = daoSession.getFriendDao();
UserDao userDao = daoSession.getUserDao();
對(duì)Dao對(duì)象進(jìn)行實(shí)例化之后,就可以通過(guò)相關(guān)Dao來(lái)操作相關(guān)表衫樊。
1岔绸、插入數(shù)據(jù)-GreenDao可以實(shí)現(xiàn)單一對(duì)象插入和批量插入功能。
- 插入一條數(shù)據(jù)
// 參數(shù)為User對(duì)象
long id = userDao.insert(User user);
- 批量插入數(shù)據(jù)
// 參數(shù)為User對(duì)象集
userDao.insertInTx(List<User> users);
2橡伞、修改數(shù)據(jù)-GreenDao可以實(shí)現(xiàn)單一對(duì)象修改和批量修改功能。
- 修改一條數(shù)據(jù)
// 參數(shù)為User對(duì)象
userDao.update(User user);
- 批量修改數(shù)據(jù)
// 參數(shù)為User對(duì)象集
userDao.updateInTx(List<User> users);
3晋被、刪除數(shù)據(jù)
- 刪除一條數(shù)據(jù)
userDao.delete(User user);
- 根據(jù)主鍵ID刪除數(shù)據(jù)
userDao.deleteByKey(K key);
- 批量刪除數(shù)據(jù)
userDao.deleteInTx(List<User> users);
- 刪除所有數(shù)據(jù)
userDao.deleteAll();
4兑徘、查詢數(shù)據(jù)
- 查詢所有數(shù)據(jù)-三種方式
// 方式一
List<User> list = userDao.queryBuilder().list();
// 方式二
List<User> list = new ArrayList<>();
Iterator iterator = userDao.queryBuilder().listIterator();
while (iterator.hasNext()) {
User user = (User) iterator.next();
// 一般用來(lái)篩選需要的對(duì)象
list.add(user);
}
// 方式三
userDao.loadAll();
- 懶加載-記得使用完之后關(guān)閉掉close
LazyList<User> list = userDao.queryBuilder().listLazy();
list.close();
- 條件查詢
// keyWord為關(guān)鍵字
// 查詢相等數(shù)據(jù)
userDao.queryBuilder().where(UserDao.Properties.URealname.eq(keyWord)).unique();
// 查詢相等數(shù)據(jù)集
userDao.queryBuilder().where(UserDao.Properties.URealname.eq(keyWord)).list();
// 查詢不相等數(shù)據(jù)
userDao.queryBuilder().where(UserDao.Properties.URealname.notEq(keyWord)).list();
// 模糊查詢
userDao.queryBuilder().where(UserDao.Properties.UBirthday.like("%" + keyWord + "%")).list();
// 范圍查詢-minValue最小值,maxValue最大值
userDao.queryBuilder().where(UserDao.Properties.UBirthday.between(minValue, maxValue)).list();
// 查詢大于
userDao.queryBuilder().where(UserDao.Properties.UHeight.gt(keyWord)).list();
// 大于等于
userDao.queryBuilder().where(UserDao.Properties.UHeight.ge(keyWord)).list();
// 小于
userDao.queryBuilder().where(UserDao.Properties.UWeight.lt(keyWord)).list();
// 小于等于
userDao.queryBuilder().where(UserDao.Properties.UWeight.le(keyWord)).list();
// 升序查詢
userDao.queryBuilder().orderAsc(UserDao.Properties.Id).list();
// 倒序查詢
userDao.queryBuilder().orderDesc(UserDao.Properties.Id).list();
- 原生SQL查詢
// 查詢有朋友的用戶信息
String sql = "_id in (select f_uid from friend)";
userDao.queryBuilder().where(new WhereCondition.StringCondition(sql)).list();
- 線程查詢
final Query query = userDao.queryBuilder().build();
new Thread(new Runnable() {
@Override
public void run() {
query.forCurrentThread().list();
}
}).start();
- 一對(duì)一查詢
List<Friend> list = friendDao.queryBuilder().list();
for (Friend friend : list) {
User user = friend.getUser();
}
- 一對(duì)多查詢
List<User> list = userDao.queryBuilder().list();
for (User user : list) {
List<Friend> friends = user.getFriends();
}
greenDao提供了很多方法羡洛,這里只是寫了一些常用方法挂脑。