Android GreenDao3.2.0教程(附Demo)

1.先上測(cè)試界面截圖

image.png

懶得寫布局的話闲勺,可以直接復(fù)制粘貼

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.zzb.greendaodemo.MainActivity">

    <EditText
        android:id="@+id/et_time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請(qǐng)輸入保存時(shí)間"
      />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="時(shí)間格式輸入例如: 2017-10-18 19:30"/>
    <EditText
        android:id="@+id/et_description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請(qǐng)輸入保存內(nèi)容"
        />
    <Button
        android:id="@+id/btn_save"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="保存數(shù)據(jù)"/>

    <EditText
        android:id="@+id/et_query_time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="請(qǐng)輸入查詢時(shí)間"
      />
    <Button
        android:id="@+id/btn_get"
        android:text="獲取當(dāng)前時(shí)間數(shù)據(jù)"
        android:layout_width="match_parent"
        android:layout_height="60dp"/>
    <Button
        android:id="@+id/btn_get_all"
        android:text="獲取所有數(shù)據(jù)"
        android:layout_width="match_parent"
        android:layout_height="60dp"/>

    <TextView
        android:id="@+id/tv_show_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</LinearLayout>

2.實(shí)體類
一個(gè)實(shí)體類绿贞,對(duì)應(yīng)一張表單

@Entity
public class WorkLogBean {
    @Id(autoincrement = true)
    @Unique
    private Long id;      //主鍵自增長(zhǎng)陋守,不可重復(fù),作為不同記錄對(duì)象的標(biāo)識(shí),傳入?yún)?shù)對(duì)象時(shí)不要傳入

    //時(shí)間戳
    @Property(nameInDb = "TIMELONG")
    private Long timeLong;

    //時(shí)間對(duì)應(yīng)格式字符串
    @Property(nameInDb = "TIMESTR")
    private String timeStr;

    //內(nèi)容描述
    @Property(nameInDb = "DESCRIPTION")
    private String description;
}

然后點(diǎn)擊Android Studio


image.png

小錘子淹魄,之后 bean類會(huì)變成這樣

package com.zzb.greendaodemo.db;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Property;
import org.greenrobot.greendao.annotation.Unique;
import org.greenrobot.greendao.annotation.Generated;

/**
* Created by ZZB on 2017/6/28.
*/

@Entity
public class WorkLogBean {
    @Id(autoincrement = true)
    @Unique
    private Long id;      //主鍵自增長(zhǎng)郁惜,不可重復(fù),作為不同記錄對(duì)象的標(biāo)識(shí),傳入?yún)?shù)對(duì)象時(shí)不要傳入

    //時(shí)間戳
    @Property(nameInDb = "TIMELONG")
    private Long timeLong;

    //時(shí)間對(duì)應(yīng)格式字符串
    @Property(nameInDb = "TIMESTR")
    private String timeStr;

    //內(nèi)容描述
    @Property(nameInDb = "DESCRIPTION")
    private String description;

    @Generated(hash = 5215746)
    public WorkLogBean(Long id, Long timeLong, String timeStr, String description) {
        this.id = id;
        this.timeLong = timeLong;
        this.timeStr = timeStr;
        this.description = description;
    }

    @Generated(hash = 1301884914)
    public WorkLogBean() {
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getTimeLong() {
        return this.timeLong;
    }

    public void setTimeLong(Long timeLong) {
        this.timeLong = timeLong;
    }

    public String getTimeStr() {
        return this.timeStr;
    }

    public void setTimeStr(String timeStr) {
        this.timeStr = timeStr;
    }

    public String getDescription() {
        return this.description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
     
    @Override
    public String toString() {
        return "WorkLogBean{" +
                "id=" + id +
                ", timeLong=" + timeLong +
                ", timeStr='" + timeStr + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

以及會(huì)自動(dòng)生成其余類

image.png

DaoMaster甲锡、DaoSession兆蕉、WorkLogBeanDao都是自動(dòng)生成的

現(xiàn)在開始假如我們的需求是這樣的:
①點(diǎn)擊按鈕可以從數(shù)據(jù)庫(kù)中獲取到全部的內(nèi)容
②全部?jī)?nèi)容都展示在listView上羽戒,然后點(diǎn)擊條目的時(shí)候,刪除這個(gè)條目
③一直需要判斷現(xiàn)實(shí)中時(shí)間虎韵,數(shù)據(jù)庫(kù)中是否保存了時(shí)間易稠,保存了時(shí)間,就需要處理一些邏輯包蓝。驶社。

根據(jù)上面的需求,接下來(lái)新建一個(gè)類DbUtils测萎,開始封裝我們的工具類:

image.png
package com.zzb.greendaodemo.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import com.zzb.greendaodemo.BaseApplication;

import org.greenrobot.greendao.query.DeleteQuery;
import org.greenrobot.greendao.query.QueryBuilder;

import java.util.List;

/**
* Created by ZZB on 2017/6/28.
*/

public class DbUtils {
    private static DbUtils dbUtils;
    /**數(shù)據(jù)庫(kù)名稱*/
    private final static String dbName = "worklog.db";
    private DaoMaster.DevOpenHelper openHelper;
    private Context context;

    private DbUtils() {
        context = BaseApplication.mContext;
        openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
    }

    /**
    * 獲取單例
    *
    * @return
    */
    public static DbUtils getInstance() {
        if (dbUtils == null) {
            synchronized (DbUtils.class) {
                if (dbUtils == null) {
                    dbUtils = new DbUtils();
                }
            }
        }
        return dbUtils;
    }

    /**
    * 獲取可讀數(shù)據(jù)庫(kù)
    */
    private SQLiteDatabase getReadableDatabase() {
        if (openHelper == null) {
            openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
        }
        SQLiteDatabase db = openHelper.getReadableDatabase();
        return db;
    }

    /**
    * 獲取可寫數(shù)據(jù)庫(kù)
    */
    private SQLiteDatabase getWritableDatabase() {
        if (openHelper == null) {
            openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
        }
        SQLiteDatabase db = openHelper.getWritableDatabase();
        return db;
    }

    /**
    * 保存或替換
    * @param bean
    */
    public void saveData(WorkLogBean bean) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        WorkLogBeanDao chatListDao = daoSession.getWorkLogBeanDao();
        chatListDao.insertOrReplace(bean);
    }

    /**
    * 通過(guò)時(shí)間查找所有列表亡电,按時(shí)間倒序
    */
    public List<WorkLogBean> queryAllData() {
        try {
            DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
            DaoSession daoSession = daoMaster.newSession();
            WorkLogBeanDao chatListDao = daoSession.getWorkLogBeanDao();
            QueryBuilder<WorkLogBean> qb = chatListDao.queryBuilder();
            qb.orderDesc(WorkLogBeanDao.Properties.TimeLong);
            List<WorkLogBean> chatLists = qb.list();
            return chatLists;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
    * 分頁(yè)查詢,每頁(yè)10條數(shù)據(jù),按時(shí)間降序
    * @param page  查詢的頁(yè)數(shù),從0開始
    * @return
    */
    public List<WorkLogBean> queryPageLists(int page) {
        try {
            DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
            DaoSession daoSession = daoMaster.newSession();
            WorkLogBeanDao chatListDao = daoSession.getWorkLogBeanDao();
            QueryBuilder<WorkLogBean> qb = chatListDao.queryBuilder();
            qb.orderDesc(WorkLogBeanDao.Properties.TimeLong).offset(page * 10).limit(10);;
            List<WorkLogBean> chatLists = qb.list();
            return chatLists;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
    * 獲取此時(shí)間對(duì)應(yīng)的對(duì)象
    * @return
    */
    public List<WorkLogBean> queryDataFromTime(String timeStr) {
        try {
            DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
            DaoSession daoSession = daoMaster.newSession();
            WorkLogBeanDao chatListDao = daoSession.getWorkLogBeanDao();
            QueryBuilder<WorkLogBean> qb = chatListDao.queryBuilder();
            qb.where(WorkLogBeanDao.Properties.TimeStr.eq(timeStr));
            List<WorkLogBean> chatLists = qb.list();
            return chatLists;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
    * 將此時(shí)間的數(shù)據(jù)刪除
    * @param timeStr
    */
    public void deleteDataFromTime(String timeStr) {
        try {
            DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
            DaoSession daoSession = daoMaster.newSession();
            WorkLogBeanDao chatListDao = daoSession.getWorkLogBeanDao();
            QueryBuilder<WorkLogBean> qb = chatListDao.queryBuilder();
            DeleteQuery<WorkLogBean> bd = qb.where(WorkLogBeanDao.Properties.TimeStr.eq(timeStr)).buildDelete();
            bd.executeDeleteWithoutDetachingEntities();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

好了硅瞧,下面可以直接使用了逊抡,在我們的MainActivity中:

package com.zzb.greendaodemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import com.zzb.greendaodemo.db.DbUtils;
import com.zzb.greendaodemo.db.WorkLogBean;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.et_time)
    EditText etTime;
    @BindView(R.id.et_description)
    EditText etDescription;
    @BindView(R.id.et_query_time)
    EditText etQueryTime;
    @BindView(R.id.tv_show_content)
    TextView tvShowContent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick({R.id.btn_save, R.id.btn_get, R.id.btn_get_all})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_save: //保存數(shù)據(jù)
                String time = etTime.getText().toString().trim();
                long timeLong = parseStrToLong(time);
                String description = etDescription.getText().toString().trim();
                WorkLogBean workLogBean = new WorkLogBean();
                workLogBean.setTimeStr(time);
                workLogBean.setTimeLong(timeLong);
                workLogBean.setDescription(description);
                DbUtils.getInstance().saveData(workLogBean);
                break;
            case R.id.btn_get: //查詢指定時(shí)間數(shù)據(jù)
                String quertTime = etQueryTime.getText().toString().toString();
                List<WorkLogBean> datas = DbUtils.getInstance().queryDataFromTime(quertTime);
                tvShowContent.setText(datas == null ? "查詢數(shù)據(jù)為空" : datas.toString());
                break;
            case R.id.btn_get_all: //查詢所有數(shù)據(jù)
                List<WorkLogBean> list = DbUtils.getInstance().queryAllData();
                tvShowContent.setText(list == null ? "查詢數(shù)據(jù)為空" : list.toString() );
                break;
        }
    }

    /**
    * @param timeStr
    * @return
    */
    private long parseStrToLong(String timeStr) {
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            return simpleDateFormat.parse(timeStr).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return -1;
    }

    private String parseLongToStr(Long timeLong) {
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            return simpleDateFormat.format(new Date(timeLong));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

所有的操作已經(jīng)完成了,我們可以直接運(yùn)行看效果了:
點(diǎn)擊保存數(shù)據(jù)之后零酪,又點(diǎn)擊獲取當(dāng)前時(shí)間后的效果

image.png

點(diǎn)擊獲取所有數(shù)據(jù)的效果:

image.png

如果想深入的學(xué)習(xí)、應(yīng)用拇勃,可以看我的另一篇文章四苇,在真實(shí)項(xiàng)目中的實(shí)際應(yīng)用:
http://www.reibang.com/p/b1b2d3333fca
并附上Demo下載鏈接:
https://github.com/xiaozhu1989/greenDaoDemo/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市方咆,隨后出現(xiàn)的幾起案子月腋,更是在濱河造成了極大的恐慌,老刑警劉巖瓣赂,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榆骚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡煌集,警方通過(guò)查閱死者的電腦和手機(jī)妓肢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)苫纤,“玉大人碉钠,你說(shuō)我怎么就攤上這事【砭校” “怎么了喊废?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)栗弟。 經(jīng)常有香客問(wèn)我污筷,道長(zhǎng),這世上最難降的妖魔是什么乍赫? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任瓣蛀,我火速辦了婚禮陆蟆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揪惦。我一直安慰自己遍搞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布器腋。 她就那樣靜靜地躺著溪猿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纫塌。 梳的紋絲不亂的頭發(fā)上诊县,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音措左,去河邊找鬼依痊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怎披,可吹牛的內(nèi)容都是我干的胸嘁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼凉逛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼性宏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起状飞,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤毫胜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后诬辈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酵使,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年焙糟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了口渔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡穿撮,死狀恐怖搓劫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情混巧,我是刑警寧澤枪向,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站咧党,受9級(jí)特大地震影響秘蛔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一深员、第九天 我趴在偏房一處隱蔽的房頂上張望负蠕。 院中可真熱鬧,春花似錦倦畅、人聲如沸遮糖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)欲账。三九已至,卻和暖如春芭概,著一層夾襖步出監(jiān)牢的瞬間赛不,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工罢洲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踢故,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓惹苗,卻偏偏與公主長(zhǎng)得像殿较,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桩蓉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容