android sqlite orm,ioc,SQlite數據庫框架:LitePal

常用的數據庫框架

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); 這里是從第一條開始,但是不包含相應的第一條

---------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值