Android数据库Realm实践
Android开发中常用的数据库有5个:
1. OrmLite
OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM。支持JDBC连接,Spring以及Android平台。语法中广泛使用了注解(Annotation)。
2. SugarORM
SugarORM 是 Android 平台专用ORM。提供简单易学的APIs。可以很容易的处理1对1和1对多的关系型数据,并通过3个函数save(), delete() 和 find() (或者 findById()) 来简化CRUD基本操作。
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 {
@Override
public 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 {
@PrimaryKey
private 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;
}
@Override
public 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();
}
@Override
public void insert(Person person) throws Exception {
mRealm.beginTransaction();
Person person1 = mRealm.copyToRealm(person);
mRealm.commitTransaction();
mRealm.close();
}
@Override
public List<Person> getAllPerson() throws Exception {
List<Person> mlist = null;
mlist = mRealm.where(Person.class).findAll();
mRealm.close();
return mlist;
}
@Override
public Person updatePerson(Person person) throws Exception {
mRealm.beginTransaction();
Person person1 = mRealm.copyToRealmOrUpdate(person);
mRealm.commitTransaction();
mRealm.close();
return person1;
}
@Override
public void deletePerson(String code) throws Exception {
Person person = mRealm.where(Person.class).equalTo("code",code).findFirst();
mRealm.beginTransaction();
person.deleteFromRealm();
mRealm.commitTransaction();
}
@Override
public void insertPersonAsync(final Person person) throws Exception {
//一个Realm只能在同一个线程中访问,在子线程中进行数据库操作必须重新获取Realm对象:
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public 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;
@Override
protected 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实践的更多相关文章
- 深入解析Sqlite的完美替代者,android数据库新王者——Realm
写在前面: 又到一年一度七夕虐狗节,看着大家忍受着各种朋友圈和QQ空间还有现实生活中的轮番轰炸,我实在不忍心再在这里给大家补刀,所以我觉得今天不虐狗,继续给大家分享有用的. 如果你比较关心androi ...
- Android软件安全开发实践(下)
Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题.本系列将分两期,探讨Android开发中常见的安全隐患和解决方案.第一期将从数据存储.网络通信.密码和认证策略这三个角度,带你 ...
- Android数据库之SQLite数据库
Android数据库之SQLite数据库 导出查看数据库文件 在android中,为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data ...
- Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...
- Android 数据库框架总结(转)
转自 http://blog.csdn.net/da_caoyuan/article/details/61414626 一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完 ...
- Android 数据库框架总结,总有一个适合你!
一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面.缺点:1.基于反射,效率较低(本人还没有觉得效率低):2.缺少中文翻译文档 jar包 地址:http: ...
- Kotlin Coroutines在Android中的实践
Coroutines在Android中的实践 前面两篇文章讲了协程的基础知识和协程的通信. 见: Kotlin Coroutines不复杂, 我来帮你理一理 Kotlin协程通信机制: Channel ...
- Android架构(一)MVP架构在Android中的实践
Android架构(一)MVP架构在Android中的实践 https://www.300168.com/yidong/show-2790.html 核心提示:为什么要重视程序的架构设计 对程序进 ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
随机推荐
- Matlab中数据的存储方式
简介 MATLAB提供了丰富的算法以及一个易于操作的语言,给算法研发工作者提供了很多便利.然而MATLAB在执行某些任务的时候,执行效率偏低,测试较大任务量时可能会引起较长时间的等待.未解决这个问题, ...
- cassandra 3.x官方文档(4)---分区器
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...
- 初始化nodejs+webpack+vuejs
安装nodejs 4.x 参考 curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install ...
- Vulkan的分层设计
Vulkan驱动层提供了简单高效的API.作为Vulkan API的使用者,我们要严格遵循Vulkan API的使用规则.如果我们违反了这些规则,Vulkan只会返回很少的反馈,它只会报告一部分严重和 ...
- android M Launcher之数据库实现
前面一系列文章我们分析了LauncherModel的工作过程,它会把数据绑定到桌面上.从今天开始我们来分析下Launcher的数据来源即Launcher数据库的实现. 一个完整的数据库实现都应该包括两 ...
- 说一说关于破解支付宝AR红包的事
当朋友圈的你们才开始分享支付宝AR红包的消息的时候,我已经对它动了一二三四次歪脑筋了,虽然事实证明并不是那么顺利,至今我也只在电脑前识别出5个不知道在哪里的红包,其中一个还因为定位信息不符开不了. 昨 ...
- 关于ListView中包含EditText数据复用引起异常的解决方案
概述 前几天测试提了一个bug,在ListView中添加留言信息,导致错乱的问题.实际上就是ListView需要添加一个EditText,复用导致错乱的问题,这个问题以前也遇到过.诸如,ListVie ...
- SRAM/DRAM,PROM/EPROM/EEPROM,NOR/NAND FLASH区别
SRAM/DRAM,PROM/EPROM/EEPROM,NOR/NAND FLASH区别 RAM / ROM 存储器 ROM和RAM指的都是半导体存储器,R ...
- Eclipse打jar包,资源文件的读取
最近的工作中需要将java程序打一个jar包,然后在Linux中供调用.程序中需要读取一个配置文件.遇到了三个问题.第一个是依赖的第三方Jar包打成Jar包后找不到:第二个问题是资源文件所在的文件夹打 ...
- 集合框架之Map接口
Map是将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. Map 接口提供三种collection视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序定 ...