Android数据库Realm实践

简介: Android开发中常用的数据库有5个: 1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM。支持JDBC连接,Spring以及Android平台。语法中广泛使用了注解(Annotation)。 2. SugarORM SugarORM 是 Android 平台专用ORM。提供简单易学的APIs。可以

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

官方文档


目录
相关文章
|
3月前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的海洋中,自定义控件是那片璀璨的星辰。它不仅让应用界面设计变得丰富多彩,还提升了用户体验。本文将带你探索自定义控件的核心概念、实现过程以及优化技巧,让你的应用在众多竞争者中脱颖而出。
|
10天前
|
关系型数据库 OLAP API
非“典型”向量数据库AnalyticDB PostgreSQL及RAG服务实践
本文介绍了非“典型”向量数据库AnalyticDB PostgreSQL及其RAG(检索增强生成)服务的实践应用。 AnalyticDB PostgreSQL不仅具备强大的数据分析能力,还支持向量查询、全文检索和结构化查询的融合,帮助企业高效构建和管理知识库。
51 19
|
5天前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
33 11
|
1月前
|
弹性计算 安全 关系型数据库
活动实践 | 自建数据库迁移到云数据库
通过阿里云RDS,用户可获得稳定、安全的企业级数据库服务,无需担心数据库管理与维护。该方案使用RDS确保数据库的可靠性、可用性和安全性,结合ECS和DTS服务,实现自建数据库平滑迁移到云端,支持WordPress等应用的快速部署与运行。通过一键部署模板,用户能迅速搭建ECS和RDS实例,完成数据迁移及应用上线,显著提升业务灵活性和效率。
|
23天前
|
运维 监控 Cloud Native
云原生之运维监控实践:使用 taosKeeper 与 TDinsight 实现对 时序数据库TDengine 服务的监测告警
在数字化转型的过程中,监控与告警功能的优化对保障系统的稳定运行至关重要。本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品之一,详细介绍了如何利用 TDengine、taosKeeper 和 TDinsight 实现对 TDengine 服务的状态监控与告警功能。作者通过容器化安装 TDengine 和 Grafana,演示了如何配置 Grafana 数据源、导入 TDinsight 仪表板、以及如何设置告警规则和通知策略。欢迎大家阅读。
52 0
|
1月前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
|
2月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
213 3
|
2月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
3月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
3月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
119 11