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 文件在如下位置:Project level build.gradle file

第二步: 在 app 的 build.gradle 文件中应用 realm-android 插件。

apply plugin: 'realm-android'

app的 build.gradle 文件在如下位置:Application level build.gradle file

如果读者使用的是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去帮我们管理这个数据库,并且在安全上我这还没有讲到,这里只讲了基本用法,大家可以去看看官方的文档说明:

官方文档


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP协议中的三次握手和四次挥手(图解)

建立TCP需要三次握手才能建立&#xff0c;而断开连接则需要四次握手。整个过程如下图所示&#xff1a; 先来看看如何建立连接的。 首先Client端发送连接请求报文&#xff0c;Server段接受连接后回复ACK报文&#xff0c;并为这次连接分配资源。Client端接收到ACK报文后也向Serv…

java 矩阵题目_java练习本(原每日一练)(20190517)

名人名言昨日翻译“You will face many defeats in life, but never let yourself be defeated.”——Maya Angelou“你将在生活中面临许多失败&#xff0c;但决不让自己被打败。”——玛雅安吉罗今日名言“May you live all the days of your life.”——Jonathan Swift2019.0…

(转)直接拿来用!最火的iOS开源项目(一)

2019独角兽企业重金招聘Python工程师标准>>> 1. AFNetworking 在众多iOS开源项目中&#xff0c;AFNetworking可以称得上是最受开发者欢迎的库项目。AFNetworking是一个轻量级的iOS、Mac OS X网络通信类库&#xff0c;现在是GitHub上第三大Objective-C库。它建立在N…

.NET+Sqlite如何支持加密

点击上方蓝字关注我们.NETSqlite如何支持加密SqliteSQLite 来源于公共领域 SQLite Is Public Domain、确保代码不会受到任何专有或许可内容的污染&#xff0c;没有任何来自互联网上的未知来源复制。即全是原创的。虽然是免费的&#xff0c;无需许可证&#xff0c;可用于任何目的…

linux之scp命令

svn 删除所有的 .svn文件 find . -name .svn -type d -exec rm -fr {} \; linux之cp/scp命令&#xff0b;scp命令详解 名称&#xff1a;cp 使用权限&#xff1a;所有使用者 使用方式&#xff1a; cp [options] source dest cp [options] source... directory 说明&#xff1a…

裸奔、抽烟、凡尔赛,原来数学家玩得这么野……

全世界只有3.14 % 的人关注了爆炸吧知识六个数学家一部数学史假如宇宙真的由神明设计那他一定是个数学家数学就是他描绘自然的语言数学的重要性已经不用多说但是很多人仍觉得数学是高冷的女神其实数学神奇却并不神秘高贵却并不高冷因为有一群智者早就用他们的智慧和精力将那些晦…

foreach循环符合就不往下走了_柴油发电机组冷却液循环故障解决方法

点击上方蓝字了解更多精彩柴油发电机组冷却液循环故障是发电机组的常见故障之一&#xff01;下面给大家介绍一下针对循环故障做出的排查解决。1、柴油发电机组水泵故障。首先我们要先检查水泵作用是否良好&#xff0c;要是发现水泵传动齿轴磨损过限时&#xff0c;说明水泵已失去…

java web移植 遇到Project facet Java version 1.7 is not supported

2019独角兽企业重金招聘Python工程师标准>>> 在移植eclipse项目时&#xff0c;如果遇到 “Project facet Java version 1.7 is not supported.” 项目中的jdk1.7不支持。说明项目是其他版本jdk编译的&#xff0c;在eclipse里运行时会报版本不支持。 解决办法: 法1&a…

c#winform自定义窗体(含源码)

第一步&#xff1a;首先引用DLL再窗体中继承DevComponents.DotNetBar.OfficeFormpublic partial class MainForm : DevComponents.DotNetBar.OfficeForm初始化程序中添加 this.EnableGlass false;public MainForm(){this.EnableGlass false;InitializeComponent();}第二步&a…

如何巧妙拒绝老同学借钱?哈哈哈哈哈......

1 别说&#xff0c;还挺像...cr&#xff1a;豆瓣银河系漫游1999▼2 奇奇怪怪的赚钱方式又增加了▼3 教你如何做到边吃边睡...▼4 方法二还挺有道理...▼5 总是在不该清醒的时候清醒▼6 多令人怀念&#xff01;▼7 对不起&#xff0c;我太菜了▼8 哈哈哈哈哈▼8 数学能有…

协同过滤

在现今的推荐技术和算法中&#xff0c;最被大家广泛认可和采用的就是基于协同过滤的推荐方法。本文将带你深入了解协同过滤的秘密。 1 什么是协同过滤 协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称 CF)&#xff0c;首先想一个简…

微信改成右滑删除_手机文件数据恢复,怎样恢复已过期的微信附件呢?

手机文件数据恢复&#xff0c;怎样恢复已过期的微信附件呢&#xff1f;我们在恢复手机删除的文件之前&#xff0c;很多人都想知道&#xff0c;为什么自己的文件删除了可以被恢复&#xff0c;既然能被恢复&#xff0c;是我彻底删除不了手机的文件吗&#xff1f;文件真的消失了吗…

【.NET 遇上 GraphQL】使用 Hot Chocolate 构建 GraphQL 服务

Hot Chocolate 是 .NET 平台下的一个开源组件库, 您可以使用它创建 GraphQL 服务, 它消除了构建成熟的 GraphQL 服务的复杂性, Hot Chocolate 可以连接任何服务或数据源&#xff0c;并创建一个有凝聚力的服务&#xff0c;为您的消费者提供统一的 API。在本文中, 我会在 .NET 应…

PHP命令注入***

PHP命令注入***漏洞是PHP应用程序中常见的脚本漏洞之一&#xff0c;国内著名的Web应用程序Discuz!、DedeCMS等都曾经存在过该类型漏洞。本文描述了常见的PHP命令注入***漏洞存在形式和利用方法&#xff0c;结合漏洞实例进行分析和漏洞利用&#xff0c;并针对如何防范PHP命令注入…

电脑用户名_仁霸下料优化软件如何找回密码、更换绑定电脑?

今天有客户来找我们管件管家&#xff0c;说注册密码忘记了&#xff0c;登陆不上软件问怎么找回&#xff1b;还有个用户因为换了电脑&#xff0c;需要将账号移到新电脑上。此前我们以玻璃软件为例说了如何下载以及在哪里找到下载文件的位置&#xff0c;这期还是以玻璃软件为例讲…

linux之universal usb installer安装ubuntu

Universal-USB-Installer这个工具是用来制作U盘启动盘的&#xff0c;下面以制作Ubuntu版本Linux系统的U盘启动盘为例&#xff0c;方法如下&#xff1a; 1、安装Universal USB Installer软件&#xff0c;打开后&#xff0c;点击“Browse”按钮浏览下载到本地磁盘的Ubuntu系统ISO…

Android系统的体系结构、开发语言及源码结构

整理自android系统体系结构 Android 是google公司针对手机开发的一个平台&#xff0c;并公布了其中大部分代码&#xff0c;其大部分应用程序都是用JAVA开发的&#xff0c;毕竟它是商业性的产品嘛&#xff0c;有所保留也是理所 当然的。对于搞嵌入式linux开发的人来说我们可以从…

Blazor系列终结!

终于完结Blazor系列转载终结啦&#xff0c;其实站长在25号时就已完成转载&#xff0c;并同步在Dotnet9网站&#xff08;https://dotnet9.com&#xff09;发布&#xff0c;并创建了一个专辑《大家一起学Blazor》&#xff0c;大家可随时在网站浏览。Dotnet9网站同步转载感受 ASP.…