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盤加壓縮包好用,簡單方