1. 程式人生 > >greenDao的基本使用及用法詳解

greenDao的基本使用及用法詳解

       轉載請標明出去: http://blog.csdn.net/small_and_smallworld  

關於資料操作相關的庫有不少,之前有寫過用谷歌官方的一些工具類對資料庫進行操作的demo,工程中需要使用greenDao來對資料庫進行操作,因此寫了個簡單的demo,以及自己的一些理解。

前言

        Android中的資料庫使用的是Sqlite,至於這個玩意到底什麼,不需要詳細分析。你只需要知道,這是一種簡單小巧輕量級的資料庫型別,便於對一些簡單的資料進行管理即可。這裡不對谷歌官方操作的相關程式碼進行演示,只對greenDao的使用進行講解。
PS:本筆記演示的greenDao版本為3.2.0

            GreenDao 優點:

1.效能高,號稱Android最快的關係型資料庫
2.記憶體佔用小
3.庫檔案比較小,小於100K
4.支援資料庫加密 greendao支援SQLCipher進行資料庫加密
5.簡潔易用的API

使用步驟:

第一步:在專案的Build.gradle中新增如下配置:

  1. buildscript {  
  2.     repositories {  
  3.         jcenter()  
  4.         mavenCentral()  
  5.     }  
  6.     dependencies {  
  7.         classpath 'com.android.tools.build:gradle:1.5.0'
  8.         classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0'
  9.     }  
  10. }  

第二步:匯入
compile 'org.greenrobot:greendao:3.1.1'
compile 'org.greenrobot:greendao-generator:3.1.0'

第三步:新增配置


  第四步:寫實體類User

@Entity
public class User {

    @Id
    private long id;
    private String name;

    @Generated(hash = 586692638
) public User() { } @Generated(hash = 1144922831) public User(long id, String name) { this.id = id; this.name = name; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

greenDao多使用註解,如果你要將某一實體儲存到資料庫中,需要先對實體進行編寫。
@Entity表明該類是持久化的類【持久化含義,存入資料庫檔案中,作本地化處理】
@Id選擇一個long或Long型別的屬性作為該實體所對應資料庫中資料表的主鍵【型別要是long】
@Generated寫在構造方法前
將以上註解寫好後,點選AS上的Make Project即可

然後可以發現,你的Module中多了個包,點開可以看到如下


                紅色框框內是greenDao自動生成的操作類 接下來就可以對資料庫進行操作了
先上佈局檔案
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_margin="10dp"
        android:text="greenDao lib test"
        android:textColor="@android:color/black" />

    <EditText
        android:id="@+id/etId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入使用者id"
        android:inputType="number"
        android:textSize="15sp" />

    <EditText
        android:id="@+id/etName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入使用者名稱"
        android:textSize="15sp" />

    <Button
        android:id="@+id/btnAdd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="新增" />

    <Button
        android:id="@+id/btnDelete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="刪除" />

    <Button
        android:id="@+id/btnQuery"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查詢" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_margin="10dp"
        android:text="查詢結果"
        android:textColor="@android:color/black" />

    <TextView
        android:id="@+id/tvQuery"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_margin="10dp"
        android:textColor="@android:color/black" />

</LinearLayout>

再來個圖


greenDao_demo

然後是MainActivity

public class MainActivity extends AppCompatActivity {

    UserDao userDao;
    private EditText etId;
    private EditText etName;
    private Button btnAdd;
    private Button btnDelete;
    private Button btnQuery;
    private TextView tvQuery;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        initView();
        initDbHelp();

        /*新增一條資料*/
        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String id = etId.getText().toString();
                String name = etName.getText().toString();
                if (isNotEmpty(id) && isNotEmpty(name)) {
                    QueryBuilder qb = userDao.queryBuilder();
                    ArrayList<User> list = (ArrayList<User>) qb.where(UserDao.Properties.Id.eq(id)).list();
                    if (list.size() > 0) {
                        Toast.makeText(MainActivity.this, "主鍵重複", Toast.LENGTH_SHORT).show();
                    } else {
                        userDao.insert(new User(Long.valueOf(id), name));
                        Toast.makeText(MainActivity.this, "插入資料成功", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    if (isEmpty(id) && isNotEmpty(name)) {
                        Toast.makeText(MainActivity.this, "id為空", Toast.LENGTH_SHORT).show();
                    }
                    if (isEmpty(name) && isNotEmpty(id)) {
                        Toast.makeText(MainActivity.this, "姓名為空", Toast.LENGTH_SHORT).show();
                    }
                    if (isEmpty(id) && isEmpty(name)) {
                        Toast.makeText(MainActivity.this, "請填寫資訊", Toast.LENGTH_SHORT).show();
                    }

                }
                etId.setText("");
                etName.setText("");
            }
        });

        /*刪除指定資料*/
        btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String id = etId.getText().toString();
                if (isNotEmpty(id)) {
                    userDao.deleteByKey(Long.valueOf(id));
                    QueryBuilder qb = userDao.queryBuilder();
                    ArrayList<User> list = (ArrayList<User>) qb.where(UserDao.Properties.Id.eq(id)).list();
                    if (list.size() < 1) {
                        Toast.makeText(MainActivity.this, "刪除資料成功", Toast.LENGTH_SHORT).show();
                        etId.setText("");
                        etName.setText("");
                    }
                } else {
                    Toast.makeText(MainActivity.this, "id為空", Toast.LENGTH_SHORT).show();
                }
            }
        });

        /*查詢資料*/
        btnQuery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String id = etId.getText().toString();
                if (isNotEmpty(id)) {
                    QueryBuilder qb = userDao.queryBuilder();
                    ArrayList<User> list = (ArrayList<User>) qb.where(UserDao.Properties.Id.eq(id)).list();
                    if (list.size() > 0) {
                        String text = "";
                        for (User user : list) {
                            text = text + "\r\n" + user.getName();
                        }
                        tvQuery.setText(text);
                    } else {
                        tvQuery.setText("");
                        Toast.makeText(MainActivity.this, "不存在該資料", Toast.LENGTH_SHORT).show();
                    }
                    etId.setText("");
                    etName.setText("");
                } else {
                    Toast.makeText(MainActivity.this, "id為空", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    /*初始化資料庫相關*/
    private void initDbHelp() {
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "recluse-db", null);
        SQLiteDatabase db = helper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(db);
        DaoSession daoSession = daoMaster.newSession();
        userDao = daoSession.getUserDao();
    }

    private void initView() {
        etId = (EditText) findViewById(R.id.etId);
        etName = (EditText) findViewById(R.id.etName);
        btnAdd = (Button) findViewById(R.id.btnAdd);
        btnDelete = (Button) findViewById(R.id.btnDelete);
        btnQuery = (Button) findViewById(R.id.btnQuery);
        tvQuery = (TextView) findViewById(R.id.tvQuery);
    }

    private boolean isNotEmpty(String s) {
        if (s != null && !s.equals("") || s.length() > 0) {
            return true;
        } else {
            return false;
        }
    }

    private boolean isEmpty(String s) {
        if (isNotEmpty(s)) {
            return false;
        } else {
            return true;
        }
    }

}

以上有一些判斷是否成功的操作,因為greenDao並沒有提供操作後的回撥,所以我這裡就只是手動判斷一下

依次存入1/usher 、2/tom、3/harry 三組資料,然後提取資料庫檔案如下


Demo演示

好了,大功告成!!!


相關推薦

greenDao基本使用用法

       轉載請標明出去: http://blog.csdn.net/small_and_smallworld   關於資料操作相關的庫有不少,之前有寫過用谷歌官方的一些工具類對資料庫進行操作的demo,工程中需要使用greenDao來對資料庫進行操作,因此寫了個

linux cp命令參數用法---linux 復制文件命令cp

linux file linux cp命令參數及用法詳解---linux 復制文件命令cp [root@Linux ~]# cp [-adfilprsu] 來源檔(source) 目的檔(destination)[root@linux

RxJava2.x的整合用法

目錄 主頁 中文資料 Rxjava是什麼 首先要了解什麼是觀察者 Android 開發中一個比較典型的例子是點選監聽器 OnClickListener 。對設定 OnClickListener 來說, View 是被

linux su命令引數用法

linux su 命令 建議大家切換使用者的時候 使用 su - root 這樣,否則可能發現某些命令執行不了 關於su 、su - 及 sudo的區別 請往下看 1.命令作用 su的作用是變更為其它使用者的身份,超級使用者除外,需要鍵入該使用者的

Python迭代器定義用法

可迭代物件 在Python中以直接作用於 for 迴圈的資料型別有以下幾種: 一類是集合資料型別,如 list 、 tuple 、 dict 、 set 、 str 等; 一類是 generator ,包括生成器和帶 yield 的generator function。 這些可以直接作

linux grep命令引數用法---linux管道命令grep

今天為了查詢檔案中某段字元,找了好久,最後成功使用指令: find . -name "*.cpp" |xargs grep -in “get_itemInfo” | grep -v obd_c 找出了自己想要的檔案。(指定cpp結尾的檔案,找出有get_itemInfo字

linux telnet命令引數用法

lnet [-8acdEfFKLrx][-b<主機alias.html' target='_blank'>別名>][-e<脫離字元>][-k<域名>][-l<使用者名稱稱>][-n<記錄檔案>][-S<

Linux如何檢視系統當前登入使用者資訊,linux su命令引數用法(linux切換使用者命令)

作為系統管理員,你可能經常會(在某個時候)需要檢視系統中有哪些使用者正在活動。有些時候,你甚至需要知道他(她)們正在做什麼。本文為我們總結了4種檢視系統使用者資訊(通過編號(ID))的方法。 1. 使用w命令檢視登入使用者正在使用的程序資訊 w命令用於顯示已經登入系統的使用

linux stat命令引數用法

功能說明:顯示inode內容。 語  法:stat [檔案或目錄] 補充說明:stat以文字的格式來顯示inode的內容。 ls 命令及其許多引數提供了一些非常有用的檔案資訊。另一個不太為人所熟知的命令 stat 提供了一些更為有用的資訊。  下面演示瞭如何對可執行檔案“

linux kill命令引數用法--linux終止程序命令

Linux kill 命令使用詳解 功能說明:刪除執行中的程式或工作。 語  法:kill [-s <資訊名稱或編號>][程式] 或 kill [-l <資訊編號>] 補充說明:kill可將指定的資訊送至程式。預設的資訊為SIGTERM(15),可

HTML中作用用法

一、什麼是DTD       DTD(document type definition),文件型別定義。可定義合法的XML文件構建模組,它使用一系列合法的元素來定義文件的結構。通過DTD,每一個xml檔案均可攜帶一個有關其自身格式的描述。 內部的DOCTYPE宣告

[ARM-Linux開發]linux dmesg命令引數用法(linux顯示開機資訊命令)

功能說明:顯示開機資訊。語  法:dmesg [-cn][-s <緩衝區大小>]補充說明:kernel會將開機資訊儲存在ring buffer中。您若是開機時來不及檢視資訊,可利用dmesg來檢視。開機資訊亦儲存在/var/log目錄中,名稱為dmesg的檔案

PACKAGE-INFO.JAVA 作用用法

package-info.java對於經常使用外部包的程式設計師來說應該是熟悉陌生人。因為不是專門開發包的程式設計師很少需要關注它,而又常在其他包中看到他,眼很熟。它到底有哪些特性和作用及如何使用呢?程式設計師講究動口不如動手,何不建立一個試試。開啟Eclipse,new class,哦!建立失敗,‘-’

mkisofs引數用法---linux製作ISO啟動盤命令

最簡單的光碟生成ISO-----------只有-o –v兩個基本引數 [[email protected] home]# ls clamav  guan  guant  iei  simscan  yu [[email protected] home]# mkisofs -o test.

linux mlabel命令引數用法---設定磁碟的標籤

Linux mlabel命令用法詳解命令名稱:mlabel ,使用許可權:所有使用者,使用方式:mlabel [-vcs] drive:[new_label]說明: 本程式可設定磁碟的標籤 (Label)。 如果磁碟上設定過標籤,mlabel 會將他顯示給使用者。如果

Linux set命令引數用法--Linux設定環境變數命令

功能說明:設定shell。 語  法:set [+-abCdefhHklmnpPtuvx] 補充說明:用set 命令可以設定各種shell選項或者列 出shell變數.單個選項設定常用的特性.在某些選項之後-o引數將特殊特性開啟.在某些選項之後使用+o引數將關閉某些特性,不

Java中static作用用法

1.1概述:      static是靜態修飾符,什麼叫靜態修飾符呢?大家都知道,在程式中任何變數或者程式碼都是在編譯時由系統自動分配記憶體來儲存的,而所謂靜態就是指在編譯後所分配的記憶體會一直存在,直到程式退出記憶體才會釋放這個空間,也就是隻要程式在執行,那麼這塊記憶體就

常見<meta>的基本用法

代碼 簡介 clas 元素 word spa wid min mpat <meta charset="utf-8"> 定義與name 屬性相關的信息,使用 utf-8編碼方式編譯字符 <meta http-equiv="X-UA-Compatible" c

DNS基本概念操作----------------轉載

dns介紹 DNS基本概念及操作詳解目錄:1.DNS協議2.DNS查詢 2.1遞歸查詢 2.2跌代查詢 2.3反向查詢3.域維護 3.1全量AXFR傳輸 3.2增量IXFR傳輸 3.3通過NOTIFY 3.4動態更新4.DNS安全 在很多人看來,DNS只是為外部提供DNS解析服務(我以前也是這麽認為

SpringMVC框架基本工作流程

req isp 需要 用戶 數據呈現 工作流 esp servle 組件映射 傳統原生的JSP+Servlet在開發上過程上雖然簡單明了,JSP頁面傳遞數據到Servlet,Servlet整理數據(邏輯開發)或者從數據庫提取數據接著再轉發到JSP頁面上,但是其似乎只能止步於