首先使用 Realm 的一些使用要求我们还是需要先来了解
Android Studio 的使用版本必须在 1.5.1 或更高使用 JDK 7 或更高版本Android API 9 或更高(即 Android 2.3 及以上)Realm 不在 Android 支持 Java,不支持 Eclipse 作为 IDE,如果使用请转到 Android Studio
上面基本就是我们要注意的事项,大家了解即可
1)首先在工程的根目录(工程目录) build.gradle 中引入如下代码,注意是工程的 build.gradle 而不是 app 的build.gradle 由于Realm是外网,为了下载的方便,可以使用阿里的镜像文件,即在buildscript和allprojects添加如下代码
maven { url'http://maven.aliyun.com/nexus/content/groups/public/' } buildscript { repositories { maven { url'http://maven.aliyun.com/nexus/content/groups/public/' } jcenter() } dependencies { classpath "io.realm:realm-gradle-plugin:6.0.2" } } allprojects { repositories { maven { url'http://maven.aliyun.com/nexus/content/groups/public/' } google() jcenter() }可以看到 Realm 是作为一个插件来安装的
如图所示 2)在 app 的 build.gradle 中添加如下代码
apply plugin: 'realm-android'当上面的这两步做好以后,可以刷新我们的 Gradle 依赖,如果你是通过 v 0.88 以前的版本来更新,你需要去清理一下你的 Gradle 项目(./gradlew clean),来移除之前的安装,另外对 Maven 和 Ant 并不支持
使用优点 个人觉得最主要的是两点:1. 访问快,直接操作底层数据;2. 支持跨平台。什么是ORM? object relation model,对象关系映射模型,就是通过使用描述对象和数据库之间映射的元数据,来实现面向对象语言程序中的对象与关系数据库中数据的映射。简单来说,就是一个类对应数据库中的表,一个属性对应数据库中的一列,一个类的对象对应数据库中的一条记录。 基于ORM技术的框架称为ORM框架,它使得使用者更容易理解和操作数据库,但是由于中间需要转换,所以性能上比直接使用SQL语句要慢,另外还需要保存数据对应的类,所以需要更多的内存。
一个模型(java中的一个类)表示数据库中的一张表,模型中的字段表示表中的列
模型需要继承RealmObject类
模型实时、自动更新(需要获得当前线程的looper,在主线程中是满足的);操作模型就相当于直接操作数据库中底层数据
在Realm中如果增加、删除了模型或者模型的字段,需要进行数据库的迁移。这个概念类似于数据库的升级。
在application的onCreate()中使用Realm.init()初始化,所以在项目中一般要创建一个Application类,来完成一些数据的缓存。数据的迁移一般放在初始化后进行。
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Utils.init(this); Realm.init(this); RealmHelp.migration(); } }方式一
Realm realm = Realm.getDefaultInstance();方式二:先获取默认配置对象,在设置配置,最终用getInstance(config)得到对象
RealmConfiguration config = new RealmConfiguration.Builder().build(); Realm.setDefaultConfiguration(conf); Realm realm = Realm.getInstance(config);默认配置的话,会得到一个名为default.realm数据库,数据库保存地址:data/data/包名/files/default.realm。可将其导出,使用RealmStudio进行查看内容。
配置不是必须的,如果不配置,会使用默认配置;但是如果有数据库的迁移,那么是需要配置数据库,并调用migrateRealm静态方法。具体的在数据库迁移中阐述。
public static void migrateRealm(RealmConfiguration configuration) throws FileNotFoundException { migrateRealm(configuration, null); }要注意是否有数据从Realm数据库中读出 在界面类中使用Realm,一般在activity.onDestroy()中关闭,或者在finally语句块中关闭。因为从Realm数据库中获取的数据是一个模型对象的引用,如果关闭realm。之前所获取的引用将无法找到对应的数据源。
一般来说都是写一个类继承RealmObject
public class UserModel extends RealmObject { // 主键不可重复 @PrimaryKey private String phone; @Required private String password; public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }注意 所有属性修饰符可以为private、public, protected ,一般使用private,提供setter/getter方法供外部访问。支持定义普通方法。
在Realm中事务有两种,同步和异步事务,共有三种开启方式
当你退出Activity或者Fragment时,要记得使用RealmAsyncTask取消异步事务;
if(asyncTask != null && !asyncTask.isCancelled()){ asyncTask.cancel(); }Realm支持从Json文件中创建模型;需要两者对应 使用场景是从json文件中读取内容
//假如Json文件格式如下: { "musicId": "7", "name": "Nostalgic Piano", } //则可以创建一个模型类 public class MusicModel extends RealmObject{ private String musicId; private String name; //省略了setter/getter方法 } realm.beginTransaction(); realm.createObjectFromJson(MusicModel.class, musicSourceJson);//musicSourceJson为json文件的字符串。如果json文件中有几层,直接使用最外层即可。 realm.commitTransaction();如果json文件中有几层,直接使用最外层即可。
如果要插入的是多个数据,比如List,则使用insertorUpdate()
List<User> users = Arrays.asList(new User("John"), new User("Jane")); realm.beginTransaction(); realm.insert(users); realm.commitTransaction();或者有一个模型作为参数时
public void saveUser(UserModel userModel){ mRealm.beginTransaction(); mRealm.insert(userModel); mRealm.commitTransaction(); }该方法返回一个RealmQuery对象,大致意思就是得到一张表,然后在表中查询
上几步操作返回的是RealmQuery对象,调用该对象的findXxx()返回查询的结果,一个RealmResults对象,或者直接时一个对应模型对象:
findAll();//查找出所有满足条件的记录,返回一个RealmResults<> set findFirst();//查找出满足条件的第一个结果,一个 Moudle 对象 findAllAsync();//异步查找结果主要有两种形式 1.先使用findAll(),获取一个RealmResults<> 对象,再删除 userlist为RealmResults<> 对象
userList.get(0).deleteFromRealm(); userList.deleteFirstFromRealm(); //删除user表的第一条数据 userList.deleteLastFromRealm();//删除user表的最后一条数据 results.deleteAllFromRealm();//删除user表的全部数据2.直接调用类方法delete()
mRealm.delete(MusicModel.class); //直接删除一张表修改操作也是需要在事务中进行的。先查找到数据,然后由于模型是可以自动更新的,直接调用setter方法就可以更改数据了。
mRealm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { //先查找后得到User对象 User user = mRealm.where(User.class).findFirst(); user.setAge(26); } });当数据库新增了模型或者模型中的字段新增、删除时要进行数据库的迁移。一般情况下,是在刚启动APP的时候,磁盘中已经存在一个Realm数据库了,这个时候就需要进行数据库的迁移。 一般与初始化写在一起
Realm.init(this); RealmHelp.migration();迁移之前要设置一个新的配置,再调用Realm.migrateRealm(configuration),传入所设配置。
public static void migration(){ // 获取最新的配置 RealmConfiguration configuration = getRealmConf(); Realm.setDefaultConfiguration(configuration); // 需要告诉Realm 数据需要迁移 try { Realm.migrateRealm(configuration); } catch (FileNotFoundException e) { e.printStackTrace(); } }配置对象的建立需要传入一个migration类的实现对象。 故要新建一个migration实现类
public class Migration implements RealmMigration { /** * * @param realm * @param oldVersion 老的数据库版本 * @param newVersion 新的数据库版本 为RealmConfiguration.Builder().schemaVersion(1)中所传入的值 */ @Override public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { //获取可编辑的图表schema,之前版本的字段和表都已经存在schema之中 RealmSchema schema = realm.getSchema(); /** * 第一次迁移 */ /** * private String musicId; * private String name; * private String poster; * private String path; * private String author; */ if (oldVersion ==0){ // 要将新增的结构告诉数据库(包括模型和字段) // 结构的书写要从最基础的往复杂的去写。 schema.create("MusicModel") .addField("musicId",String.class) .addField("name",String.class) .addField("poster",String.class) .addField("path",String.class) .addField("author",String.class); schema.create("AlbumModel") .addField("albumId",String.class) .addField("name",String.class) .addField("poster",String.class) .addField("playNum",String.class) .addRealmListField("list",schema.get("MusicModel")); // RealmObjectSchema get(String className); schema.create("MusicSourceModel") .addRealmListField("album",schema.get("AlbumModel")) .addRealmListField("hot",schema.get("MusicModel")); oldVersion = newVersion; } } public static RealmConfiguration getRealmConf(){ return new RealmConfiguration.Builder() .schemaVersion(1)//迁移后的版本号 .migration(new Migration()) .build();使用Realm数据库的步骤:1,2,3,4,5。
在项目中配置初始化Realm并配置Realm、获取Realm的实例。对数据库进行增、删、改、查等操作。如果磁盘中已经有数据库了,在初始化后需要对数据库进行迁移在不使用时,需要关闭数据库连接。一般可以写一个帮助类来辅助完成数据库的相关操作。参考Realm数据库的使用