Android数据库框架ObjectBox的使用

1,721 阅读3分钟

数据库介绍:

相关链接:框架主页 文档介绍

开始

在项目中引入框架:

  1. 在项目的build.gradle引入:
dependencies {
    classpath "com.android.tools.build:gradle:7.0.2"
    classpath("io.objectbox:objectbox-gradle-plugin:3.5.1")
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

2.在app的build.gradle模块引入:

dependencies {
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    //可如果不需要浏览器调试内容可以不添加
    debugImplementation "io.objectbox:objectbox-android-objectbrowser:3.5.1"
    releaseImplementation "io.objectbox:objectbox-android:3.5.1"
}
//如果没有加入浏览器调试功能 将此选项填写在build.gradle开头的位置与id 'com.android.application'在一起
apply plugin: 'io.objectbox'

简单使用

  1. 创建表

    前言:官方的注解很强大 此实例只演示简单的注解使用,具体注解请参照 注解文档

//此注释可以将实体类设置为表名,支持自定义表名 可查询官方文档
@Entity
public class Song {
    //此为表id属性 必须有 默认不可修改切为long型自增字段,官方有支持修改的方法
    @Id
    public long id;

    public String songName;

    private String title;

    private String artist;

    private String album;

    private String uri;

    private String iconUri;

    private int duration;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getSongName() {
        return songName;
    }

    public void setSongName(String songName) {
        this.songName = songName;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getArtist() {
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }

    public String getIconUri() {
        return iconUri;
    }

    public void setIconUri(String iconUri) {
        this.iconUri = iconUri;
    }

    public int getDuration() {
        return duration;
    }

    public void setDuration(int duration) {
        this.duration = duration;
    }
}
  1. 初始化
public class ObjectBox {
    private static BoxStore boxStore;

    public static void init(Context context) {
        boxStore = MyObjectBox.builder()
                .androidContext(context.getApplicationContext())
                .build();
         //没有引入浏览器调试的不需要加,可根据debug模式自行加入判断开启调试
        new Admin(boxStore).start(context);
    }

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

在app中初始化

public class Myapp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ObjectBox.init(this);
    }
}

rebuild项目即可自动生成对应代码

增删改查:

public class MainActivity extends AppCompatActivity {
    ActivityMainBinding mainBinding;
    Box<Song> songBox;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(mainBinding.getRoot());
        songBox = ObjectBox.get().boxFor(Song.class);
        mainBinding.button.setOnClickListener(v -> {
            //  增 改是一个方法
            for (int i = 0; i < 30000; i++) {
                Song song = new Song();
                song.setAlbum("刹石狩" + i);
                song.setArtist("张三");
                song.setDuration(i);
                song.setIconUri("http:/s" + i);
                song.setTitle("ssss" + i);
                song.setSongName("离死" + i);
                songBox.put(song);
            }
        });
        mainBinding.button2.setOnClickListener(v -> {
            //删
            songBox.removeAll();
            //根据id删除
            //  songBox.remove(123455);
        });
        mainBinding.button3.setOnClickListener(v -> {
            //查
            Query<Song> query = songBox.query(Song_.songName.equal("张三")).build();
            List<Song> songs = query.find();
            //可重复使用,但一定记得关闭防止泄露
            query.close();
        });
        mainBinding.button4.setOnClickListener(v -> {

        });
    }

}

2.升级数据库

数据库的升级是自动的,无需配置版本号,这里讲一下修改表里的字段名同样先附上官方链接 修改字段名 里面包含了修改表名及字段名类型的方法

首先在你需要的字段名上添加注解:

@Uid()
private String title;

rebuild项目项目可得到类似的报错信息:

error: [ObjectBox] UID operations for entity "title": 
  [Rename] apply the current UID using @Uid(6645479796472661392L) 

主要就是获得 @Uid(6645479796472661392L) 把获得的值复制到修改的字段名注解上并修改字段名:

@Uid(6645479796472661392L)
private String titles;

rebuild项目运行即可,数据会的得到保留 其他修改方式大同小异,可查看官方文档学习

在浏览器中调试

保证加入了调试依赖并初始化后,使用命令:

adb forward tcp:8090 tcp:8090

然后在浏览器中输入链接 http://localhost:8090/ 即可访问 不过只能看 不能修改