1. 程式人生 > >Android ORM——greenDAO 3之Properties、QueryBuilder與資料庫的增刪改查的基本語法應用(二)

Android ORM——greenDAO 3之Properties、QueryBuilder與資料庫的增刪改查的基本語法應用(二)

引言

Android ORM——初識greenDAO 3及使用greenDAO 3前應該掌握的一些知識點介紹了greenDAO的配置步驟和一些重要的知識點,以及重要的角色的功能和聯絡,這一篇就正式開始結合點原始碼從應用greenDAO方面總結。在使用greenDAO之前,我們得明確一點greenDAO是ORM框架,簡單來說就是把資料庫實體表對映成為對應的JavaBean,操作JavaBean即是操作資料表,完完全全的面向物件思想。

一、Property和Properties、Query和QueryBuilder

1、Property和Properties

Property原始碼中是這樣子介紹的:對映到資料庫列的屬性的元資料,用於建立查詢構建器使用的WhereCondition 物件

(Meta data describing a property mapped to a database column; used to create WhereCondition object used by the query builder),簡單理解它就是資料列在以JavaBean的形式展現,除此之外還有一個重要的功能就是構造Where條件子句(封裝了很多條件子句),一切皆基於物件嘛,而Properties則可以看成是一個數據表的結構,一個Properties對應資料表的列。

Property的部分方法名 說明
WhereCondition eq(Object value)
相當於在Where字句後加上 “=” value
WhereCondition notEq(Object value) 在Where字句後加上 “!=” value
WhereCondition like(String value) 在Where字句後加上 “like” value模糊查詢
WhereCondition between(Object a, Object b) 在Where字句後加上 “between a and b” value

2、Query<T>和QueryBuilder<T>

總所周知查詢是為了得到符合特定條件的實體資料,而在greenDAO中我們有兩種查詢方式:通過Query使用原始SQL來制定查詢

不編寫原始SQL語句而是呼叫QueryBuilder封裝的對應API優先考慮,原因就是因為QueryBuilder 已經封裝了對應的介面方法去生成不同型別的SQL語句,使用的時候可以通過QueryBuilder 建立自定義查詢Without SQL。),簡單來說greeDAO就是把原始的SQL的分為很多部分,而且分別封裝成了對應的API方法,比如:GreenDAOApplication.getDaoSessionins().getUserDao().queryBuilder(),作用就相當於Select * from table,是主句,其他的條件子句、排序、去重等子句的構造(包括執行資料的增刪改查),都是封裝到了對應的方法,呼叫了之後自動新增到主句之後,最終形成完整的一條SQL語句完成資料操作

QueryBuilder部分方法名 說明
protected QueryBuilder(AbstractDao<T,?> dao) 構造方法是保護的,不能通過其構造方法獲取物件
QueryBuilder<T> distinct() 去重查詢,相當於是在SQL語句中加了distinct
QueryBuilder<T> where(WhereCondition cond, WhereCondition… condMore) 條件子句,相當於SQL中的Where
QueryBuilder<T> whereOr(WhereCondition cond1, WhereCondition cond2, WhereCondition… condMore) 或條件查詢
WhereCondition and(WhereCondition cond1, WhereCondition cond2, WhereCondition… condMore) 且條件
QueryBuilder<T> orderAsc(Property… properties) Order 子句
QueryBuilder<T> limit(int limit) 分頁查詢
DeleteQuery<T> buildDelete() 刪除
List<T> list() 執行Query並把返回集合,並且entity都會載入到記憶體中,返回的結果通常就是ArrayList
LazyList listLazy() Entity按需載入到記憶體中,在第一次訪問list中的element時,它就會唄載入並且快取。
LazyList listLazyUncached() 每次訪問結果集的時候都是從資料庫中載入,而不使用快取。
LazyList listIterator() 通過迭代器訪問結果集,並且採用的時lazy-loading,結果不會快取。
T unique() 返回唯一的資料

儘管QueryBuilder已經很強大,但是假如還是不能滿足你的需求,greeDAO還支援原始的SQL語句,主要有兩種方式:

  • QueryBuilder,WhereConditon,StringCondition結合
//巢狀子查詢,userDao.queryBuilder() 這句執行了之後就相當於是Select * from User
Query query = userDao.queryBuilder().where(
new StringCondition("_ID IN " +
"(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)").build();
  • 採用queryRaw或者queryRawCreate方法傳入一個原始的SQL,它將被追加到SELECT和columns之後。這樣,就可以使用Where和Order by來選擇entities,此外表還可以使用別名“T”。
Query<User> query = userDao.queryRawCreate(
  ", GROUP G WHERE G.NAME=? AND T.GROUP_ID=G._ID", "admin"
);
Query方法名 說明
Query setParameter(int index, Object parameter) 設定引數
List<T> list() 執行Query並把返回集合,並且entity都會載入到記憶體中,返回的結果通常就是ArrayList
LazyList listLazy() Entity按需載入到記憶體中,在第一次訪問list中的element時,它就會唄載入並且快取。
LazyList listLazyUncached() 每次訪問結果集的時候都是從資料庫中載入,而不使用快取。
LazyList listIterator() 通過迭代器訪問結果集,並且採用的時lazy-loading,結果不會快取。
T unique() greenDao支援唯一結果(0 or 1個結果)和結果集。會返回唯一結果或者null
T uniqueOrThrow() 會返回唯一結果,不會返回null

另外listLazy,listLazyUncached,listIterator都採用greenDao的LazyList類,在真正使用資料的時候才載入(on-demand),還持有一個database cursor引用。(這就是為什麼需要呼叫close方法關閉lazy lists和iterators(通常在try/finally塊裡面))。當所有的element被訪問了之後,listLazy()和listIterator()自動關閉cursor,但如果list提前處理完成,就必須去呼叫close()。
Query<T>和QueryBuilder<T>都是可以用於構造SQL並且執行SQL,不同的是QueryBuilder還支援條件、排序子句的構造,而Query既可以完全不依賴QueryBuilder,全部用原始SQL來代替,也可以主句(即Select * from table 這段用QueryBuilder)後面的子句用原始的SQL來執行,兩者都支援查詢並返回集合。

二、在Application中初始化greenDAO並完成資料庫的建立

public class GreenDAOApplication extends Application {
    private final static String DBNAME="REBOT_DB" ;
    public static DaoSession daoSession=null;

    @Override
    public void onCreate() {
        super.onCreate();
        initGreenDAO(this);
    }

    /**
     * 初始化並建立資料庫及其結構
     */
    private void initGreenDAO(Context context){
        DaoMaster.DevOpenHelper openHelper=new DaoMaster.DevOpenHelper(context,DBNAME);
        Database database=openHelper.getWritableDb();
        DaoMaster daoMaster=new DaoMaster(database);
        daoSession=daoMaster.newSession();
    }

    public static DaoSession getDaoSessionins(){
        return daoSession;
    }
}

三、增insert(T t)

前面所講一個Entity例項對應資料表的一行資料,所以插入新增的資料的時候,我們只需要把例項化後的Entity物件傳遞insert系方法,再通過AbstractDao的子類物件呼叫即可,其中insert是插入一個,insertInTx是插入多個(“Tx”表示用一個事務去控制整個過程(提高效率))。
insertOrReplace是插入或替換。

/*插入一條記錄*/
User user=new User(1,name,"/sdcard/avtar/"+(name+1)+".png");//greenDAO的主鍵是Long型,如果傳入null,則GreenDao會預設設定自增長的值
try{
    GreenDAOApplication.getDaoSessionins().getUserDao().insert(user);
}catch(Exception e){}

四、刪

1、deleteBykey(Long id):根據主鍵刪除對應的一條記錄

try{
    GreenDAOApplication.getDaoSessionins().getUserDao().deleteByKey(id);
}catch(Exception e){}

2、 根據實體類刪除一條記錄

根據實體類刪除一條記錄這個有多種方式:直接呼叫delete(Entity entity)先查詢再通過QueryBuilder

User user = new User((long)1, "crazymo","",false);
try{
    GreenDAOApplication.getDaoSessionins().getUserDao().delete(user);
}catch(Exception e){}
 List<User> list = getUserList();
 GreenDAOApplication.getDaoSessionins().getUserDao().deleteInTx(list);

3、批量刪除,需要建立一個QueryBuilder然後呼叫他的buildDelete方法,然後執行DeleteQuery。開發中採用一般結合查詢方法,先查詢出一條記錄之後再刪除對應的一行資料

public void deleteUserInfo(int userId){
     QueryBuilder<User> qb = GreenDAOApplication.getDaoSessionins().getUserDao().queryBuilder();
     DeleteQuery<User> bd = qb.where(Properties._id.eq(userId)).buildDelete();
     bd.executeDeleteWithoutDetachingEntities();
}

3、deleteAll(): 清空

try{
    GreenDAOApplication.getDaoSessionins().getUserDao().deleteAll();
}catch(Exception e){}

五、改update(T t)

例如update USER SET age =20 WHERE name = “CrazyMo_” 這樣一個語句在greenDao中怎麼執行的,始終記住一句話,greenDao 對物件的增,刪,改,查 就是對資料庫的增,刪,改,查,被查詢出的物件被修改後,在替換原來自己的物件就可以了

User user=new User(1,name,"/sdcard/avtar/"+(name+1)+".png");
try{
    GreenDAOApplication.getDaoSessionins().getUserDao().update(user);
}catch(Exception e){}
String updateName = content.getText().toString().trim();
QueryBuilder qb2 = userDao.queryBuilder();
qb2.where(Properties.Name.eq("CrazyMo_"));
List<User> update = qb2.list();
String newName = content.getText().toString().trim();
for (User user : update) {
     user.setAge(20);
     userDao.insertOrReplaceInTx(user);
}

五、查

在資料庫的四個基本操作中查詢是比較複雜的,優先使用QueryBuilder API,使用更為簡單方面而且支援惰性載入(當處理一個較大的結果集時,lazy-loading(懶載入模式)可以節省記憶體提高效能),在更為複雜的查詢的情況下還支援原始SQL查詢。

1、QueryBuilder最基本的使用語法

  • 通過DAO的queryBuilder方法獲取QueryBuilder 例項,得到查詢主句(即Select 子句部分)

  • 呼叫QueryBuilder 的成員方法根據需求分別構造Where條件子句、Join子句、Order子句等等

  • 呼叫QueryBuilder 的獲取資料集合方法 list系 得到返回資料集,相當於是執行了完整SQL語句。

//查詢使用者中FirstName為CrazyMo_的所有使用者的資訊,等價於Select * from User where FirstName=“Mo” order by LastName asc
QueryBuilder qb = userDao.queryBuilder(); //構造QueryBuilder物件
qb.where(Properties.FirstName.eq("Mo"))  //新增Where查詢條件子句
.orderAsc(Properties.LastName)            //新增排序子句
.list();            //返回查詢結果
Query query = userDao.queryBuilder()
                .where(new WhereCondition.StringCondition("_ID IN (SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)"))
                .build();
query.list();

1、查詢表是否包含指定Id

public boolean isSaved(int _id){
    QueryBuilder<User> qb = GreenDAOApplication.getDaoSessionins().getUserDao().queryBuilder();
    qb.where(Properties.Id.eq(_id));
    qb.buildCount().count();
    return qb.buildCount().count() > 0 ? true : false;
}

2、獲取整個表的資料集並轉為集合

public List<User> getAllUser(){
     return QueryBuilder<User> qb = GreenDAOApplication.getDaoSessionins().getUserDao().queryBuilder().list();
     /* try {
            GreenDAOApplication.getDaoSession().getUserDao().queryBuilder().listLazy();
        }catch (Exception e){
            。。。
        }*/
 }

3、多次呼叫Query例項重複查詢

返回的Query物件是可以多次重複查詢的,如果查詢條件沒有改變直接再呼叫一次就好,而條件更新了可以通過呼叫setParameter()方法來更新引數完成再次篩選,避免了多次構建Query物件。

/*等價於Select * from User where FirstName=“Mo” and YearOfBirth=1999*/

Query query = GreenDAOApplication.getDaoSessionins().getUserDao().queryBuilder().where(
Properties.FirstName.eq("Mo"), Properties.YearOfBirth.eq(1999))
.build();
List list= query.list();

查詢FirstName為Crazy,YearOfBirth為199的人

query.setParameter(0, "Crazy");//前面0代表條件的序號,通過條件的序號更改查詢條件。
query.setParameter(1, 2000);
List list= query.list();

相關推薦

Android ORM——greenDAO 3PropertiesQueryBuilder資料庫刪改基本語法應用

引言 Android ORM——初識greenDAO 3及使用greenDAO 3前應該掌握的一些知識點介紹了greenDAO的配置步驟和一些重要的知識點,以及重要的角色的功能和聯絡,這一篇就正式開始結合點原始碼從應用greenDAO方面總結。在使用green

Android實戰——第三方服務Bmob後端雲的刪改上傳文件獲取文件修改密碼

tid blank 生成 src 上傳圖片 放置 第三方 b數 net 第三方服務之Bmob後端雲的增刪改查、上傳文件、獲取文件、修改密碼(二) 事先說明:這裏的一切操作都是在集成了BmobSDK之後實現的,如果對Bmob還不了解的話,請關註我第一篇Bmob文章 步

ORACLE中建立表對錶進行刪改語法

最近在學習ORACLE,現將在ORACLE中建立表、對錶進行增刪該查的語法總結如下: 表是一種資料庫物件,是基本的資料儲存單位,由行和列組成 表的建立(以課程資訊表為例): CREATE TABLE OBJECTS       

Android ORM——greenDAO 3及使用greenDAO 3前應該掌握的一些知識點

引言 總所周知,SQLite——內嵌於Android中一個佔用記憶體極小的關係型,作為我們Android儲存領域中重要的一員 ,或多或少都曾接觸到資料庫。即使Android系統中提供了許多操作SQLite的API,但是在業務開發中還是需要手動去編寫原生SQL語句

ArcGIS for Android 100.3的學習應用 如何移除指定的點和線?

在地圖上新增點和線的時候,我們有時候會遇到要移除或者切換指定的點和線的操作。那麼如何移除指定的點和線呢? ArcGIS的api裡點和線都是由GraphicsOverlay類來進行建立新增的。通過Graphic物件將點或者線的圖形物件(SimpleMarkerSymbol,SimpleLine

初學mysql(十)-資料庫儲存過程函式遊標-自定義函式和流程控制

上一篇部落格講了儲存過程、函式、以及遊標,這一篇部落格接著上一篇部落格來說。首先說說mysql資料庫中的流程控制及自定義函式的使用。 自定義函式: 根據所需要的功能,使用流程控制來完成所需要的功能,完成功能的程式碼就稱為自定義函式。要想完成自定義函式就必須學會流程控制的使

Android中聯絡人和通話記錄詳解(聯絡人的刪改)3

    在上一章 Android中聯絡人和通話記錄詳解(2)中分析了聯絡人相關的表和欄位,在這一章中將分析聯絡人相關的基本資料操作(Insert,Query,Update,Delete)。    1.新增(Insert)      從contacts,data,mimety

國產化路-統信UOS + Nginx + Asp.Net MVC + EF Core 3.1 + 達夢DM8實現簡單刪改操作

## 專題目錄 [國產化之路-統信UOS作業系統安裝](https://www.cnblogs.com/yuanqq/p/13738341.html) [國產化之路-國產作業系統安裝.net core 3.1 sdk](https://www.cnblogs.com/yuanqq/p/13686446.htm

Python實例對象的刪改

eight chinese style font 實例對象 -s del pan 修改 #實例對象的增刪改查p1 = ChinesePeople(‘wangyue‘)#print (p1.__dict__)#查看實例對象的屬性#print (p1.name)(p1.play

5月11日 python學習總結 子查詢pymysql模塊刪改防止sql註入問題

hal port 註入 any dict lex absolut username 參數 一、子查詢    子查詢:把一個查詢語句用括號括起來,當做另外一條查詢語句的條件去用,稱為子查詢 select emp.name from emp inner join dep on

Inno Setup 3語法解析

nes 多個 appid war 層次 需要 ace lena disk   接上回。安裝腳本段用於解析腳本中各個段的含義及使用方法。其包括[Setup]段、[Files]段、[Run]段等共17個字段,下面逐一進行分析。 [Setup]  &

ASP.NET全棧開發在Vue中使用前端校驗幸運飛艇平臺出租

ati fun 之間 成功 全棧 uml scrip UNC email 在全棧開發系列第三篇的時候有講到使用Vue進行前端驗證幸運飛艇平臺出租QQ2952777280【話仙源碼論壇】hxforum.com【木瓜源碼論壇】papayabbs.com。在那一篇博文裏,詳細講了

32mysql資料庫刪改

建立資料庫 CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] [CHARACTER SET=''] [DEFAULT] [COLLATE=''] IF NOT EXISTS 指定資料庫不存在的時候才建立 CHARACTER SET=

Hibernate+struts2ajax非同步實現簡單的刪改例子

使用hibernate表連線 entity程式碼(程式碼過多就不上傳了,自行封裝) Publisher實體 public class Publisher implements Serializable{ private int id; private String nam

Android : tablayout +側滑選單 + 豎立的tablayout +資料庫刪改+XListView+PullToRefresh 綜合

側拉選單 一個XListview載入,一個是PullToRefresh重新整理 一個是本地資料的重新整理一個是網路資料的重新整理 資料庫的增刪查 需要用到的許可權 <uses-permission android:name="android.permission.I

esp8266+微控制器最最簡單AT指令應用

微控制器+esp8266 wifi模組的AP模式 模組作為伺服器與遠端客戶機進行通訊 燒寫程式碼前需要先獲取到wifi模組的IP地址以及設定模組的wifi名字和密碼,以便客戶端進行連線 #include<reg52.h> #include<stdio.

ArcGIS for Android 的學習應用 如何移除指定的點和線?

在地圖上新增點和線的時候,我們有時候會遇到要移除或者切換指定的點和線的操作。那麼如何移除指定的點和線呢? ArcGIS的api裡點和線都是由GraphicsOverlay類來進行建立新增的。通過Graphic物件將點或者線的圖形物件(SimpleMarkerSy

thinkphp3.2.3版本的資料庫刪改例項

框架thinkphp 版本:3.2.3 內容:資料庫操作 1.多表查詢一條資料 M('a表')->join("b表 on b表.id=a表.id")->where('

iOS開發純Weex+Vuejs開發原生App整體結構和除錯步驟

前言 上一篇文章是根據Weex官方的介紹,啟動了Weex的Hello World的介紹以及一些外掛的安裝 環境部署和Debug 之前花了2周時間看了下Vue的語法和用法以及一些實戰介紹,畢竟是iOS開發,還是有必要把新學的東西寫下來,而且會寫的非常詳細,能保證從我git倉庫弄下來的基礎結構

JAVA操作資料庫刪改-JDBC的使用

一。準備工作: 1.操作資料庫的JDBC.jar包,下載地址:http://download.csdn.net/detail/qq_33750826/9671725 2.如果你的電腦為安裝mysql請安裝mysql,下載地址:http://download.