參考文章:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2017/0703/8144.html
GreenDao
GreenDao
greenDAO 是一款開源的面向 Android 的輕便、快捷的 ORM 框架,將 Java 對象映射到 SQLite 數據庫中,我們操作數據庫的時候,不在需要編寫復雜的 SQL語句, 在性能方面,greenDAO 針對 Android 進行了高度優化, 最小的內存開銷 、依賴體積小 同時還是支持數據庫加密。
集成 GreenDAO
1. 集成插件
在project級build.gradle中的dependencies中添加plugin:
dependencies {
classpath 'com.android.tools.build:gradle:2.3.2'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
在app的build.gradle中apply plugin:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
2. 添加GreenDao依賴
在app的build.gradle的dependencies中添加依賴:
dependencies {
...
compile 'org.greenrobot:greendao:3.2.2' // add library
...
}
3. 配置數據庫信息
在app的build.gradle中添加以下greendao部分:
android{
...
}
//需要添加的
greendao {
schemaVersion 1 //數據庫版本號
daoPackage 'com.ncd.greendaotest.db'// 設置DaoMaster、DaoSession、Dao 包名
targetGenDir 'src/main/java'//設置DaoMaster、DaoSession、Dao目錄
}
dependencies{
...
}
最后同步完成配置。
測試例子GreenDaoTest
1. 編寫實體類 User.java
@Entity
public class User {
@NotNull
private String name;
//id 字段必須是Long類型,默認自增
@Id
private Long id;
public User() {
}
@Generated(hash = 969448858)
public User(@NotNull String name, Long id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
}
其中注解
@Id 就是將該字段作為數據庫表的主鍵,默認自增,注意:此字段只能是Long類型,不能是long類型,更不能是其他類型。
@Entity是實體注解
具體信息請查看 GreenDao 3.X之注解
2. 生成 DaoMaster,DaoSession 和 UserDao 類
點擊make project,如果之前配置無誤,就會在之前配置的“daoPackage 'com.ncd.greendaotest.db”目錄下生成這三個類。
db.png
3. 初始化
一般將初始化寫在Application中
public class MyApplication extends Application {
private DaoSession daoSession;
private static MyApplication myApplication;
@Override
public void onCreate() {
super.onCreate();
initGreenDao();
myApplication = this;
}
/**
* 初始化 GreenDao
*/
private void initGreenDao() {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "test.db");
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster master = new DaoMaster(db);
daoSession = master.newSession();
}
public DaoSession getDaoSession() {
return daoSession;
}
public static MyApplication getApplication() {
return myApplication;
}
}
4. 使用
為了方便,編寫了此實體的工具類(方法沒有全部實現,有的方法沒測試,可能存在錯誤)
public class UserUtils {
private static final String TAG = UserUtils.class.getSimpleName();
private static UserUtils instance;
private DaoSession daoSession;
private UserDao userDao;
private UserUtils() {
initDao();
}
public static UserUtils getInstance() {
if (null == instance) {
synchronized (UserUtils.class) {
if (null == instance) {
instance = new UserUtils();
}
}
}
return instance;
}
//獲取DAO
private void initDao() {
if (null == daoSession) {
daoSession = MyApplication.getApplication().getDaoSession();
}
if (null == userDao) {
userDao = daoSession.getUserDao();
}
}
//插入 若數據庫中存在此id,則會報錯
public void insert(User user) {
if (null != userDao && null != user) {
userDao.insert(user);
} else {
return;
}
}
//插入 若數據庫中存在此id,則會更新數據
public void insertOrReplace(User user) {
if (null != userDao && null != user) {
userDao.insertOrReplace(user);
} else {
return;
}
}
//刪除
public void delete(User user) {
if (null != userDao && null != user) {
userDao.delete(user);
} else {
return;
}
}
//根據id刪除
public void deleteByUserId(String id) {
if (null != userDao && !TextUtils.isEmpty(id)) {
userDao.deleteByKey(Long.valueOf(id));
} else {
return;
}
}
//更新
public void update(User user) {
if (null != userDao && null != user) {
userDao.update(user);
} else {
return;
}
}
//查詢所有
public List<User> query() {
if (null != userDao) {
return userDao.loadAll();
} else {
return null;
}
}
//根據id查詢
public User queryById(String id) {
if (null != userDao && !TextUtils.isEmpty(id)) {
return userDao.loadByRowId(Long.valueOf(id));
} else {
return null;
}
}
//根據條件查詢
public List<User> queryByArgs(String selection, String selectionArg) {
if (null != userDao && !TextUtils.isEmpty(selection)) {
return userDao.queryRaw(selection, selectionArg);
} else {
return null;
}
}
效果圖.png
Sample Code:
https://github.com/VersaceSilva/AndroidReview/tree/master/GreenDaoTest