今天的越写悦快乐为大家带来Android项目如何集成ObjectBox的文章。做过Android开发的小伙伴都知道,我们在存储一些数据时不可避免地和SQLite打交道,那如何快速安全地操作数据库,成为了我们开发工程师的迫切需求,本文就从使用的角度为大家分享如何在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数据库操作的利器,并支持OOP操作,也就是说您可以像操作对象那样,通过Box
来高效地操作数据库,目前它可以支持Android、macOS、Windows等。
ObjectBox特点
开发环境
- 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'
创建实体并配置注解
然后,我们创建用户对象,并配置注解声明该实体,配置主键生成方式等,其完整的文件内容如下:
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;
}
}
创建Box对象
然后,我们创建Box对象,该对象通过实体来操作数据库,核心的功能是获取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操作数据
最后,我们在HomeActvity
中声明Box对象,并使用Query
对象查询数据库记录,或者使用put
方法保存数据,那我们截取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 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 usersQuery = userBox.query().order(User_.name).build();
List 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) {
// 保存数据
User user = new User(text.toString());
userBox.put(user);
// 提示框
Toast.makeText(activity, "您的艺名: " + text, Toast.LENGTH_SHORT).show();
dialog.dismiss();
} else {
Toast.makeText(activity, "请填入艺名", Toast.LENGTH_SHORT).show();
}
}
})
.show();
}
});
}
}
我们的需求是通过弹出框输入名称,并保存到数据库,在列表Item中显示用户名称,如何使用ListView渲染列表数据请自行查阅相关文档。
完成以上内容后我们就可以得到App运行的结果,其截图如下:
参考
- ObjectBox
- SQLite
个人总结和收获
从使用的角度,我们描述了Android项目如何集成ObjectBox并给出了简单的应用实例,从开始的理论入门到后来的构建步骤,我们一步步了解了ObjectBox的使用步骤和基本原理,我们从学以致用的角度再次认识了ObjectBox
,对SQLite数据库有了更加深刻的认识,数据库作为一种存储数据的媒介,我们可以充分利用它来构建稳定安全的应用,我相信我们的目标不仅仅是构建高质量的应用,更重要的是通过我们的服务来提升客户的使用体验,提升效率,为客户创造更大的价值网络,连接更多的客户,让客户成为我们产品或服务的受益者,也是打造我们公司口碑的核心途径。加油吧,小伙伴们,希望大家保持学习的热情,继续探索这个未知的世界。若是我的文章对你有所启发,那将是我莫大的荣幸。