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 物件
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來制定查詢
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 3之Properties、QueryBuilder與資料庫的增刪改查的基本語法應用(二)
引言 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。在那一篇博文裏,詳細講了
32、mysql資料庫增刪改查
建立資料庫 CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] [CHARACTER SET=''] [DEFAULT] [COLLATE=''] IF NOT EXISTS 指定資料庫不存在的時候才建立 CHARACTER SET=
Hibernate+struts2之ajax非同步實現簡單的增刪改查例子
使用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.