越写悦快乐之Android项目如何集成ObjectBox

ObjectBox - 图片来自App

今天的越写悦快乐为大家带来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特点

ObjectBox特点 - 图片来自App

开发环境

  • 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运行的结果,其截图如下:

运行结果 - 图片来自App

参考

  • ObjectBox
  • SQLite

个人总结和收获

从使用的角度,我们描述了Android项目如何集成ObjectBox并给出了简单的应用实例,从开始的理论入门到后来的构建步骤,我们一步步了解了ObjectBox的使用步骤和基本原理,我们从学以致用的角度再次认识了ObjectBox,对SQLite数据库有了更加深刻的认识,数据库作为一种存储数据的媒介,我们可以充分利用它来构建稳定安全的应用,我相信我们的目标不仅仅是构建高质量的应用,更重要的是通过我们的服务来提升客户的使用体验,提升效率,为客户创造更大的价值网络,连接更多的客户,让客户成为我们产品或服务的受益者,也是打造我们公司口碑的核心途径。加油吧,小伙伴们,希望大家保持学习的热情,继续探索这个未知的世界。若是我的文章对你有所启发,那将是我莫大的荣幸。

你可能感兴趣的:(越写悦快乐之Android项目如何集成ObjectBox)