Android數(shù)據(jù)庫ObjectBox使用說明

前言

集成GreenDao查詢官網(wǎng)可以看到一則通告:對于新應(yīng)用程序,我們建議使用ObjectBox,這是一個新的面向?qū)ο蟮臄?shù)據(jù)庫,它比SQLite快得多并且易于使用。對于基于greenDAO的現(xiàn)有應(yīng)用程序,我們提供了DaoCompat,可輕松切換(另請參見公告)。

于是,本篇便對比GreenDao寫一個ObjectBox的簡單使用說明,對比GreenDao集成起來更加容易,使用也比較簡單。

介紹

ObjectBox數(shù)據(jù)庫是用于對象的超快速輕量級數(shù)據(jù)庫,由greenrobot團隊開發(fā),與GreenDao,EventBus等師出同門。

從 greenDAO 遷移到 ObjectBox 提供了各種優(yōu)勢:

  • 更快: ObjectBox 比 SQLite 快10倍(檢查這個開源基準應(yīng)用程序)
  • 強大的關(guān)系支持: ObjectBox 提供了更改跟蹤、級聯(lián)放置和靈活的加載策略(渴望和懶惰)
  • 不需要掌握 SQL: ObjectBox 更容易使用,不需要學(xué)習(xí)“外語”
  • 現(xiàn)代 api: ObjectBox 具有簡化的 api,并提供了自己的反應(yīng)式查詢和對 rxjava2/3的支持(具有真正的變更觀察)
  • 更清晰的實體代碼: ObjectBox 具有不可見的代碼生成,并且不會在文件中生成源代碼
  • 支持 Kotlin: ObjectBox 支持 Kotlin,包括數(shù)據(jù)類
  • 同步即將到來: 基于典型的 REST 網(wǎng)絡(luò)方法,保持數(shù)據(jù)同步是很難做到的。使之變得簡單

Github地址:https://github.com/objectbox/objectbox-java

項目配置

1、項目根 build.gradle (項目級別) 配置:

buildscript {
    ext.objectboxVersion = '2.8.1'
    dependencies {
        classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
    }
}

2、應(yīng)用程序 build.gradle (模塊級) 配置:

apply plugin: 'io.objectbox' // 應(yīng)用Android插件后

使用說明

1、新建實體類,如下:

@Entity
public class User {
    @Id
    public Long id;

    public String userId;

    public String userName;

    public int age;
}
  • @Entity:對象持久化;
  • @Id:這個對象的主鍵,默認情況下,id是會被objectbox管理的,也就是自增id。手動管理id需要在注解的時候加上@Id(assignable = true)。當(dāng)你在自己管理id的時候如果超過long的最大值,objectbox 會報錯;id的值不能為負數(shù);當(dāng)id等于0時objectbox會認為這是一個新的實體對象,因此會新增到數(shù)據(jù)庫表中;
  • @Index:這個對象中的索引。經(jīng)常大量進行查詢的字段創(chuàng)建索引,用于提高查詢性能;
  • @Transient:某個字段不想被持久化,可以使用此注解,字段將不會保存到數(shù)據(jù)庫;
  • @NameInDb:數(shù)據(jù)庫中的字段自定義命名;
  • @ToOne:做一對一的關(guān)聯(lián)注解 ,此外還有一對多,多對多的關(guān)聯(lián),例如Class的示例;
  • @ToMany:做一對多的關(guān)聯(lián)注解;
  • @Backlink:表示反向關(guān)聯(lián)。

它必須具有非私有的可見性(或非私有的 getter 和 setter 方法)。

2、點擊AndroidStudio中的Make Project(小錘子的圖標(biāo)),objectbox為項目生成類 MyObjectBox類,用于初始化生成 BoxStore 對象,進行數(shù)據(jù)庫管理。然后,通過BoxStore對象為實體類獲得一個 Box 類,Box 對象提供對所有主要函數(shù)的訪問,比如 put、 get、 remove 和 query。

核心API:

  • MyObjectBox: 基于您的實體類生成,MyObjectBox 提供一個構(gòu)建器為您的應(yīng)用程序設(shè)置一個 BoxStore。
  • BoxStore: 使用 ObjectBox.BoxStore 的入口點是到數(shù)據(jù)庫的直接接口,并管理 Boxes。
  • Box: 保存一個盒子并查詢實體。對于每個實體,有一個 Box (由 BoxStore 提供)。

3、數(shù)據(jù)庫操作:

(1)新建ObjectBox操作類,用于初始化及數(shù)據(jù)庫管理:

public class ObjectBox {
    private static BoxStore mBoxStore;

    public static void init(Context context) {
        mBoxStore = MyObjectBox.builder()
                .androidContext(context.getApplicationContext())
                .build();
    }

    public static BoxStore get() { return mBoxStore; }
}

(2)調(diào)用ObjectBox類進行初始化,并為User實體類獲得一個 Box 類,進行具體操作:

private void initUserBox() {
    ObjectBox.init(this);

    mBoxStore = ObjectBox.get();

    mUserBox = mBoxStore.boxFor(User.class);
}

(3)數(shù)據(jù)庫增刪改查:

  • 初始化數(shù)據(jù),批量添加,調(diào)用實體的Box對象,調(diào)用put()方法即可完成新增操作:

    private void initUser() {
    
        //用戶ID生成器
        mIdWorker = new SnowflakeIdGenerator(0, 0);
    
        mUserBox.removeAll();
    
        mUserList = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setUserId(String.valueOf(mIdWorker.nextId()));
            // 隨機生成漢語名稱
            user.setUserName(NameUtils.createRandomZHName(random.nextInt(4) + 1));
            user.setAge(18 + random.nextInt(10));
            mUserList.add(user);
        }
    
        mUserAdapter = new UserAdapter(mUserList);
        rvUser.setAdapter(mUserAdapter);
    
        mUserBox.put(mUserList);
    }
    
  • 查詢數(shù)據(jù),通過Boxquery()方法可以得到一個QueryBuilder對象,該對象可以實現(xiàn)各種查詢操作,里面包含contains(),equal()等方法:

    private void queryAllUser() {
        mUserList = mUserBox.query().build().find();
        mUserAdapter.setNewData(mUserList);
        rvUser.smoothScrollToPosition(mUserList.size() - 1);
    }
    
  • 添加數(shù)據(jù),調(diào)用實體的Box對象,調(diào)用put()方法即可完成新增操作:

    User user = new User();
    user.setUserId(String.valueOf(mIdWorker.nextId()));
    user.setUserName(NameUtils.createRandomZHName(new Random().nextInt(4) + 1));
    user.setAge(18 + new Random().nextInt(10));
    
    // 插入新用戶
    mUserBox.put(user);
    
  • 修改數(shù)據(jù),得到要修改的實體類,修改數(shù)據(jù),隨后調(diào)用實體的Box對象put()方法:

    User user = mUserList.get(mUserList.size() - 1);
    user.setUserName(NameUtils.createRandomZHName(new Random().nextInt(4) + 1));
    
    //更新最末用戶
    mUserBox.put(user);
    
  • 刪除數(shù)據(jù),調(diào)用實體的Box對象remove()方法:

    User user = mUserList.get(mUserList.size() - 1);
    
    //刪除最末用戶
    mUserBox.remove(user);
    
數(shù)據(jù)庫操作.jpg

以上就是ObjectBox數(shù)據(jù)庫操作的基本使用說明了,在之前寫的GreenDao上面修改了使用方法,對比GreenDao還是十分簡單的,更多用法可以查看API文檔解鎖使用:https://docs.objectbox.io/

訪問Github項目查看具體代碼實現(xiàn):

https://github.com/MickJson/DevelopmentRecord

歡迎點擊查閱及Star,我也會繼續(xù)補充其它有用的知識及例子在項目上。

歡迎點贊/評論,你們的贊同和鼓勵是我寫作的最大動力!

最后編輯于
?著作權(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)容