1. 程式人生 > >greendao3.0以上使用步驟(一):基礎使用

greendao3.0以上使用步驟(一):基礎使用

本文介紹了greendao的基礎入門使用:其中包括資料庫的增刪改查,基本使用功能,簡單方便,易懂。
優勢:

1:效能最大化

2:記憶體開銷最小

3:API 簡單好用

4:對Android 高度優化

5:2.2版本以上還支援加密資料庫

6:支援protobuf協議儲存(protobuf 比json更快,google的優秀產品,因此greendao能很好地與retrofit 2.0結合protobuf網路請求並快取)


  由於現在手中的專案需要用到資料庫來儲存資料,聽說greendao現在很流行,於是就想學習一下,在網上找了很多,
  但是水平有限,好多大神寫的看不懂啊!不知道啥意思,於是就找呀找,最後,找到一篇翻譯外文的簡書,哇哦,終於學會了,不過下班了,
  現在忘記是誰寫的了,無法新增你的資訊了,不過還是要謝謝你的譯文哦!
那麼我就來總結一下,小白使用greendao的步驟吧!哈哈
歡迎大家給出建議、更好的方法和知識哦,謝謝啦!

 那好直接來吧!

先看效果
這裡寫圖片描述

步驟一、在自己的build.gradle中加入這些配置

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
    }
}
apply plugin: 'org.greenrobot.greendao'

greendao {
    //資料庫的schema版本,也可以理解為資料庫版本號
    schemaVersion 1
    //設定DaoMaster、DaoSession、Dao包名,也就是要放置這些類的包的全路徑。
    daoPackage 'cn.hnshangyu.testgreendao.greendao'
    //設定DaoMaster、DaoSession、Dao目錄
    targetGenDir 'src/main/java'
}
dependencies {
    compile 'org.greenrobot:greendao:3.2.0'
}

針對於daoPackage 我的專案內容如下
這裡寫圖片描述

步驟二、建立Student實體類

package cn.hnshangyu.testgreendao.bean;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Keep;

@Entity(generateConstructors = false)
    public class Student {  
        @Id
        private Long id;  
        private String name;
        private int age;  

        public Student() {  
        }  

        @Keep
        public Student(String name, int age) {  
            this.name = name;  
            this.age = age;  
        }  


        public Student(Long id, String name, int age) {  
            this.id = id;  
            this.name = name;  
            this.age = age;  
        }  

        @Keep  
        public Long getId() {  
            return id;  
        }  

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

        @Keep  
        public String getName() {  
            return name;  
        }  

        @Keep  
        public void setName(String name) {  
            this.name = name;  
        }  

        @Keep  
        public int getAge() {  
            return age;  
        }  

        @Keep  
        public void setAge(int age) {  
            this.age = age;  
        }  

        @Keep  
        @Override  
        public boolean equals(Object o) {  
            if (this == o) return true;  
            if (!(o instanceof Student)) return false;  

            Student student = (Student) o;  

            return name.equals(student.name);  

        }  

        @Keep  
        @Override  
        public int hashCode() {  
            return (int) (id ^ (id >>> 32));  
        }  

        @Keep  
        @Override  
        public String toString() {  
            return "Student{" +  
                    "id=" + id +  
                    ", name='" + name + '\'' +  
                    ", age=" + age +  
                    '}';  
        }  
    }  

步驟三、修復一下工程,自動生成greendao包下的類(就是點選一下小錘子),你會自動生成上圖中greendao包中的類。

步驟四、開始使用,建立管理類

package cn.hnshangyu.testgreendao.db;

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

import cn.hnshangyu.testgreendao.greendao.DaoMaster;
import cn.hnshangyu.testgreendao.greendao.DaoSession;

public class DbManager {

    // 是否加密
    public static final boolean ENCRYPTED = true;

    private static final String DB_NAME = "test.db";
    private static DbManager mDbManager;
    private static DaoMaster.DevOpenHelper mDevOpenHelper;
    private static DaoMaster mDaoMaster;
    private static DaoSession mDaoSession;

    private Context mContext;

    private DbManager(Context context) {
        this.mContext = context;
        // 初始化資料庫資訊
        mDevOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
        getDaoMaster(context);
        getDaoSession(context);
    }

    public static DbManager getInstance(Context context) {
        if (null == mDbManager) {
            synchronized (DbManager.class) {
                if (null == mDbManager) {
                    mDbManager = new DbManager(context);
                }
            }
        }
        return mDbManager;
    }

    /**
     * 獲取可讀資料庫
     *
     * @param context
     * @return
     */
    public static SQLiteDatabase getReadableDatabase(Context context) {
        if (null == mDevOpenHelper) {
            getInstance(context);
        }
        return mDevOpenHelper.getReadableDatabase();
    }

    /**
     * 獲取可寫資料庫
     *
     * @param context
     * @return
     */
    public static SQLiteDatabase getWritableDatabase(Context context) {
        if (null == mDevOpenHelper) {
            getInstance(context);
        }

        return mDevOpenHelper.getWritableDatabase();
    }

    /**
     * 獲取DaoMaster
     *
     * @param context
     * @return
     */
    public static DaoMaster getDaoMaster(Context context) {
        if (null == mDaoMaster) {
            synchronized (DbManager.class) {
                if (null == mDaoMaster) {
                    mDaoMaster = new DaoMaster(getWritableDatabase(context));
                }
            }
        }
        return mDaoMaster;
    }

    /**
     * 獲取DaoSession
     *
     * @param context
     * @return
     */
    public static DaoSession getDaoSession(Context context) {
        if (null == mDaoSession) {
            synchronized (DbManager.class) {
                mDaoSession = getDaoMaster(context).newSession();
            }
        }

        return mDaoSession;
    }
}

步驟五、增刪改查,

package cn.hnshangyu.testgreendao.db;

import android.content.Context;

import org.greenrobot.greendao.query.QueryBuilder;

import java.util.List;

import cn.hnshangyu.testgreendao.bean.Student;

public class StudentDaoOpe {

    /**
     * 新增資料至資料庫
     *
     * @param context
     * @param stu
     */
    public static void insertData(Context context, Student stu) {

        DbManager.getDaoSession(context).getStudentDao().insert(stu);
    }


    /**
     * 將資料實體通過事務新增至資料庫
     *
     * @param context
     * @param list
     */
    public static void insertData(Context context, List<Student> list) {
        if (null == list || list.size() <= 0) {
            return;
        }
        DbManager.getDaoSession(context).getStudentDao().insertInTx(list);
    }

    /**
     * 新增資料至資料庫,如果存在,將原來的資料覆蓋
     * 內部程式碼判斷了如果存在就update(entity);不存在就insert(entity);
     *
     * @param context
     * @param student
     */
    public static void saveData(Context context, Student student) {
        DbManager.getDaoSession(context).getStudentDao().save(student);
    }

    /**
     * 刪除資料至資料庫
     *
     * @param context
     * @param student 刪除具體內容
     */
    public static void deleteData(Context context, Student student) {
        DbManager.getDaoSession(context).getStudentDao().delete(student);
    }

    /**
     * 根據id刪除資料至資料庫
     *
     * @param context
     * @param id      刪除具體內容
     */
    public static void deleteByKeyData(Context context, long id) {
        DbManager.getDaoSession(context).getStudentDao().deleteByKey(id);
    }

    /**
     * 刪除全部資料
     *
     * @param context
     */
    public static void deleteAllData(Context context) {
        DbManager.getDaoSession(context).getStudentDao().deleteAll();
    }

    /**
     * 更新資料庫
     *
     * @param context
     * @param student
     */
    public static void updateData(Context context, Student student) {
        DbManager.getDaoSession(context).getStudentDao().update(student);
    }

    /**
     * 查詢所有資料
     *
     * @param context
     * @return
     */
    public static List<Student> queryAll(Context context) {
        QueryBuilder<Student> builder = DbManager.getDaoSession(context).getStudentDao().queryBuilder();

        return builder.build().list();
    }

/**
     * 根據id,其他的欄位類似
     *
     * @param context
     * @param id
     * @return
     */
    public static List<Student> queryForId(Context context, long id) {
        QueryBuilder<Student> builder = DbManager.getDaoSession(context).getStudentDao().queryBuilder();
        /**
         * 返回當前id的資料集合,當然where(這裡面可以有多組,做為條件);
         * 這裡build.list();與where(StudentDao.Properties.Id.eq(id)).list()結果是一樣的;
         * 在QueryBuilder類中list()方法return build().list();
         *
         */
        // Query<Student> build = builder.where(StudentDao.Properties.Id.eq(id)).build();
        // List<Student> list = build.list();
        return builder.where(StudentDao.Properties.Id.eq(id)).list();
    }
}

步驟六、mainactivity佈局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="cn.hnshangyu.testgreendao.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/add"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="增" />

        <Button
            android:id="@+id/delete"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="刪" />

        <Button
            android:id="@+id/updata"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="改" />

        <Button
            android:id="@+id/check"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="查" />


    </LinearLayout>

    <Button
        android:id="@+id/deleteAll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_weight="1"
        android:text="刪除全部" />

    <Button
        android:id="@+id/check_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/deleteAll"
        android:layout_centerInParent="true"
        android:text="根據id查" />

</RelativeLayout>

步驟七、mainActivity

package cn.hnshangyu.testgreendao;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;
import java.util.List;

import butterknife.ButterKnife;
import butterknife.InjectView;
import cn.hnshangyu.testgreendao.bean.Student;
import cn.hnshangyu.testgreendao.db.StudentDaoOpe;

public class MainActivity extends AppCompatActivity {

    @InjectView(R.id.add)
    Button add;
    @InjectView(R.id.delete)
    Button delete;
    @InjectView(R.id.updata)
    Button updata;
    @InjectView(R.id.check)
    Button check;
    @InjectView(R.id.deleteAll)
    Button deleteAll;
    @InjectView(R.id.check_id)
    Button checkId;

    private Context mContext;
    private Student student;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);
        mContext = this;
        initData();
        initListener();

    }

    private List<Student> studentList = new ArrayList<>();

    /**
     * 初始化資料
     */
    private void initData() {
        for (int i = 0; i < 100; i++) {
            student = new Student((long) i, "huang" + i, 25);
            studentList.add(student);
        }

    }

    private void initListener() {
        /**
         *增
         */
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                StudentDaoOpe.insertData(mContext, studentList);
            }
        });
        /**
         * 刪
         */
        delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Student student = new Student((long) 5, "haung" + 5, 25);
                /**
                 * 根據特定的物件刪除
                 */
                StudentDaoOpe.deleteData(mContext, student);
                /**
                 * 根據主鍵刪除
                 */
                StudentDaoOpe.deleteByKeyData(mContext, 7);
            }
        });
        /**
         *刪除所有
         */
        deleteAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                StudentDaoOpe.deleteAllData(mContext);
            }
        });
        /**
         * 更新
         */
        updata.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Student student = new Student((long) 2, "haungxiaoguo", 16516);
                StudentDaoOpe.updateData(mContext, student);
            }
        });
        /**
         * 查詢全部
         */
        check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<Student> students = StudentDaoOpe.queryAll(mContext);
                for (int i = 0; i < students.size(); i++) {
                    Log.i("Log", students.get(i).getName());
                }
            }
        });
        /**
         * 根據id查詢
         */
        checkId.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<Student> students = StudentDaoOpe.queryForId(mContext, 50);
                for (int i = 0; i < students.size(); i++) {
                    Log.i("Log", students.get(i).getName());
                }
            }
        });
    }
}

下面就是效果了

點選“增”->“查”出現
這裡寫圖片描述

點選“刪”->“查”出現

這裡寫圖片描述

huang5與huang7被刪除了

點選“改”->“查”出現
這裡寫圖片描述

huang2被修改成huangxiaoguo了

點選“根據ID查”
這裡寫圖片描述

查詢結果只有huang50

greendao中的註解

(一) @Entity 定義實體
@nameInDb 在資料庫中的名字,如不寫則為實體中類名
@indexes 索引
@createInDb 是否建立表,預設為true,false時不建立
@schema 指定架構名稱為實體
@active 無論是更新生成都重新整理
(二) @Id
(三) @NotNull 不為null
(四) @Unique 唯一約束
(五) @ToMany 一對多
(六) @OrderBy 排序
(七) @ToOne 一對一
(八) @Transient 不儲存在資料庫中
(九) @generated 由greendao產生的建構函式或方法

這樣以後用著就方便了,哈哈哈~~~

Greendao的模糊查詢需要對傳人的值前後加”%”,如:”%”+value+”%”;

Greendao模糊查詢like方法的使用:like(“%你想匹配的%”);

1、例如:

QueryBuilder<Shops> qb = words_Dao.queryBuilder();
qb.where(Properties.Shops_id.like("%"+"你需要搜的"+"%"));

2、分頁載入:

   /**
     * 查詢所有資料
     *  分頁載入
     * @param context
     * @param pageSize 當前第幾頁
     * @param pageNum  每頁顯示多少個
     * @return
     */
    public static List<BaseRecordStation> queryAll(Context context, int pageSize, int pageNum) {
        QueryBuilder<BaseRecordStation> builder = DbManager.getDaoSession(context, DB_NAME).getBaseRecordStationDao().queryBuilder();
        List<BaseRecordStation> list = builder
                .offset(pageSize - 1)//從0開始的
                .limit(pageNum)
                .orderDesc(BaseRecordStationDao.Properties.Id)
                .build()
                .list();
        return list;
    }

相關推薦

greendao3.0以上使用步驟基礎使用

本文介紹了greendao的基礎入門使用:其中包括資料庫的增刪改查,基本使用功能,簡單方便,易懂。 優勢: 1:效能最大化 2:記憶體開銷最小 3:API 簡單好用 4:對Android 高度優化 5:2.2版本以上還支援加密資料庫 6:

我對hyperledger fabric1.1.0的執著基本環境整理

我用的作業系統為:centos7.4,語言準備用java開發。 整理包括:linux核心升級(若升級失敗,可參考https://blog.csdn.net/tianshuhao521/article/details/84021064),jdk安裝,docker(docker ce,docker-

推送系統從0到1是系統不是工具

文章將針對推送系統展開分析,本篇文章為系列文章的一個開端,希望能夠給你帶來一些啟發參考。 閱讀本系列文章,你會獲得的收穫: 如果你是運營人員,你可以在文中瞭解推送所蘊含大量運營策略; 如果你是產品經理,只是用推送完成訊息的傳遞,你可以在文中瞭解到推送可以實現更大

Spring Boot 2.0 新特性配置繫結 2.0 全解析

在Spring Boot 2.0中推出了Relaxed Binding 2.0,對原有的屬性繫結功能做了非常多的改進以幫助我們更容易的在Spring應用中載入和讀取配置資訊。下面本文就來說說Spring Boot 2.0中對配置的改進。 配置檔案繫結 簡單型別 在S

SpringBoot2.0填坑使用CROS解決跨域並解決swagger 訪問不了問題

簡介 公司後臺是採用SpringBoot2.0 搭建的微服務架構,前端框架用的是vue 使用前後端分離的開發方式,在開發聯調的時候需要進行跨域訪問,那麼使用CROS解決了跨域問題,但是swagger 卻用不了 具體解決方案請繼續往下看… CROS跨域原理 跨域資源共享(CORS)

VUE2.0學習筆記VUE-CLI 腳手架

個人理解:搭建vue-cli vue腳手架的作用是,寫的專案可以通過webpack 快速打包,加密程式碼,避免原始碼洩露。腳手架的搭建步驟(摘錄自技術胖部落格:點選開啟技術胖部落格):1、前提:安裝了npm(在終端可以用npm -V檢查版本)2、開啟終端,在當前資料夾下執行命

odoo8.0開發筆記Notepad ++的自動縮排引發python的問題

OpenERP7.0開發筆記系列 問題描述:使用Notepad++編輯python程式時,會發生莫名其妙的問題,程式碼明明都一模一樣,為什麼就是得不到正確結構呢? 原因其實是因為:python對縮排很敏感,一般建議用空格來完成縮排,但是,而Notep

iOS下OpenGL ES 3.0程式設計入門構建Hello World環境

OpenGL ES簡介:      OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三維圖形 API 的子集,針對手機、PDA和遊戲主機等嵌入式裝置而設計。該API由Khronos集團定義推廣,Khronos是一個圖形軟硬體

CS231n基礎知識

深度學習 highlight 自己 元組 .py [0 upper bsp python 給自己新挖個坑:開始刷cs231n深度學習。 看了一下導言的pdf,差缺補漏。 s = "hello" print s.capitalize() # 首字母大寫; prints "

HLSL學習筆記基礎

pad ddx 做了 cto har 分割 with 圖形 content http://www.cnblogs.com/rainstorm/archive/2013/05/04/3057444.html 前言 五一在家無事,於是學習了一下HLSL,基於XAN4.0的。學習

JS筆記基礎知識

bsp man function child 變量 file 使用 IE 單獨 (一) 標識符 標識符就是一個名字,在JS中,標識符用來對變量和函數命名,或者用做JS代碼中某些循環語句中的跳轉位置的標記。JS的標識符必須以字母、_或$符號開始,後續字符可以是字母、數字、_

計算機視覺基礎

一、光和電磁波譜 二、彩色模型 1.RGB彩色模型 2.HSV彩色模型 3.從RGB到HSV的彩色轉換 4.從HSV到RGB的彩色轉換

Spring AOP學習筆記基礎概念

AOP產生背景 AOP(Aspect Oriented Programming),即面向切面程式設計,可以說是OOP(Object Oriented Programming,面向物件程式設計)的補充和完善。OOP引入封裝、繼承、多型等概念來建立一種物件層次結構,用於模擬公共行為的一個集合。不

Elasticsearch 教程 基礎入門

Q:有哪些東西你以為很貴其實很便宜。A:大學剛畢業的我 簡介 Elasticsearch是一個高度可擴充套件的、開源的、基於 Lucene 的全文搜尋和分析引擎。它允許您快速,近實時地儲存,搜尋和分析大量資料,並支援多租戶。 Elasticsearch也使用Java開發並使用 Lucene

ELK實踐基礎入門

雖然用了ELK很久了,但一直苦於沒有自己嘗試搭建過,所以想抽時間嘗試嘗試。原本打算按照教程 《ELK集中式日誌平臺之二 — 部署》(作者:樊浩柏科學院) 進行測試的,沒想到一路出了很多坑,所以又按照自己成功搭建的流程寫了本文。 《ELK集中式日誌平臺之二 — 部署》一文參考價值非常大,圖文並茂,大家可以在學

c++演算法模板基礎演算法模板

1.高精演算法: 加法: while(i<=a加數的位數|| i<=b加數的位數) { c[i]=a[i]+b[i]+x; x=c[i]/10; c[i]%=10; i++; } 注意:加法需要逆序儲存,因為如

【caffe】在windows平臺中安裝caffe基礎安裝及簡單測試

基礎配置 本文中的配置:win10 + vs2015 + python2.5 + cmake3.12 + git2.15 + CUDA8.0 + cuDNN-8.0-5 在進行windows下的caffe安裝前,一定要把以上的這些軟體安裝好,並加入系統路徑中。

張量分解基礎知識

[原地址]https://blog.csdn.net/Flying_sfeng/article/details/80817904 前段時間在組裡分享了張量分解相關的知識,現在想把它整理成一個系列,供有需要的同學閱讀。 下文根據Tensor Decomposition

MongoDB入門系列基礎概念和安裝

概述   MongoDB是目前非常流行的一種非關係型資料庫,作為入門系列的第一篇本篇文章主要介紹Mongdb的基礎概念知識包括命名規則、資料型別、功能以及安裝等。 環境: OS:Windows Version:3.4 一、安裝 1.下載解壓 在官網下載對應作業系統版本的安裝包,然後解壓;

GitHub學習基礎操作

    在學習Python一段時間後,發現越來越多的程式程式碼都儲存在一個叫Github的網站裡面,好奇心驅使下去看了下這個東西,聽完介紹,感覺是個很好用的東西,大概的看了下廖雪峰老師的教程,然後就沒有管了,在我的思想裡面,檔案備份還是U盤加壓縮包好用,簡單方