版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/51629262

好长时间没有写关于Android方面的学习文章了,今天给大家带来的是堪称是一个可以替代SQLite以及ORMlibraries的轻量级数据库—Realm移动端数据库。

相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。

Ream提供了五种编程方式的实现。分别是Java,Objective C,Swift,React-Native,tamarin。在这里我着重介绍在Android中的使用。后面也会介绍在Swift中得使用。

1.先介绍一下打开数据Realm数据库的工具:Realm Browser可视化工具

Realm资源包中包含了一个很有用的实用工具,可以帮助我们更好地管理Realm数据库,那就是Realm Browser。Realm Browser可以让您轻松地读写Realm数据库(以.realm结尾),因此我们无需头疼如何去查看Realm专有数据库的逻辑结构以及其中的数据,可视化的操作就如同SQLite的其他数据库查看工具一样,十分简单、易用(虽然Realm Browser的功能还十分简陋,真的只能读写而已)。

2.Realm支持的数据类型

  • 支持基本数据结构:boolean, byte, short, ìnt, long, float, double, String, Dateand byte[]
  • 支持JSON等复杂的数据类型

3.Realm的官方名词

  • Realm:Realm是框架的核心所在,是我们构建数据库的访问点,使用建造者模式构建对象。
  • RealmObject:这是我们自定义的realm数据模型。创建数据模型的行为将会影响到数据库的结构。要创建一个数据模型,我们只需要继承RealmObject,然后设计我们想要存储的属性即可。
  • RealmQuery(查询):要在数据库中检索信息,我们需要用到“检索”操作。如果需要检索更复杂的数据,那么还可以使用复合查询以及结果排序等等操作。
  • RealmResults:这个类是执行任何查询请求后所返回的类,其中包含了一系列的Object对象。和List类似,我们可以用下标语法来对其进行访问,并且还可以决定它们之间的关系。不仅如此,它还拥有许多更强大的功能,包括排序、查找等等操作。

4、Realm在Android中的使用

4.1在项目的build.grade中配置下载库文件

在本案例中我使用的最新版本的1.0.0版本。

apply plugin: 'realm-android'buildscript {repositories {jcenter()maven { url 'https://jitpack.io' }}dependencies {classpath "io.realm:realm-gradle-plugin:1.0.0"}
}

4.2创建数据库,获取去Realm

package com.lidong.demo.realm;import android.content.Context;import io.realm.Realm;
import io.realm.RealmConfiguration;
/**
*
*@className:RealmUtil
*@desc:RealmUtil工具类
*@author:lidong
*@datetime:16/6/10 下午9:55*/
public class RealmUtil {private static  RealmUtil sIntance;public final Context mContext;private String realmName = "realm_demo.realm";public RealmUtil(Context mContext) {this.mContext = mContext;}/*** 双检索单例* @param context* @return*/public  static  RealmUtil getIntance(Context context){if (sIntance == null) {synchronized (RealmUtil.class) {if (sIntance == null) {sIntance = new RealmUtil(context);}}}return  sIntance;}/*** 获取realm对象* @return*/public  Realm getRealm(){
Realm realm =Realm.getInstancenew RealmConfiguration.Builder(mContext)                             .name(realmName) .build());return  realm;}
}

4.3创建一个RealmObject

只要继承了RealmObject类,任意JavaBean都能存储在Realm中。必须有一个默认构造器,成员变量有相应的getter/setter方法

package com.lidong.demo.realm;import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;/*** Person*/
public class Person extends RealmObject {@PrimaryKeyprivate String code;//编号private String name;//姓名private int age;//年龄public Person() {}public Person(int age, String code, String name) {this.age = age;this.code = code;this.name = name;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"code='" + code + '\'' +", name='" + name + '\'' +", age=" + age +'}';}
}

4.4对数据Person进行增删改查操作

PersonDao.java

package com.lidong.demo.realm;import java.util.List;/*** Created by lidong on 16/6/9.*/
public interface PersonDao {/*** 插入Person* @param person* @throws Exception*/void insert(Person person)throws  Exception;/*** 获取所有的用户* @return* @throws Exception*/List<Person> getAllPerson()throws Exception;/***  更新用户* @throws Exception*/Person  updatePerson(Person person)throws Exception;/*** 删除用户* @param code* @throws Exception*/void   deletePerson(String code)throws Exception;/*** 异步插入Person* @param person* @throws Exception*/void insertPersonAsync(Person person)throws  Exception;}

PersonDaoImp.java

package com.lidong.demo.realm;import android.content.Context;import java.util.List;import io.realm.Realm;/**
*
*@className:PersonDaoImpl
*@desc:
*@author:lidong
*@datetime:16/6/10 下午10:01*/
public class PersonDaoImpl implements PersonDao {private Context context;private Realm mRealm;public PersonDaoImpl(Context context){mRealm = RealmUtil.getIntance(context).getRealm();}/*** @同步插入用户* @param person* @throws Exception*/@Overridepublic void insert(Person person) throws Exception {mRealm.beginTransaction();Person person1 = mRealm.copyToRealm(person);mRealm.commitTransaction();mRealm.close();}/*** 获取所有的用户** @return* @throws Exception*/@Overridepublic List<Person> getAllPerson() throws Exception {List<Person> mlist = null;mlist =  mRealm.where(Person.class).findAll();mRealm.close();return mlist;}/*** @param person* @throws Exception*/@Overridepublic Person updatePerson(Person person) throws Exception {mRealm.beginTransaction();Person person1 = mRealm.copyToRealmOrUpdate(person);mRealm.commitTransaction();mRealm.close();return  person1;}@Overridepublic void deletePerson(String code) throws Exception {Person person = mRealm.where(Person.class).equalTo("code",code).findFirst();mRealm.beginTransaction();person.deleteFromRealm();mRealm.commitTransaction();}/*** 异步插入Person** @param person* @throws Exception*/@Overridepublic void insertPersonAsync(final Person person) throws Exception {//一个Realm只能在同一个线程中访问,在子线程中进行数据库操作必须重新获取Realm对象:mRealm.executeTransaction(new Realm.Transaction() {@Overridepublic void execute(Realm realm) {realm.beginTransaction();Person person1 = realm.copyToRealm(person);realm.commitTransaction();realm.close();//并且要记得在离开线程时要关闭 realm.close();  }});mRealm.close();//关闭Realm对象}
}

4.5在Activity中简单调用

package com.lidong.demo.realm;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;import com.lidong.demo.R;import java.util.List;import io.realm.Realm;public class DemoRealmActivity extends AppCompatActivity {static final String TAG = DemoRealmActivity.class.getSimpleName();Realm  mRealm;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_demo_realm);//         mRealm= RealmUtil.getIntance(this).getRealm();
//
//
//        mRealm.executeTransaction(new Realm.Transaction() {//            @Override
//            public void execute(Realm realm) {//                Person person = realm.createObject(Person.class);
//                person.setName("李东");
//                person.setAge(24);
//                person.setCode(UUID.randomUUID().toString());
//            }
//        });Person person = new Person();person.setName("李东1");person.setAge(28);person.setCode("6e56d3aa-7119-429e-8c59-7ad8241e838d");PersonDao dao = new PersonDaoImpl(this);
//        try {//            dao.insert(person);
//        } catch (Exception e) {//            e.printStackTrace();
//        }try {dao.deletePerson("6e56d3aa-7119-429e-8c59-7ad8241e838d");} catch (Exception e) {e.printStackTrace();}try {List<Person> persons = dao.getAllPerson();Log.d(TAG, "onCreate: "+persons);} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void onDestroy() {super.onDestroy();}
}

总结:Android中使用Realm数据库基本上就这几点步骤,这是个入门,更加复杂的操作,我在后面会慢慢的深入。

代码地址

Android数据库新王者-Realm入门教程相关推荐

  1. 深入解析Sqlite的完美替代者,android数据库新王者——Realm

    写在前面: 又到一年一度七夕虐狗节,看着大家忍受着各种朋友圈和QQ空间还有现实生活中的轮番轰炸,我实在不忍心再在这里给大家补刀,所以我觉得今天不虐狗,继续给大家分享有用的. 如果你比较关心androi ...

  2. Android Studio 3.5.2 入门教程(浓缩版)

    到http://www.android-studio.org/下载安装包进行安装,安装完成后启动程序: 选择是否import(导入)之前的配置,我们是首次安装运行,不改变默认,点击"OK&q ...

  3. android 新的布局,Android新布局方式ConstraintLayout快速入门教程

    前言 在android开发中,我们通常是手写布局,很少会用拖动来写布局,虽然constraintlayout在i/o上以拖动来展现了各种功能,我估计在以后开发中,程序员还是习惯手撸代码. 我自己试着拖 ...

  4. 数据库及SQL语句入门教程

    目录 一.数据库的基本概念 1.1 数据库的英文单词 1.2 什么是数据库? 1.3 数据库的特点 1.4 数据库常用软件 二.MySQL数据库软件 2.1 如何卸载? 2.2 配置 三.SQL 3. ...

  5. android studio 安卓制作app入门教程,Android开发:AndroidStudio安卓APP入门教程

    轻松学会Android,让工作主动找你 即使你是零基础,也能掌握真正的技术 低风险.低投入,随时随地学习 全方位的技术支持:高清视频.源码.资料.技术指导 课程目录 章节1:初识篇 课时1开发环境搭建 ...

  6. 从PC到Mac —— 写给Mac新新手的入门教程

    原地址:http://bbs.feng.com/read-htm-tid-11190856.html点击打开链接 Mac, Macintosh的简称,是Apple公司出品的计算机的操作系统的名称,现在 ...

  7. 2021年最新整理, C++ 学习资料,含C++ 11 / 14 / 17 / 20 / 23 新特性、入门教程、推荐书籍、优质文章、学习笔记、教学视频等

  8. Android Studio 3.4.1(3.5.2)入门教程( 2019.12.14修订)

    Android Studio 3.4.1入门教程 本文对自学者遇到的情况进行比较细致的讲解,解决初学者入门难,得不到成功体验,不能深入的问题.入了门,才能谈得上深入学习,特此写本文,供新手参考,以便新 ...

  9. Android数据库框架总结

    本文转自:http://blog.csdn.net/da_caoyuan/article/details/61414626 一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封 ...

最新文章

  1. php phppowerpoint 生成表格_php之EXCEL导出代码生成器的实现思路
  2. Android开发过程中内存泄露检测
  3. string类的各种函数用法
  4. 如何使用jstack分析线程状态
  5. supersocket缓冲区_使用Socket从Client传输文件到Server对文件缓冲区大小有限制么?...
  6. mysql关联表分页查询_MySQL一对多分页查询-主表关联表条件查询问题
  7. 数据结构与算法之循环队列的操作
  8. oracle巡检项,Oracle数据库巡检参考项
  9. 虚拟机win 7 上安装VWware Tools提示升级系统到SP1
  10. PostgreSQL中文手册
  11. 编程实现恩格玛加密机(C++)
  12. cst自学教材_CST Microwave Studio入门与应用基础课程
  13. 用友U8案例教程成本报表
  14. 【表格设置】HTML中合并单元格,对列组合应用样式,适应各浏览器的内容换行
  15. 平均年薪50万,学好python程序员到底有多吃香?
  16. DEFCON 23|专门抓捕黑客的人
  17. ma5822是什么设备_华为MA5821-24 - AC远端光接入ONU光纤设备24口 全新原装
  18. 笨办法学python 习题46-windows
  19. 好用并强大的图片插件:PhotoSwipe.js
  20. 2021计算机保研|人大高瓴、自动化所、人大信院、南开、天大

热门文章

  1. [转] Firefox 24.0中的插件激活提示
  2. 微软将Bing变开放平台 同谷歌争夺开发者
  3. 海量Web日志分析 用Hadoop提取KPI统计指标
  4. MapReduce提交作业常见问题
  5. 读芯片信息出错3_数字传感器的电路设计,跟着芯片哥学你也会
  6. UVA10881蚂蚁
  7. 交换两个数不引入第三个变量
  8. 【Groovy】Groovy 动态语言特性 ( Groovy 中的变量自动类型推断以及动态调用 | Java 中必须为变量指定其类型 )
  9. 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( No module named ‘numpy‘ )
  10. 【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )