Android数据库新王者-Realm入门教程

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/51629262 好长时间没有写关于Android方面的学习文章了,今天给大家带来的是堪称是一个可以替代SQLite以及ORMlibraries的轻量级数据库—Realm移动端数据库。
版权声明:本文为博主原创文章,未经博主允许不得转载。 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 {
    @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.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
     */
    @Override
    public void insert(Person person) throws Exception {
        mRealm.beginTransaction();
        Person person1 = mRealm.copyToRealm(person);
        mRealm.commitTransaction();
        mRealm.close();
    }

    /**
     * 获取所有的用户
     *
     * @return
     * @throws Exception
     */
    @Override
    public List<Person> getAllPerson() throws Exception {
        List<Person> mlist = null;
        mlist =  mRealm.where(Person.class).findAll();
        mRealm.close();
        return mlist;
    }

    /**
     * @param person
     * @throws Exception
     */
    @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();
    }

    /**
     * 异步插入Person
     *
     * @param person
     * @throws Exception
     */
    @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();  
            }
        });
        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;
    @Override
    protected 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();
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

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

代码地址

相关文章
|
7月前
|
网络协议 关系型数据库 MySQL
如何实现无公网ip远程访问本地安卓Termux部署的MySQL数据库【内网穿透】
如何实现无公网ip远程访问本地安卓Termux部署的MySQL数据库【内网穿透】
|
6月前
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
292 2
|
6月前
|
存储 关系型数据库 MySQL
数据库MySQL——从0到1入门教程
数据库MySQL——从0到1入门教程
250 0
|
6月前
|
SQL 存储 数据库
48. 【Android教程】数据库:SQLite 的使用
48. 【Android教程】数据库:SQLite 的使用
116 1
|
6月前
|
存储 缓存 数据库
Android之SQLite数据库使用详解
Android之SQLite数据库使用详解
|
6月前
|
存储 数据库 Android开发
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
224 0
|
7月前
|
数据库 Android开发
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
|
7月前
|
存储 SQL 关系型数据库
MySql入门教程--MySQL数据库基础操作
MySql入门教程--MySQL数据库基础操作
|
5天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
23 3
|
5天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
28 3