學(xué)習(xí)objectbox數(shù)據(jù)庫,看這個就夠了

數(shù)據(jù)庫簡介

objectbox數(shù)據(jù)庫是greenrobot團隊開發(fā)的全新非關(guān)系型數(shù)據(jù)庫框架,該團隊還開發(fā)過greenDao,EventBus等熱門框架,可謂實力雄厚。按照官方介紹,該庫有如下特點:

  • 超快速:號稱勝過測試過的所有嵌入式數(shù)據(jù)庫
  • 面向?qū)ο蟮?API: 沒有 rows、columns 和 SQL,完全從0開始的對象(沒有ORM,沒有SQLite)
  • 反應(yīng)性:對數(shù)據(jù)變化的反應(yīng)簡單而強大,使用ObjectBox中的反應(yīng)數(shù)據(jù)觀察器或與RxJava集成。
  • 多平臺:已經(jīng)支持安卓和java,ios和MacOs正在集成
  • 簡單的線程:ObjectBox返回的對象可以在所以線程中運行
  • 沒有手動模式遷移:ObjectBox負責添加,刪除和重命名屬性的新對象版本,意味著數(shù)據(jù)庫的升級不再需要我們自己管理版本號,ObjectBox內(nèi)部會自動幫我們管理

安裝

注意,本教程是基于截至于目前最新版1.4.0編寫

根目錄build.gradle中添加:

buildscript {
    ext.objectboxVersion = '1.4.0'
    repositories {
        maven { url "http://objectbox.net/beta-repo/" }
    }
    dependencies {
        classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
    }
    
}
    
allprojects {
    repositories {
        maven { url "http://objectbox.net/beta-repo/" }
    }
}

app build.gradle中添加

apply plugin: 'io.objectbox' // after applying Android plugin

使用

初始化

在Application中的onCreate()中初始化

boxStore = MyObjectBox.builder().androidContext(this).build();

MyObjectBox類是objectbox自動生成的,需要通過Build> Make project操作來生成,在此之前,需要創(chuàng)建至少一個帶有@Entity注解的實體類,才能正常創(chuàng)建MyObjectBox,初始化后得到一個BoxStore對象,該對象可以簡單理解為獲取查詢對象的入口,因此,我們可以申明一個get()方法,像這樣:


public class BaseApp extends Application {
    private static BaseApp baseApp;
    private BoxStore boxStore; //數(shù)據(jù)庫表的管理者
    @Override
    public void onCreate() {
        super.onCreate();
        baseApp = this;
        boxStore = MyObjectBox.builder().androidContext(this).build();
        if (BuildConfig.DEBUG) {
            new AndroidObjectBrowser(boxStore).start(this);
        }
    }

    public BoxStore getBoxStore(){
        return boxStore;
    }

    public static BaseApp getInstence(){
        return baseApp;
    }
}

實體類的建立

objectbox是通過注解來標明哪個類是實體,若新建了一個新的實體或?qū)嶓w進行了修改,都需要重新Make Project來生成新的實體操作對象。常用的注解如下:

@Entity   //表示這是一個需要持久化的實體
public class Student {
    @Id 
    public long id;

    @Index
    public String name;
 
    @Transient
    public int tempUsageCount;

    @NameInDb("USERNAME")
    public String name;

    public ToOne<Class> classToOne;

    public int age;
}

@Entity:這個對象需要持久化。

@Id:這個對象的主鍵,默認情況下,id是會被objectbox管理的,也就是自增id,如果你想手動管理id需要在注解的時候加上@Id(assignable = true)即可。當你在自己管理id的時候如果超過long的最大值,objectbox 會報錯.id的值不能為負數(shù)。當id等于0時objectbox會認為這是一個新的實體對象,因此會新增到數(shù)據(jù)庫表中

@Index:這個對象中的索引。對經(jīng)常大量進行查詢的字段創(chuàng)建索引,會提高你的查詢性能。

@Transient:如果你有某個字段不想被持久化,可以使用此注解,那么該字段將不會保存到數(shù)據(jù)庫

@NameInDb:有的時候數(shù)據(jù)庫中的字段跟你的對象字段不匹配的時候,可以使用此注解。

@ToOne:做一對一的關(guān)聯(lián)注解,例如示例中表示一張學(xué)生表(Student)關(guān)聯(lián)一張班級表(Class),此外還有一對多,多對多的關(guān)聯(lián),例如Class的示例:

@Entity
public class Class{
    @Id
    long id;
    
    @Backlink(to = "classToOne")
    public ToMany<Student> studentEntitys;
}

@ToMany:做一對多的關(guān)聯(lián)注解,如示例中表示一張班級表(Class)關(guān)聯(lián)多張學(xué)生表(Student)

@Backlink:表示反向關(guān)聯(lián)

增刪改查

實體類建立完后,在Android Studio中使用Build> Make project編譯一次,objectbox會自動幫你生成相應(yīng)的操作實體,例如·Student則會生成一個Student_的類,該類通常作為Params傳遞。

增加一條數(shù)據(jù)
首先我們獲取該實體的Box對象,隨后調(diào)用該對象的put()方法即可完成新增操作

Box<Student> StudentBox = BaseApp.getInstence().getBoxStore().boxFor(Student.class);
Student student = new Student();
student.name = "Jay";
StudentBox.put(student);

刪除數(shù)據(jù)

StudentBox.remove(student);  //該參數(shù)可以傳要刪除的實體,也可以傳入要刪除的實體的id,可以批量傳入

查詢
通過Boxquery()方法可以得到一個QueryBuilder對象,該對象可以實現(xiàn)各種查詢操作,里面包含contains(),equal()等各種便捷的查詢方法,示例如下:

//查詢一個名叫Jay的學(xué)生信息的表
Student jayStudent = StudentBox.query().equal(Student_.name, "Jay").build().find();

里面的Property對象其實就是傳入我們自動生成的Student_對象的參數(shù)。

修改
objectBox修改數(shù)據(jù)非常簡單,首先得到要修改的實體類,直接修改數(shù)據(jù),隨后調(diào)用put()方法即可,示例如下:

//查詢一個名叫Jay的學(xué)生信息的表
Student jayStudent = StudentBox.query().equal(Student_.name, "Jay").build().find();
jayStudent.name = "www.huangjie.name";
StudentBox.put(jayStudent);

這樣就把Jay改成了我的博客地址,haha~

數(shù)據(jù)庫的其他操作

數(shù)據(jù)庫的數(shù)據(jù)升級
當我們需要新增和刪除字段時,直接操作實體類即可,不需要做特殊的更改,如果需要重命名字段名或?qū)嶓w類名,可以按照如下步驟操作:
第一步:給需要修改的類名加上@UID注解

@Entity
@Uid
public class MyName { ... }

第二步:編譯項目,編譯將失敗,并且會給你一個UID
error: [ObjectBox] UID operations for entity "MyName": [Rename] apply the current UID using @Uid(6645479796472661392L) - [Change/reset] apply a new UID using @Uid(4385203238808477712L)
第三步:將Rename后面的UID放入到要修改的類中:

@Entity
@Uid(6645479796472661392L)
public class MyName { ... }

第四步:進行數(shù)據(jù)的修改

@Entity
@Uid(6645479796472661392L)
public class MyNewName { ... }

更改數(shù)據(jù)屬性或重命名字段名同理操作。

表關(guān)系

@ToOne和@ToMany可以看作JAVA中的T和List<T>的關(guān)系,拿班級和學(xué)生舉例,設(shè)置相關(guān)的學(xué)生對象如下:

Class class = new Class(); //先創(chuàng)建一個班級
Student student = new Student();
student.name = "Jay";
student.classToOne.setTarget(class);  //設(shè)置一對一的target對象,字段參見以上示例
long studentId = StudentBox.put(student);

獲取該學(xué)生的班級信息:

Student student = StudentBox.get(studentId);
Class class = student.classToOne.getTarget();

而一對多的關(guān)系更為簡單,你可以像List集合一樣去操作它:

Class class_ = new Class(); //先創(chuàng)建一個班級
Student s1 = new Student(); //添加一個學(xué)生
student.name = "Jay";

Student s2 = new Student();
s2.name = "Android";

class_ .studentEntitys.add(s1);
class_ .studentEntitys.add(s2);
Box classBox = BaseApp.getInstence().getBoxStore().boxFor(Class.class);
classBox.put(class);

這樣的話一張Class表中就有兩個學(xué)生表的數(shù)據(jù)了,查詢的話可以獲取該Class的實體,隨后像遍歷List集合一樣去遍歷studentEntitys字段,objectBox提供的方法和List集合幾乎一樣,這里就不做示例了。

求和等操作
使用Query對象即可進行求和等操作,通過QueryBuilderbuild()方法即可得到。隨后調(diào)用sumDouble()等方法傳入求和條件即可。我們獲取實體類或?qū)嶓w類集合也是使用的該對象獲取。

另外,objectBox還支持事務(wù),Rxjava查詢,Kotlin的支持,更多詳情可以通過官方文檔了解http://objectbox.io.

遇到的問題

無法生成MyObjectBox.class
如果你按照之前的操作發(fā)現(xiàn)還是不能正常生成,檢查你的Gradle構(gòu)建文件,android-apt插件在新版Gradle已經(jīng)被棄用,將Gradle升級到最新版即可.(注:“com.android.tools.build:gradle:2.3.3”已經(jīng)算是老的版本了,現(xiàn)在至少是3.0以上了)

End

emmmmmm...寫了這么多,個人覺得objectBox挺好用的,目前沒發(fā)現(xiàn)啥坑。另外,推薦下我寫的ObjectBox數(shù)據(jù)庫的練手項目仿支付寶記賬本,仿的支付寶中的記賬本功能,結(jié)合它看你的objectBox上手更快哦。

最后的最后~~推薦下我的個人博客:www.huangjie.name........

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容