Android数据库Realm实践
Android开发中常用的数据库有5个:
1. OrmLite
OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM。支持JDBC连接,Spring以及Android平台。语法中广泛使用了注解(Annotation)。
2. SugarORM
3. GreenDAO
当性能很重要时(数据访问频繁),GreenDao是一个很快的解决方案,它能够支持数千条记录的CRUD每秒,和OrmLite相比,GreenDAO要快几乎4.5倍。(准确数据请自行benchmark)。
GreenDAO小于100KB,所以对于应用程序APK的大小影响很小。
4. Active Android
Active Record(活动目录)是Yii、Rails等框架中对ORM实现的典型命名方式。Active Android 帮助你以面向对象的方式来操作SQLite。
在你的项目中包含Active Android,你需要在项目的 /libs 目录下添加一个jar文件。可以从Github中获取源代码并使用Maven进行编辑。
5. Realm
Realm 是一个将可以使用的Android ORM,基于C++编写,直接运行在你的设备硬件上(不需要被解释),因此运行很快。它同时是开源跨平台的,iOS的代码可以在GitHub找到,你还可以找到Objective C以及Swift编写的Realm使用实例。
相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。
Ream提供了五种编程方式的实现。分别是Java,Objective C,Swift,React-Native,tamarin。在这里我着重介绍在Android中的使用。
大家可以直接看官方的文档,我也是在这基础的上讲解:realm使用
快速入门:
运行环境
- 目前我们还不支持 Android 以外的 Java 环境;
- Android Studio >= 1.5.1 ;
- 较新的 Android SDK 版本;
- JDK 版本 >=7;
- 我们支持 Android API 9 以上的所有版本(Android 2.3 Gingerbread 及以上)。
构建依赖关系
第一步: 在项目的 build.gradle 文件中添加如下 class path 依赖。
buildscript {repositories {jcenter()}dependencies {classpath "io.realm:realm-gradle-plugin:1.0.0"}
}
项目的 build.gradle
文件在如下位置:
第二步: 在 app 的 build.gradle 文件中应用 realm-android
插件。
apply plugin: 'realm-android'
app的 build.gradle
文件在如下位置:
如果读者使用的是maven构建项目,官方也有说明,这里我就不列出来了。
说到这里,我们已经迫不及待的想尝试下了。
1,application里面初始化
public class RealmApplication extends Application {@Overridepublic void onCreate() {super.onCreate();init();}private void init() {RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();Realm.setDefaultConfiguration(realmConfiguration);}
}
2,创建工具管理类,获取Realm实例
public class RealmUtils {private static RealmUtils instance;public final Context mContext;private String realmName = "realm_demo.realm";public RealmUtils(Context mContext) {this.mContext = mContext;}public static RealmUtils getInstance(Context context){if (instance == null) {synchronized (RealmUtils.class) {if (instance == null) {instance = new RealmUtils(context);}}}return instance;}public Realm getRealm(){Realm realm =Realm.getInstance(new RealmConfiguration.Builder(mContext).name(realmName).build());return realm;}
}
3,创建一个realmObject对象,存储object
例如,我们现在需要存储一个人(Person)对象,注意,这里的成员属性为了realm的序列化,都写成私有的
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,定义几个CRUD的方法,供其它类实现
public interface PersonDao {//插入void insert(Person person) throws Exception;//查询List<Person> getAllPerson() throws Exception;//更新Person updatePerson(Person person) throws Exception;//删除void deletePerson(String code) throws Exception;// 异步插入void insertPersonAsync(Person person) throws Exception;
}
5,对象的具体实现
public class PersonDaoImpl implements PersonDao {private Context context;private Realm mRealm;public PersonDaoImpl(Context context){mRealm = RealmUtils.getInstance(context).getRealm();}@Overridepublic void insert(Person person) throws Exception {mRealm.beginTransaction();Person person1 = mRealm.copyToRealm(person);mRealm.commitTransaction();mRealm.close();}@Overridepublic List<Person> getAllPerson() throws Exception {List<Person> mlist = null;mlist = mRealm.where(Person.class).findAll();mRealm.close();return mlist;}@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();}@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();}});//关闭Realm对象mRealm.close();}
}
6,测试
public class MainActivity extends AppCompatActivity {private Realm mRealm;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init() {Person person = new Person();person.setName("测试");person.setAge(28);person.setCode("xxxx");PersonDao dao = new PersonDaoImpl(this);try {//增加dao.insert(person);//查询全部dao.getAllPerson();//指定code删除dao.deletePerson("xxxx");//更新dao.updatePerson(person);} catch (Exception e) {e.printStackTrace();}}}
其实这和以前的用法差不多的,有点在于,realm去帮我们管理这个数据库,并且在安全上我这还没有讲到,这里只讲了基本用法,大家可以去看看官方的文档说明:
官方文档
Android数据库Realm实践相关推荐
- 关于Android数据库—realm的使用及理解
一.关于Realm的理解 之前对于数据库的使用方面,只了解过sqlite,之前自己简单的写了个短信拦截的小app,存储本地短信数据使用SqliteOpenHelper,然后编写各种增删改查的语句,还好 ...
- Android 数据库Realm入门
之前使用本地数据库都是用sqllite的,偶尔用一下LitePal,听人说Realm多么多么好使,但是我一直都没有去学习,今天有空去瞅了瞅,果然很不错. 它有以下几种特点: 1.易用:Ream 不是在 ...
- Android数据库Realm学习(一)基本使用
Realm Java文档 技术文档,开卷有益 刚刚开始用Realm,肯定是要对比着SQLite来琢磨的,说几个个人认识: 一.SQLite中的数据库名对应Realm的啥 Realm可以简单直接使用 ...
- Android数据库新王者-Realm入门教程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010046908/article/details/51629262 好长时间没有写关于Androi ...
- android开发收藏功能实现,Android使用Realm数据库如何实现App中的收藏功能
Android使用Realm数据库如何实现App中的收藏功能 发布时间:2021-05-07 11:20:34 来源:亿速云 阅读:63 作者:小新 这篇文章主要介绍了Android使用Realm数据 ...
- android收藏功能demo,Android使用Realm数据库实现App中的收藏功能(代码详解)
前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式: 使用SharedPreferences存储数据: 文件存储数据: SQLite数据 ...
- 【Android】Realm详解(Android 数据库Sqlite的完美替代者)
介绍 Realm 是一个 MVCC (多版本并发控制)数据库,由Y Combinator公司在2014年7月发布一款支持运行在手机.平板和可穿戴设备上的嵌入式数据库,目标是取代SQLite. Real ...
- 深入解析Sqlite的完美替代者,android数据库新王者——Realm
写在前面: 又到一年一度七夕虐狗节,看着大家忍受着各种朋友圈和QQ空间还有现实生活中的轮番轰炸,我实在不忍心再在这里给大家补刀,所以我觉得今天不虐狗,继续给大家分享有用的. 如果你比较关心androi ...
- Android软件安全开发实践(下)
Android软件安全开发实践(下) Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题.本系列将分两期,探讨Android开发中常见的安全隐患和解决方案.第一期将从数据存储.网 ...
最新文章
- 海思3536:kernel编译和mpp_single编译过程报错及解决方法
- 盘点:2020年PMCAFF最受欢迎的文章!
- 事务处理总结【JDBC事务|JTA事务|容器事务
- 洛谷 1226 取余运算||快速幂
- Android版本演进中的兼容性问题
- 前端学习(2160):vuecli项目初始化过程
- 查看文件时间及修改(MACN,stat命令,touch命令)
- zookeeper观察者模式设计实例
- 表格用计算机做成横版的WPS,WPS表格怎么将表格横过来图文教程
- echarts中国以及各省市地图数据
- 世界著名激励大师约翰·库缇斯的传奇人生
- 复信号在信号处理中的意义
- a标签去掉下划线,html,超链接去掉下划线
- 计算机中丢失msvcp120.dll是什么意思,win7系统玩游戏提示“msvcp120.dll丢失”怎么修复...
- JVM3--垃圾回收机制:垃圾回收概述、垃圾回收算法及分类
- ztext - 简单几行代码创建酷炫 3D 特效文字的开源 JS 库
- 常见的医学图像成像(总)
- 在PowerPoint 2010中向幻灯片添加过渡效果
- Angular 4 Http
- 虚拟服务器ip怎么配,怎么配置基于IP地址的虚拟主机
热门文章
- powerpoint技巧_几乎每个PowerPoint都烂鸡蛋
- 送你一份用Electron开发桌面应用的避坑指南【送3本书,含犀牛书】
- java 抽象类与接口理解
- Ubuntu 18.04下命令安装VMware Tools
- 使用SysPrep制作Windows2008系统映像
- Building a Space Station--POJ 2031
- iis php网站500错误原因_因为曾经错误安装过PHP5.2而导致IIS7无法正常工作,显示500错误提示,大家帮忙看看!...
- JIRA的text编辑模式
- static作用:静态变量的生存周期和作用域
- 数据结构——不相交集(并查集)