項目經(jīng)理大大又提出了新的需求,那作為程序員就只能埋頭敲(復(fù)制?)代碼了
博主水平有限,目前還處于填坑之中,如有錯誤以及不足,歡迎大佬指正。。。吼吼吼
網(wǎng)上很多比較數(shù)據(jù)庫框架的文章,這里就不闡述了,直接進入正題。
官方文檔
API文檔
github地址
請注意,此文基于ObjectBox2.3.4
基本還處于開發(fā)中的狀態(tài),源碼中最多的注釋就是:// Sketching future API extension
想要使用的老鐵們請慎重考慮一波
環(huán)境配置
項目目錄 build.gradle下添加以下代碼
buildscript {
ext.objectboxVersion = '2.3.4'
dependencies {
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
}
}
module build.gradle下添加以下代碼
//支持瀏覽器查看數(shù)據(jù)庫數(shù)據(jù),如果不需要可以去掉dependencies 代碼塊
dependencies {
debugImplementation "io.objectbox:objectbox-android-objectbrowser:$objectboxVersion"
releaseImplementation "io.objectbox:objectbox-android:$objectboxVersion"
}
//一定放在dependencies代碼塊下
apply plugin: 'io.objectbox' // after applying Android plugin
ObjectBox支持kotlin,與響應(yīng)式編程,具體以后可能會寫(???)
implementation "io.objectbox:objectbox-kotlin:$objectboxVersion"http://添加kotlin支持
為了試電腦可以訪問ObjectBox數(shù)據(jù)庫,我們需要在應(yīng)用初始化時添加以下代碼
if (BuildConfig.DEBUG) {//開啟瀏覽器訪問ObjectBox
val started = AndroidObjectBrowser(ObjectBox.boxStore).start(this)
ToastTools.showLog("ObjectBrowser", "Started: $started")
}
手機當然需要連接adb,還需要問么。。。
使用電腦瀏覽器訪問:http://localhost:8090/index.html
如果提示訪問被拒絕,請使用命令行工具執(zhí)行以下命令
adb forward tcp:8090 tcp:8090
然后刷新瀏覽器(請確保adb功能好使,你問我再不好使咋辦??? 我哪知道,問村長去。。。)

網(wǎng)頁長這樣,可以方便查看數(shù)據(jù)庫數(shù)據(jù),再也不用下一堆亂糟糟的插件了神馬的。。。(大聲喊:牛逼~~~~?。。。?/p>
使用流程
基本可以按照官方的demo使用
- 初始化ObjectBox
- 創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)映射實體類
- CURD操作(這塊有坑。。。)
初始化
ObjectBox.init(this)
我是在Application里初始化的,不在這里你想在哪里?
object ObjectBox {
lateinit var boxStore: BoxStore
private set
fun init(context: Context) {
boxStore = MyObjectBox.builder().androidContext(context.applicationContext).build()
ToastTools.showLog("TAG-->ObjectBox", "Using ObjectBox ${BoxStore.getVersion()} (${BoxStore.getVersionNative()})")
}
}
MyObjectBox可能會提示報錯,不要緊,當我們編寫好數(shù)據(jù)庫映射的實體類之后,make project 一下就ojbk了。
創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)映射實體類
@Entity
data class User(
@Id var mid: Long,
val money: Int?,
val nickname: String?,
)
Object使用注解進行標記,比某侵入式框架要高端不少(沒錯說的就你是,Realm)
最少使用兩個注解就可以完成實體類的注冊
官網(wǎng)推薦:最好提供一個全屬性的構(gòu)造器,以提高性能。
** 如果沒有全屬性構(gòu)造器,將會使用無參構(gòu)造器(Kotlin這點尤為注意)**
1,Entity : 告訴ObjectBox此實體類需要保存數(shù)據(jù)庫
2,Id : 在ObjectBox中,實體必須具有一個long類型的@Id屬性,才能有效地獲取或引用對象,在kotlin中,注解為Id的屬性不能為val 具體為啥,等你這么寫了之后報錯就知道了。
以上這倆注解必須存在,不然ObjectBox是無法正常工作滴。
介紹一下其他注解:(翻譯自官網(wǎng)文檔,可能會有一些出入,歡迎指正)
3,NameInDb:指定在數(shù)據(jù)庫中的字段名。
4,Index : 用@Index注釋屬性,為對應(yīng)的數(shù)據(jù)庫列創(chuàng)建數(shù)據(jù)庫索引。這可以提高查詢該屬性時的性能。不支持byte[], float and double
5,Convert :具體解釋沒在官網(wǎng)找到,個人理解是:當實體類對象中存在集合對象時,提供的一種轉(zhuǎn)換器,用以將集合轉(zhuǎn)換成基本數(shù)據(jù)類型。如果不提供轉(zhuǎn)換器的話,在保存此對象時會報錯。注意,我只試驗過List<String>類型。自定義對象會復(fù)雜一些,以后有機會我會一篇文章記錄。
@Entity
data class User(@Id var id: Long = 0,
@Index var user_id: String?,
var user_login: String?,
var user_nicename: String?,
var vid: String?,
@Convert(converter = StringsConverter::class, dbType = String::class) var app_auth: ArrayList<String>?)
Convert注解需要兩個參數(shù),一個是轉(zhuǎn)換類的類對象,還有一個是轉(zhuǎn)換目標對象,也就是存入數(shù)據(jù)庫中的類型
StringsConverter代碼(其實我覺得自定義對象,也可以這么弄。。不過沒嘗試,歡迎大佬嘗試)
class StringsConverter : PropertyConverter<ArrayList<String>, String> {
override fun convertToDatabaseValue(entityProperty: ArrayList<String>?): String? {
if (entityProperty != null) {//注解傳入的實體對象,注意判斷是否為空
return JsonUtil.toJson(entityProperty)//使用Gson變成json傳
}
return null
}
override fun convertToEntityProperty(databaseValue: String?): ArrayList<String>? {
if (databaseValue != null) {//注意判斷是否為空
return JsonUtil.fromJson(databaseValue, object : TypeToken<List<String>>() {}.type)//序列化json
}
return null
}
}
基本操作
1,增
/**
* 插入數(shù)據(jù)庫
*/
fun <M> saveDataByDatabase(cls: Class<M>,data : M?){
if (data!=null){
val boxFor = ObjectBox.boxStore.boxFor(cls)
boxFor.put(data)
}
}
這是我封裝的工具類。put支持單數(shù)據(jù),以及集合數(shù)據(jù)的插入。
2,刪
val box = ObjectBox.boxStore.boxFor(cls)
box.query().build().remove()//清除所有數(shù)據(jù)
刪除所有符合搜索條件的數(shù)據(jù),因為沒指定搜索條件,所以是刪除所有數(shù)據(jù)
3,改
修改數(shù)據(jù)庫跟插入數(shù)據(jù)庫是一致的,猜測必須要修改從數(shù)據(jù)庫中查詢出來的對象,在使用put修改。如果是新創(chuàng)建對象,即使各屬性值一致可能也是插入而不是修改。最近太忙,有空實驗一下。
4,查
/**
* 查詢數(shù)據(jù)直接返回數(shù)據(jù)
*/
fun <M> getDataByDatabase(cls: Class<M>): ArrayList<M> =
ObjectBox.boxStore.boxFor(cls).query().build().find() as ArrayList<M>
注意,使用ObjectBox需提供各實體類的盒子對象,也就是必須指定方法中泛型M的實體類,才可以進行按條件查詢。
ObjectBox.boxStore.boxFor(User::class.java).query().equal(User.name, "二狗子").build().findFirst()
查詢name為“二狗子”的User對象,并返回第一個。ObjectBox還支持多條件查詢。
//官方示例代碼
QueryBuilder<User> builder = userBox.query();
builder.equal(User_.firstName, "Joe")
.greater(User_.yearOfBirth, 1970)
.startsWith(User_.lastName, "O");
List<User> youngJoes = builder.build().find();
獲取姓氏以“O”開頭、1970年以后出生的用戶的名字“Joe”。
具體還請看官網(wǎng)使用手冊。
看了這些,就基本可以簡單使用ObjectBox了。以后有機會,還會更新一些高級用法。。。