
今天的越寫悅快樂為大家?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特點

開發(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運行的結果,其截圖如下:

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