常用的數據庫框架
Android的發展的速度是難以置信的,Android出來哪一年我還在小學上學很,還能很清楚的記得,那年一切,但是那個時候的我怎么可能也不會想到自己將來會要去做Android.Android數據庫的框架很多,選擇自己喜歡的,不用掌握很多,選擇自己喜歡的就好.
Sugar&GreenDao&Afinal&ORMLite&Realm&LiteOrm&DBFlow&ActiveAndroid&LitePal
SugarORM 是對象關系映射模式。不用寫復雜的sql語句,而用簡單的API即可完成創建和操縱數據;可以在原有的Bean上僅僅添加小的修改而復用Bean;簡化而明了的數據庫設計和創建過程,同時提供表的一對多的支持。
GreenDao 是為Android設計的對象關系映射(ORM)工具。它提供了對象到關系型數據庫SQLite的相應接口。為了在Android工程中使用greenDao,需要創建另一個“生成器”工程,它的任務是在你的工程域里生成具體的代碼。因此相比與其它ORM框架具有出眾性能。
Afinal 是一個android的sqlite orm 和 ioc 框架。同時封裝了android中的http框架,使其更加簡單易用。FinalDB模塊,android中的orm框架,一行代碼就可以進行增刪改查。支持一對多,多對一等查詢。
ORMLite (Object Relational Mapping Lite)提供了一些輕量級持久化Java對象到SQL數據庫,同時也避免了復雜性和更多的標准的ORM包的開銷功能。它支持的SQL數據庫使用JDBC的數量,還支持原生的Android操作系統數據庫API調用sqlite。
Realm 是用來替代sqlite的一種解決方案,它有一套自己的數據庫存儲引擎,比sqlite更輕量級,擁有更快的速度,並且具有很多現代數據庫的特性,比如支持JSON,流式api,數據變更通知,自動數據同步,簡單身份驗證,訪問控制,事件處理,最重要的是跨平台,目前已有Java,Objective C,Swift,React-Native,Xamarin這五種實現。
LiteOrm 是android上的一款數據庫(ORM)框架庫。速度快、體積小、性能高。開發者基本一行代碼實現數據庫的增刪改查操作,以及實體關系的持久化和自動映射。設計原則:輕量、專注、性能優先、線程無關,專注數據及其關系存儲和操作;無需工具輔助,不需要無參構造,不需要繁多注解,約定優於配置;使用極致簡約,例如:db.save(u); db.query(U.class); db.deleteAll(U.class);。
DBFlow 綜合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等庫的優點。同時不是基於反射,所以性能也是非常高,效率緊跟greenDAO其后。基於注解,使用apt技術,在編譯過程中生成操作類,使用方式和ActiveAndroid高度相似,使用簡單。無縫支持多個數據庫,使用annotation processing提高速度,ModelContainer類庫可以直接解析像JSON這樣的數據,增加靈活性的豐富接口。
ActiveAndroid 是采用活動記錄(Active Record)架構模式設計的適用於Android平台的輕量級ORM架構
LitePal 是對象關系映射(ORM)模型。它使開發者使用SQLite數據庫變得非常容易。 你可以不用寫一句SQL語句就可以完成大部分數據庫操作,包括創建表,更新表,約束操作,聚合功能等等。
LitePal
LitePal的集成和簡單的使用
LitePal中實現增刪改查
LitePal一些常用的API介紹
LitePal的集成和簡單的使用
引入相應的類庫
compile 'org.litepal.android:core:1.6.1'
這個可以去項目源碼中找到最新的類庫
創建相應的litepal.xml文件
首先這個文件是在相應的assets文件夾下(創建方法為項目文件夾下New->Folder->Assets Folder就可以創建相應的assets文件夾了),然后在assets文件夾下創建一個相應的litepal.xml文件夾,下面是具體的內容:
這里說明幾點問題:
dbname標簽是相應的數據庫名稱
version標簽是相應的數據庫的版本,這里注意當里面引用的內容發生改變的時候,要升級相應的版本
list標簽是那些對象需要數據庫管理,這里注意mapping里面的路徑一定要是全路徑名稱
這里面list標簽中的實體類都應該繼承DataSupport這個類,這個千萬別忘記
更換繼承的Application
這里其實份兩種情況:
已經有繼承的Application
直接繼承LitePalApplication
為什么分為這兩種情況呢?因為有的項目中可能之前實現Application已經繼承了一個其他類型的Application了,那么這個時候因為java的單繼承,所以這里就不能直接繼承LitePalApplication了,但是LitePal已經幫我們想到這個問題了,所以說下面我們分兩種情況實現一下:
第一種
直接在相應項目中的Application中的onCreat()方法中初始化一下就可以了,像下面這樣:
@Override
public void onCreate() {
super.onCreate();
LitePal.initialize(this);
}
這樣你的Application可以隨便繼承其他的Application
在manifest.xml中引入相應的Application,也就是你之前的Application
第二種
直接繼承相應的LitePalApplication這里就不用在onCreat()中調用LitePal.initialize(this);這個方法了;
這個就比較特殊了要在相應的application標簽中添加Application的時候要這樣寫android:name="org.litepal.LitePalApplication"
LitePal中實現CRUD(增刪改查)
LitePal添加數據
關於相應的增加操作,這里主要是通過對象的save()進行的,怎么說呢?其實你只要給相應的類添加了相應的集體參數然后調用相應的save()方法就可以了.具體代碼如下:
LitePalBean zhangSanBean = new LitePalBean("張三", "20", "男");
zhangSanBean.save();
LitePalBean liSiBean = new LitePalBean("李四", "25", "男");
liSiBean.save();
這樣就形成了相應的數據庫的表結構了,也就是有了相應的數據庫了,但是如果你在手機上調試的不Root的話是看不到的.這里說明一個問題添加相同的內容是可以添加進去的
LitePal刪除數據
關於刪除數據的操作,這里主要是通過對象的delete()或者deleteAll()進行刪除,具體代碼如下:
/*這里就是刪除所有名字是張三的*/
DataSupport.deleteAll(LitePalBean.class, "name =?", "張三");
LitePalBean zhangSanBean = new LitePalBean("張三", "20", "男");
zhangSanBean.save();
zhangSanBean.delete();
這里刪除的兩種方式:
直接對象刪除:也就是對象直接調用delete();方法進行;
根據類型進行刪除,其實這里就是相當於SQLite進行刪除,這里有必要說明一下第二個語句傳入內容如果為"name=?"代表的是所有name為后面字段的內容,也就是所有名字為張三的內容都會刪除.那么你會問了如果這里面我傳入兩個內容呢?比如"name=? and age=?"對沒錯,就是用and進行連接
LitePal更新數據
這里其實很簡單,就是更改完相應的數據直接save保存就可以了,代碼如下:
LitePalBean zhaoWuBean = new LitePalBean("趙五", "25", "男");
zhaoWuBean.save();
zhaoWuBean.setAge("30");
zhaoWuBean.save();
這里有一個問題,感覺應該是先取出來這個對象在進行操作才對,才能確保內容的正確性.
LitePal查詢方法
關於查詢數據的操作,主要用到find()和findAll()等相應的方法,具體代碼如下:
List all = DataSupport.findAll(LitePalBean.class);
for (int i = 0; i < all.size(); i++) {
Log.e(TAG, "query: " + all.get(i).toString());
}
}
LitePal常用的API
DataSupport.findFirst(XXX.class)
查詢XXX列表中的第一個元素
DataSupport.findLast(XXX.class)
查詢XXX列表中的最后一個元素
DataSupport.select()
根據SQLite中的關鍵字進行查找,例如DataSupport.select("name","age").find(XXX.class) 查詢的是相應名字和年齡的兩列數據 其他的數據是查不出來的.
DataSupport.where()
相當於SQLite中的where關鍵字查找,這里還是舉個例子->DataSupport.where("name=?","張三").find(XXX.class) 查詢的是所有名字為張三的數據內容;
DataSupport.order()
相當於SQLite中的order關鍵字查找,主要是排序方式,這里還是舉個例子->DataSupport.order(price desc).find(XXX.class) 這里面是按照降序進行排列的;desc標識降序排列,**asc
**代表升序排列
DataSupport.limit()
查詢數據庫的結果的數量 例子->DataSupport.limit(3).find(XXX.class); 查詢3條數據
DataSupport.offset()
查詢制定結果的偏移量 例子(我想查詢第二條第三條和第四條)-> DataSupport.limit(3).offset(1).find(XXX.class); 這里是從第一條開始,但是不包含相應的第一條
---------------------