greendao 框架是一款ORM 數據庫框架,ORM也就是對象關係映射。 相比其他數據庫框架與原生的sql語句相比
好處:1、一個精簡的庫
2、性能最大化
3、內存開銷最小化
4、易於使用的 APIs
5、對 Android 進行高度優化
DaoSession :會話層。操作具體的Dao 對象。提供了基本的持久化方法,比如對實體對 象的insert 、load、update、refresh、還有delete 等等。
XXDao :實際生成的Dao類 通常對應具體的Java類,greendao 爲每 一個實體創建一個Dao,她提供DaoSession更具體的方法,比如count ,loadAll, 和insertInTx(支持批量插入)
步入正題
第一步 ,開始配置 greendao
1. 在工程(project.gradle)的gradle 中 添加 classpath
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
- 在app.gradle 中添加
apply plugin: 'org.greenrobot.greendao'
greendao {
schemaVersion 1 //schema版本
daoPackage 'com.liang.boke.GreenDao.gen' //包名
targetGenDir 'src/main/java' //目錄文件夾
}
compile'org.greenrobot:greendao:3.0.1'
compile'org.greenrobot:greendao-generator:3.0.0'
第二步、寫實體類
新建實體類,裏面包括要數據庫表中的鍵 ,這些greendao 都會在數據庫中幫我們完成
@Entity
public class UserInfo {
@Id(autoincrement = true)
private Long _id ;
private String name ;
private String age ;
private String address ;
}
寫完實體類之後 ctrl + F9 (rebuilder) 這時 greendao 會自動在實體類中幫我們生成 get 和 set 方法
也會在對應的 你自己在 app.gradle 中配置的 greendao{ } 中 對應的包中 生成對應的DaoMaster DaoSession XXXDao
以上就完成了對greendao 的基本配置
接下來要做的就是 對 greendao 進行二次封裝
第三步 新建一個類 DaoManager.java
此類用來對數據庫的創建 創建表 ,更新數據庫
package com.liang.boke.GreenDao.gen.DaoManager;
import android.content.Context;
import com.liang.boke.GreenDao.gen.DaoMaster;
import com.liang.boke.GreenDao.gen.DaoSession;
import com.liang.boke.GreenDao.gen.UserInfo;
import org.greenrobot.greendao.query.QueryBuilder;
/**
* Created by 樑 on 2017/12/7.
*/
public class DaoManager {
private static final String DB_NAME = "Greendao.sqlite";
private static final String TAG = DaoManager.class.getSimpleName();
private static volatile DaoManager daoManager ; //多線程 使用單例模式
private static DaoMaster daoMaster ;
private static DaoSession daoSession ;
private static DaoMaster.DevOpenHelper helper ;
private Context context ;
/*
* 使用單例模式 保證數據庫的安全
* */
public static DaoManager getInstance(){
DaoManager instance = null ;
if(daoManager == null)
{
synchronized (UserInfo.class)
{
if(instance == null)
{
instance = new DaoManager();
}
daoManager = instance ;
}
}
return daoManager ;
}
/*
* 初始化daomanager
* */
public void init(Context context){
this.context = context ;
}
/**
* 判斷是否存在數據庫,如果沒有則創建數據庫
* @return
*/
public DaoMaster getDaoMaster(){
if(daoMaster == null)
{
helper = new DaoMaster.DevOpenHelper(context,DB_NAME,null);
daoMaster =new DaoMaster(helper.getWritableDatabase());
}
return daoMaster ;
}
/**
* 完成對數據庫的添加 修改 查詢 的操作 僅僅是一個接口
* @return
*/
public DaoSession getDaoSession(){
if(daoSession == null)
{
if(daoMaster == null)
{
daoMaster = getDaoMaster() ;
}
daoSession = daoMaster.newSession();
}
return daoSession ;
}
/*
* 是否打印 數據庫的日誌信息 默認不開啓
* */
public void setDebug(Boolean isDebug){
if(isDebug)
{
QueryBuilder.LOG_SQL =true ;
QueryBuilder.LOG_VALUES = true ;
}
else
{
QueryBuilder.LOG_SQL =true ;
QueryBuilder.LOG_VALUES = true ;
}
}
/*
* 關閉 help
* */
public void closeHelper(){
if(helper != null)
{
helper.close();
helper = null ;
}
}
/*
* 關閉 會話
* */
public void closeSession(){
if(daoSession != null)
{
daoSession.clear();
daoSession = null ;
}
}
/*
* 關閉所有的操作 數據庫用完的時候必須關閉 節省資源
*/
public void closeConnection(){
closeHelper();
closeSession();
}
}
第四步、 新建一個DbUtil 類 用來對 數據庫的增刪改查方法進行封裝
package com.liang.boke.GreenDao.gen.Common;
import android.content.Context;
import android.content.Entity;
import com.liang.boke.GreenDao.gen.DaoManager.DaoManager;
import com.liang.boke.GreenDao.gen.DaoSession;
import com.liang.boke.GreenDao.gen.UserInfo;
import com.liang.boke.GreenDao.gen.UserInfoDao;
import org.greenrobot.greendao.query.QueryBuilder;
import java.util.List;
/**
* Created by 樑 on 2017/12/7.
*/
public class DbUtil {
private DaoManager daoManager ;
/*
* 構造方法 初始化daoManager
* */
public DbUtil(Context context) {
daoManager =DaoManager.getInstance();
daoManager.init(context);
}
/*
* 插入一條數據對象
* */
public Boolean insertUser(UserInfo userInfo){
boolean flag = false ;
try{
daoManager.getDaoSession().insert(userInfo);
flag = true ;
}catch (Exception e)
{
e.getStackTrace();
}
return flag ;
}
/*
* 插入多條數據對象
* 可能會存在耗時 操作 所以new 一個線程
* */
public Boolean insertMultUser(final List<UserInfo> userInfos){
boolean flag = false ;
try{
daoManager.getDaoSession().runInTx(new Runnable() {
@Override
public void run() {
for (UserInfo userInfo :userInfos)
{
daoManager.getDaoSession().insert(userInfo);
}
}
});
flag = true ;
}catch (Exception e)
{
e.getStackTrace();
}
return flag ;
}
/*
* 修改一條數據
* 根據id 修改
* */
public boolean upDateUser(UserInfo userInfo){
boolean flag = false ;
try{
daoManager.getDaoSession().update(userInfo);
flag = true ;
}catch (Exception e)
{
e.getStackTrace();
}
return flag ;
}
/*
* 刪除一條數據
* 根據_id 刪除
* */
public boolean deleteUser(UserInfo userInfo){
boolean flag = false ;
try{
daoManager.getDaoSession().delete(userInfo);
flag = true ;
}catch (Exception e)
{
e.getStackTrace();
}
return flag ;
}
/*
* 查詢數據
*
* */
///////返回多條數據
public List<UserInfo> listAll(){
return daoManager.getDaoSession().loadAll(UserInfo.class);
}
///////返回單條數據
/**
* 根據id 返回userinfo 對象
* @param key id
* @return
*/
public UserInfo listAll(long key){
return daoManager.getDaoSession().load(UserInfo.class,key);
}
///////////////強大的querybuilder//////////////
/*
* 可以自己封裝 查詢條件
* 返回 userinfo 對象集合
* */
public List<UserInfo> query(){
QueryBuilder<UserInfo> builder = daoManager.getDaoSession().queryBuilder(UserInfo.class);
List<UserInfo> lists = builder.where(UserInfoDao.Properties._id.ge(001))
// .where() //where 使用的 邏輯與 相當於 數據庫中的 and
// .where()
// .whereOr() //.whereOr() 使用的 邏輯 或 相當於 數據庫中的 or
.list();
return lists ;
}
}
最後就是如何使用這些已經封裝好的數據庫util 了
佈局activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.liang.boke.GreenDao.MainActivity">
<android.support.v7.widget.AppCompatButton
android:layout_marginTop="10dp"
android:id="@+id/btn_insertOne"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="插入一條數據"
/>
<android.support.v7.widget.AppCompatButton
android:layout_marginTop="10dp"
android:id="@+id/btn_insertMulti"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="插入多條數據"
/>
<android.support.v7.widget.AppCompatButton
android:layout_marginTop="10dp"
android:id="@+id/btn_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新一條數據"
/>
<android.support.v7.widget.AppCompatButton
android:layout_marginTop="10dp"
android:id="@+id/btn_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查詢"
/>
</LinearLayout>
在MainActivity 中實現方法
package com.liang.boke.GreenDao;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.AppCompatButton;
import android.view.View;
import com.liang.boke.GreenDao.gen.Common.DbUtil;
import com.liang.boke.GreenDao.gen.UserInfo;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private AppCompatButton mInsertOne;
private AppCompatButton mInsertMulti;
private AppCompatButton mUpdate;
private AppCompatButton mQuery;
private AppCompatButton mDelete;
private DbUtil dbUtil;
private List<UserInfo> userInfos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
initListener();
}
private void initUI() {
mInsertOne = (AppCompatButton) findViewById(R.id.btn_insertOne);
mInsertMulti = (AppCompatButton) findViewById(R.id.btn_insertMulti);
mUpdate = (AppCompatButton) findViewById(R.id.btn_update);
mDelete = (AppCompatButton) findViewById(R.id.btn_delete);
mQuery = (AppCompatButton) findViewById(R.id.btn_query);
dbUtil = new DbUtil(this);
userInfos = new ArrayList<>();
}
private void initListener() {
mInsertOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UserInfo userInfo = new UserInfo();
userInfo.set_id((long) 001);
userInfo.setName("張三");
userInfo.setAge("20");
userInfo.setAddress("淮北市");
dbUtil.insertUser(userInfo);
}
});
mInsertMulti.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 1 ; i <= 10 ; i ++)
{
UserInfo userInfo = new UserInfo();
userInfo.set_id((long)001+i);
userInfo.setName("李四"+ i);
userInfo.setAge("20" + i);
userInfo.setAddress("淮北" + i);
userInfos.add(userInfo) ;
}
dbUtil.insertMultUser(userInfos);
}
});
mUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UserInfo userInfo = new UserInfo() ;
//更改數據 以 _id
userInfo.set_id((long) 001);
userInfo.setName("更新");
userInfo.setAge("100");
userInfo.setAddress("香港");
dbUtil.upDateUser(userInfo) ;
}
});
mDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UserInfo userInfo = new UserInfo() ;
userInfo.set_id((long) 002);
dbUtil.deleteUser(userInfo);
}
});
}
}
插入一條數據
插入多條數據
更新第一條數據
刪除第二條數據
查詢 _id 大於 001 的集合對象 數量
以上是對greendao 數據庫框架的基本使用 有不足的歡迎提出來,源碼已經上傳到 http://download.csdn.net/download/baidu_38477614/10149691
有問題可以直接留言,也可以+Q 1915528523
如需轉載請標明出處,謝謝。。