Android官方ORM数据库Room技术解决方案简介(一)

简介: 是时候该忘记Android SQLite了!Android官方ORM数据库Room技术解决方案简介(一)Android的Romm是Android官方整合出来的一揽子ORM数据库解决方案。
是时候该忘记Android SQLite了!Android官方ORM数据库Room技术解决方案简介(一)

Android的Romm是Android官方整合出来的一揽子ORM数据库解决方案。Android Room和历史上的ORM数据库如Android ORMLite(见附录文章1,2),Android greenDao等等,有诸多相同的设计思想和理念,但Android Room同时吸收众家ORM数据库之长,有自己新的创新和改进。我将分开写若干篇文章,逐点介绍Android官方的ORM数据库技术解决方案:Room。
(一)使用Android Room,首先要在gradle添加引用,我是基于room的version 1.0.0:
    implementation 'android.arch.persistence.room:runtime:1.0.0'
    annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'


(二)和其他ORM数据库相似,Android Room需要先建立数据库表和Java对象的模型,User.java:
package zhangphil.demo;

import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;

/**
 * Created by Phil on 2017/11/22.
 */

@Entity(tableName = "user_table")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;

    @ColumnInfo(name = "userName")
    public String name;

    @ColumnInfo(name = "userAge")
    public int age;

    @ColumnInfo(name = "updateTime")
    public long updateTime;
}

注解@Entity告诉Android Room,该User类将是一个数据库中的表。tableName如果开发者不自定义,那么Android系统默认将使用类名作为数据库中的表名。本例中的User,指定了表名为“user_table”,开发者可以根据自己情况自命名。

@PrimaryKey标注该字段是表中的主键,可根据该主键进行数据库的基本增删改查等等这些操作。当设置autoGenerate = true后,该主键将自增长。@ColumnInfo注解后面跟着的name,标明定义的Java变量将作为表中的一列。比如User中的

    @ColumnInfo(name = "userName")
    public String name;
那么数据库中表的一列userName中存储的数据就是name。
(三)构建针对User的Dao。UserDao.java:
package zhangphil.demo;

import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Delete;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.OnConflictStrategy;
import android.arch.persistence.room.Query;
import android.arch.persistence.room.Update;

import java.util.List;

/**
 * Created by Phil on 2017/11/22.
 */

@Dao
public interface UserDao {
    /**
     * 查询
     *
     * @return
     */
    @Query("SELECT * FROM user_table")
    public List<User> getAllUsers();

    /**
     * 添加
     *
     * @param users
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    public void insertUser(User... users);

    /**
     * 更新
     *
     * @param users
     */
    @Update
    public void updateUser(User... users);

    /**
     * 删除
     *
     * @param users
     */
    @Delete
    public void deleteUser(User... users);
}

@Dao注解标明该Java类是一个Android Room中的Dao对象。Android Room中的Dao,可以以接口interface形式定义。Android Room中的查询以SQL标准语句定义。比如在UserDao中的定义的:

    /**
     * 查询
     *
     * @return
     */
    @Query("SELECT * FROM user_table")
    public List<User> getAllUsers();
该SQL语句将从我之前建立的数据块表“user_table”中,查询出所有的内容,然后返回一个集合。其他关于数据库的操作如增加(@Insert),删除(@Delete),修改(更新,@Update),均以注解标明。这些基本操作可以按照User中定义的@PrimaryKey主键操作。

(四)构造数据库。
这一步在Android Room技术中基本上是规范化的代码,写法比较规矩,建立UserDatabase.java:
package zhangphil.demo;

import android.arch.persistence.room.Database;
import android.arch.persistence.room.RoomDatabase;

/**
 * Created by Phil on 2017/11/22.
 */

@Database(entities = {User.class}, version = 1)
public abstract  class UserDatabase  extends RoomDatabase {
    public abstract UserDao getUserDao();
}
UserDatabase最重要的功能是提供给开发者各种Dao。开发者获得Dao后,就可以像操作基本Java对象实例一样操作Android Room数据中数据。
最终的代码结构如图:



(五)在MainActivity.java中测试我写的Android Room。注意涉及到数据库操作,要放到后台线程中运行。MainActivity.java:

package zhangphil.demo;

import android.arch.persistence.room.Room;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    private String TAG = "输出";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new Thread(new Runnable() {
            @Override
            public void run() {
                databaseOperation();
            }
        }).start();
    }

    private void databaseOperation() {
        UserDatabase mUserDatabase = Room.databaseBuilder(getApplicationContext(), UserDatabase.class, "users").build();
        UserDao mUserDao = mUserDatabase.getUserDao();

        //写数据库
        Log.d(TAG, "开始写入数据...");
        writeDatabase(mUserDao, "张三", 18);
        writeDatabase(mUserDao, "李四", 19);
        Log.d(TAG, "写入数据库完毕.");

        //读数据库
        Log.d(TAG, "第1次读数据库");
        readDatabase(mUserDao);

        //更新数据库
        updateUser(mUserDao);

        //读数据库
        Log.d(TAG, "第2次读数据库");
        readDatabase(mUserDao);

        //删除数据,根据主键id
        deleteUser(mUserDao, 1);

        //读数据库
        Log.d(TAG, "第3次读数据库");
        readDatabase(mUserDao);

        Log.d(TAG, "========================");
        Log.d(TAG, "本轮数据库操作事务全部结束");
        Log.d(TAG, "========================");
    }

    private void readDatabase(UserDao dao) {
        Log.d(TAG, "读数据库...");
        List<User> users = dao.getAllUsers();
        for (User u : users) {
            Log.d(TAG, u.id + "," + u.name + "," + u.age + "," + u.updateTime);
        }
        Log.d(TAG, "读数据库完毕.");
    }

    private void writeDatabase(UserDao dao, String name, int age) {
        User user = new User();
        user.name = name;
        user.age = age;
        user.updateTime = System.currentTimeMillis();
        dao.insertUser(user);
    }

    private void updateUser(UserDao dao) {
        Log.d(TAG, "更新数据库...");
        User u = new User();
        u.id = 2;
        u.name = "赵五";
        u.age = 20;
        u.updateTime = System.currentTimeMillis();
        dao.updateUser(u);
        Log.d(TAG, "更新数据库完毕.");
    }

    private void deleteUser(UserDao dao, int id) {
        Log.d(TAG, "删除数据库...");
        User u = new User();
        u.id = id;
        dao.deleteUser(u);
        Log.d(TAG, "删除数据库完毕.");
    }
}

MainActivity.java实现基本的功能,在数据库中添加写入两条数据条目。然后在第一次读数据库操作中,从数据中读出来观察是否已经写进去。
接着更新数据库,根据User的PrimaryKey主键id更新,我把数据库中主键id为2的数据行更新。再次第2次读数据库,验证我的更新操作是否成功。
然后再根据主键删除id=1的数据库数据行,第3次读数据库,验证数据库删除的操作。代码运行后的logcat输出:
11-23 10:49:22.631 19616-19641/zhangphil.demo D/输出: 开始写入数据...
11-23 10:49:22.688 19616-19641/zhangphil.demo D/输出: 写入数据库完毕.
11-23 10:49:22.688 19616-19641/zhangphil.demo D/输出: 第1次读数据库
11-23 10:49:22.688 19616-19641/zhangphil.demo D/输出: 读数据库...
11-23 10:49:22.689 19616-19641/zhangphil.demo D/输出: 1,张三,18,1511405362631
11-23 10:49:22.689 19616-19641/zhangphil.demo D/输出: 2,李四,19,1511405362674
11-23 10:49:22.689 19616-19641/zhangphil.demo D/输出: 读数据库完毕.
11-23 10:49:22.689 19616-19641/zhangphil.demo D/输出: 更新数据库...
11-23 10:49:22.692 19616-19641/zhangphil.demo D/输出: 更新数据库完毕.
11-23 10:49:22.692 19616-19641/zhangphil.demo D/输出: 第2次读数据库
11-23 10:49:22.692 19616-19641/zhangphil.demo D/输出: 读数据库...
11-23 10:49:22.693 19616-19641/zhangphil.demo D/输出: 1,张三,18,1511405362631
11-23 10:49:22.693 19616-19641/zhangphil.demo D/输出: 2,赵五,20,1511405362689
11-23 10:49:22.693 19616-19641/zhangphil.demo D/输出: 读数据库完毕.
11-23 10:49:22.693 19616-19641/zhangphil.demo D/输出: 删除数据库...
11-23 10:49:22.696 19616-19641/zhangphil.demo D/输出: 删除数据库完毕.
11-23 10:49:22.696 19616-19641/zhangphil.demo D/输出: 第3次读数据库
11-23 10:49:22.696 19616-19641/zhangphil.demo D/输出: 读数据库...
11-23 10:49:22.698 19616-19641/zhangphil.demo D/输出: 2,赵五,20,1511405362689
11-23 10:49:22.698 19616-19641/zhangphil.demo D/输出: 读数据库完毕.
11-23 10:49:22.698 19616-19641/zhangphil.demo D/输出: ========================
11-23 10:49:22.698 19616-19641/zhangphil.demo D/输出: 本轮数据库操作事务全部结束
11-23 10:49:22.699 19616-19641/zhangphil.demo D/输出: ========================


附录:
1,《Android ORMLite数据库简介》链接:http://blog.csdn.net/zhangphil/article/details/46878075 
2,《Android ORMLite ForeignCollection关联外部集合》链接:http://blog.csdn.net/zhangphil/article/details/46891021 
相关文章
|
10天前
|
关系型数据库 MySQL 数据库
ORM对mysql数据库中数据进行操作报错解决
ORM对mysql数据库中数据进行操作报错解决
35 2
|
2月前
|
运维 数据库 数据库管理
云数据库问题之阿里云在运营商领域数据库替换的整体解决方案要如何实现
云数据库问题之阿里云在运营商领域数据库替换的整体解决方案要如何实现
|
2月前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
|
21天前
|
存储 关系型数据库 MySQL
【阿里规约】阿里开发手册解读——数据库和ORM篇
从命名规范、建表规范、查询规范、索引规范、操作规范等角度出发,详细阐述MySQL数据库使用过程中所需要遵循的各种规范。
【阿里规约】阿里开发手册解读——数据库和ORM篇
|
2月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
37 1
|
2月前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
66 0
|
2月前
|
数据库 Java 数据库连接
玩转Play Framework的秘密武器:Ebean ORM带你解锁高效数据库操作新姿势,让你的代码从此飞起来!
【8月更文挑战第31天】Play Framework 以其简洁的 API 和高效开发体验著称,Ebean ORM 则是其推荐的对象关系映射(ORM)工具之一。Ebean 可将 Java 对象轻松映射到数据库表,简化数据库交互。本文将指导你在 Play Framework 中使用 Ebean ORM 进行数据库操作,涵盖项目创建、依赖引入、数据库配置、模型定义及 CRUD 操作,并通过示例代码展示实现过程。通过这些步骤,你将学会如何利用 Ebean 的丰富功能,如事务管理、查询构建等,提升 Web 应用的数据库交互能力。
29 0
|
2月前
|
数据库 测试技术 开发者
Play Framework的测试魔法:让代码在舞台上翩翩起舞,确保应用质量的幕后英雄!
【8月更文挑战第31天】Play Framework不仅以其高效开发与部署流程著称,还内置了强大的测试工具,提供全面的测试支持,确保应用高质量和稳定性。本文将详细介绍如何在Play Framework中进行单元测试和集成测试,涵盖`WithApplication`、`WithServer`及`WithDatabase`等类的使用方法,并通过示例代码手把手教你如何利用Play的测试框架。无论是单元测试、集成测试还是数据库操作测试,Play Framework均能轻松应对,助你提升应用质量和开发效率。
29 0
|
2月前
|
SQL 关系型数据库 数据库连接
Entity Framework Core 入门教程来袭!快速上手强大的 ORM 工具,开启高效数据库开发之旅!
【8月更文挑战第31天】Entity Framework Core(EF Core)是一个轻量且可扩展的对象关系映射(ORM)框架,允许开发者使用 .NET 语言操作数据库而无需直接编写 SQL 语句。本教程涵盖 EF Core 的安装、数据库上下文创建、数据库连接配置及常见数据库操作(如添加、查询、更新和删除),并介绍如何利用数据库迁移功能安全地更改数据库结构。通过本教程,你可以快速掌握 EF Core 的基本用法,提高开发效率。
38 0
下一篇
无影云桌面