越寫悅快樂之Android項目如何集成ObjectBox

ObjectBox - 圖片來自簡書App

今天的越寫悅快樂為大家?guī)鞟ndroid項目如何集成ObjectBox的文章。做過Android開發(fā)的小伙伴都知道,我們在存儲一些數(shù)據(jù)時不可避免地和SQLite打交道,那如何快速安全地操作數(shù)據(jù)庫,成為了我們開發(fā)工程師的迫切需求,本文就從使用的角度為大家分享如何在Android應用中集成ObjectBox。

ObjectBox是什么

ObjectBox is a superfast object-oriented database with strong relation support. ObjectBox is embedded into your Android, Linux, macOS, or Windows app.

說人話就是ObjectBox是快速進行SQLite數(shù)據(jù)庫操作的利器,并支持OOP操作,也就是說您可以像操作對象那樣,通過Box來高效地操作數(shù)據(jù)庫,目前它可以支持Android、macOS、Windows等。

ObjectBox特點

ObjectBox特點 - 圖片來自簡書App

開發(fā)環(huán)境

  • Window 10.0.17763
  • Java 1.8.0.191
  • Android Studio 3.2.1

Gradle 版本

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip

Build 版本

dependencies {
    classpath 'com.android.tools.build:gradle:3.2.1'
}

如何接入

項目配置

首先,我們在build.gradle聲明objectbox版本并在dependencies添加classpath,配置文件的內容如下:

buildscript {
    ext {
        objectboxVersion = '2.3.4'
    }
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        classpath 'io.objectbox:objectbox-gradle-plugin:' + rootProject.ext.objectboxVersion
    }
}

allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
        maven { url 'https://jitpack.io' }
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

模塊配置

其次,我們在模塊配置文件app/build.gradle中引入plugin,并添加不同編譯模式下的依賴,其文件內容如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "me.weitao.app.todoobjectbox"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:design:28.0.0'

    debugImplementation 'io.objectbox:objectbox-android-objectbrowser:' + rootProject.ext.objectboxVersion
    releaseImplementation 'io.objectbox:objectbox-android:' + rootProject.ext.objectboxVersion

    implementation 'com.qmuiteam:qmui:1.2.0'

    testImplementation 'junit:junit:4.12'

    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

apply plugin: 'io.objectbox'

創(chuàng)建實體并配置注解

然后,我們創(chuàng)建用戶對象,并配置注解聲明該實體,配置主鍵生成方式等,其完整的文件內容如下:

package me.weitao.app.todoobjectbox.registry.model.db;

import io.objectbox.annotation.Entity;
import io.objectbox.annotation.Id;

/**
 * @author WaTony Weng
 * @date 2019/05/18 13:14
 * @copyright WaTony Weng
 */

@Entity
public class User {

    /**
     * 編號
     */
    @Id(assignable = true)
    public long id;

    /**
     * 名稱
     */
    public String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 構造方法
     * @param name 名稱
     */
    public User(String name) {
        this.name = name;
    }

}

創(chuàng)建Box對象

然后,我們創(chuàng)建Box對象,該對象通過實體來操作數(shù)據(jù)庫,核心的功能是獲取BoxStore,并在初始化上下文的時候引入實體對應的MyObjectBox對象,其完整的文件內容如下:

MyObjectBox對象會在編寫完實體對象后編譯項目自動生成,生成該對象的位置可以自行配置。

package me.weitao.app.todoobjectbox.registry;

import android.content.Context;
import android.util.Log;

import io.objectbox.BoxStore;
import io.objectbox.android.AndroidObjectBrowser;
import me.weitao.app.todoobjectbox.BuildConfig;
import me.weitao.app.todoobjectbox.app.TodoApp;
import me.weitao.app.todoobjectbox.registry.model.db.MyObjectBox;

/**
 * @author WaTony Weng
 * @date 2019/05/18 13:14
 * @copyright WaTony Weng
 */

public class ObjectBox {

    private static BoxStore boxStore;

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

        if (BuildConfig.DEBUG) {
            new AndroidObjectBrowser(boxStore).start(context.getApplicationContext());
            Log.d(TodoApp.TAG, String.format("Using ObjectBox %s (%s)",
                    BoxStore.getVersion(), BoxStore.getVersionNative()));
        }
    }

    public static BoxStore get() {
        return boxStore;
    }

}

引入Box對象

隨后,我們在Application中初始化Box對象,其完整的文件內容如下:

package me.weitao.app.todoobjectbox.app;

import android.app.Application;

import me.weitao.app.todoobjectbox.registry.ObjectBox;

/**
 * @author WaTony Weng
 * @date 2019/05/18 13:14
 * @copyright WaTony Weng
 */

public class TodoApp extends Application {

    public static final String TAG = "TodoApp";

    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化Box對象
        ObjectBox.init(this);
    }

}

使用Box操作數(shù)據(jù)

最后,我們在HomeActvity中聲明Box對象,并使用Query對象查詢數(shù)據(jù)庫記錄,或者使用put方法保存數(shù)據(jù),那我們截取Activity中的關鍵代碼如下:

package me.weitao.app.todoobjectbox.ui.home;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.InputType;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction;

import java.util.List;

import io.objectbox.Box;
import io.objectbox.query.Query;
import me.weitao.app.todoobjectbox.R;
import me.weitao.app.todoobjectbox.registry.ObjectBox;
import me.weitao.app.todoobjectbox.registry.model.db.User;
import me.weitao.app.todoobjectbox.registry.model.db.User_;

/**
 * @author WaTony Weng
 * @date 2019/05/18 13:14
 * @copyright WaTony Weng
 */

public class HomeActivity extends AppCompatActivity {

    private Box<User> userBox = ObjectBox.get().boxFor(User.class);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        final ListView listView = findViewById(R.id.list_view);

        // 讀取記錄
        Query<User> usersQuery = userBox.query().order(User_.name).build();
        List<User> users = usersQuery.find();
        HomeAdapter homeAdapter = new HomeAdapter(this, users);
        listView.setAdapter(homeAdapter);

        final HomeActivity activity = this;
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                final QMUIDialog.EditTextDialogBuilder builder = new QMUIDialog.EditTextDialogBuilder(activity);
                builder.setTitle("標題")
                        .setPlaceholder("在此輸入您的藝名")
                        .setInputType(InputType.TYPE_CLASS_TEXT)
                        .addAction("取消", new QMUIDialogAction.ActionListener() {
                            @Override
                            public void onClick(QMUIDialog dialog, int index) {
                                dialog.dismiss();
                            }
                        })
                        .addAction("確定", new QMUIDialogAction.ActionListener() {
                            @Override
                            public void onClick(QMUIDialog dialog, int index) {
                                CharSequence text = builder.getEditText().getText();
                                if (text != null && text.length() > 0) {
                                    // 保存數(shù)據(jù)
                                    User user = new User(text.toString());
                                    userBox.put(user);
                                    // 提示框
                                    Toast.makeText(activity, "您的藝名: " + text, Toast.LENGTH_SHORT).show();
                                    dialog.dismiss();
                                } else {
                                    Toast.makeText(activity, "請?zhí)钊胨嚸?, Toast.LENGTH_SHORT).show();
                                }
                            }
                        })
                        .show();
            }
        });
    }

}

我們的需求是通過彈出框輸入名稱,并保存到數(shù)據(jù)庫,在列表Item中顯示用戶名稱,如何使用ListView渲染列表數(shù)據(jù)請自行查閱相關文檔。

完成以上內容后我們就可以得到App運行的結果,其截圖如下:

運行結果 - 圖片來自簡書App

參考

個人總結和收獲

從使用的角度,我們描述了Android項目如何集成ObjectBox并給出了簡單的應用實例,從開始的理論入門到后來的構建步驟,我們一步步了解了ObjectBox的使用步驟和基本原理,我們從學以致用的角度再次認識了ObjectBox,對SQLite數(shù)據(jù)庫有了更加深刻的認識,數(shù)據(jù)庫作為一種存儲數(shù)據(jù)的媒介,我們可以充分利用它來構建穩(wěn)定安全的應用,我相信我們的目標不僅僅是構建高質量的應用,更重要的是通過我們的服務來提升客戶的使用體驗,提升效率,為客戶創(chuàng)造更大的價值網(wǎng)絡,連接更多的客戶,讓客戶成為我們產(chǎn)品或服務的受益者,也是打造我們公司口碑的核心途徑。加油吧,小伙伴們,希望大家保持學習的熱情,繼續(xù)探索這個未知的世界。若是我的文章對你有所啟發(fā),那將是我莫大的榮幸。

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容