Android官方ORM数据库Room技术解决方案:@Embedded内嵌对象(二)

Android官方ORM数据库Room技术解决方案:@Embedded内嵌对象(二)

(一)附录1简介了Android Room的基本使用。在附录1例子中,User对象元素均为普通的Java基本数据类型,但是实际的开发中,通常建立的持久化存储对象复杂,且通常是结构化的Java对象,互相之间存在引用或者内嵌关系。

Android Room支持数据库表Java对象通过注解符@Embedded内嵌一个Java对象。这样就像过去的ORM数据库一样,比如构造一个名为Info的Java对象,作为一个成员变量添加到User里面:

package zhangphil.demo;

import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Embedded;
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 userId;

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

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

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

    @Embedded
    public Info info;
}

(二)Info对象本身也是一个Android Room的@Entity。也有自己的列名和主键等完整的Android Room数据表要素,Info.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/23.
 */

@Entity(tableName = "info_table")
public class Info {
    @PrimaryKey(autoGenerate = true)
    public int infoId;

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

    @ColumnInfo(name = "content")
    public String content;
}

(三)需要注意的是,通过Android Room的@Embedded符号内嵌的数据表,列表名将自动二次添加到“宿主”对象中。本例是User钟内嵌了Info,那么User数据库表user_table中将会被Android Room自动添加Info里面的列名字段。User的user_table中原有userId,name,age,updateTime四列,由于@Embedded了Info,那么Info里面的blog,content将会自动添加到User数据表中。但是Info的主键infoId将在User中被忽略不再被作为主键。
 
(四)写一个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();

        //写数据库
        writeUserDatabase(mUserDao, "zhangphil", 18);
        readDatabase(mUserDao);

        //关闭数据库
        mUserDatabase.close();
    }

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

    private void writeUserDatabase(UserDao dao, String name, int age) {
        Info info = new Info();
        info.blog = "http://blog.csdn.net/zhangphil";
        info.content = "Android";

        User user = new User();
        user.name = name;
        user.age = age;
        user.updateTime = System.currentTimeMillis();

        user.info = info;

        dao.insertUser(user);
    }
}

代码运行结果,logcat输出:

11-24 09:20:00.716 30805-30851/zhangphil.demo D/输出: 读数据库...
11-24 09:20:00.723 30805-30851/zhangphil.demo D/输出: 1,zhangphil,18,http://blog.csdn.net/zhangphil,Android
11-24 09:20:00.723 30805-30851/zhangphil.demo D/输出: 读数据库完毕.

附录:
1,《Android官方ORM数据库Room技术解决方案简介(一)》链接:http://blog.csdn.net/zhangphil/article/details/78611632 
2,《Android ORMLite数据库简介》链接:http://blog.csdn.net/zhangphil/article/details/46878075 
3,《Android ORMLite ForeignCollection关联外部集合》链接:http://blog.csdn.net/zhangphil/article/details/46891021

时间: 2024-12-19 03:48:25

Android官方ORM数据库Room技术解决方案:@Embedded内嵌对象(二)的相关文章

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

是时候该忘记Android SQLite了!Android官方ORM数据库Room技术解决方案简介(一) Android的Romm是Android官方整合出来的一揽子ORM数据库解决方案.Android Room和历史上的ORM数据库如Android ORMLite(见附录文章1,2),Android greenDao等等,有诸多相同的设计思想和理念,但Android Room同时吸收众家ORM数据库之长,有自己新的创新和改进.我将分开写若干篇文章,逐点介绍Android官方的ORM数据库技术解

【Android】ORM数据库框架之GreenDao快速入门与使用

先润润嗓子,听我细细道来: 今天我们来介绍一款性能非常好的orm数据库框架GreenDao,相信大家一定对它有所耳闻,或者已经在项目中在使用它了,虽然我在去年就开始使用这款框架,但是一直没有做过系统的整理和梳理,有些地方也是含糊不清,今天就和大家一起来揭开GreenDao的神秘面纱. GreenDao github地址:https://github.com/greenrobot/greenDAO GreenDao官网地址:http://greenrobot.org/greendao/,包含详细的

android高效ORM数据库框架greenDao使用

     因为项目中多处用到了数据库,需要对数据库频繁的读写操作,虽然android 自带的SQLiteOpenHelper的.这种方式比较方便易懂,但是在使用过程中需要写很多的sql语句,而且需要及时的关闭和释放资源,使用起来相对复杂,鉴于性能的考虑,决定采用一种ORM框架来解决,     在android中开源的数据库ORM解决方案中.主要有那么几种.综合各方面评价,觉得greenDao相对来说是一个综合考量最好的方案,所以决定试一下,     但是greenDao使用相关资料网上确实不多,

Android高性能ORM数据库DBFlow入门

目前Android上比较流行的ORM数据有greenDAO.OrmLite.ActiveAndroid等. 其中greenDAO不是基于反射的,性能自然是最好的,但是使用成本比较高:OrmLite.ActiveAndroid是利用注解和反射,封装得比较好,优点就是易用性强.我个人认为,大多数应用对数据库要求并不是很高,如果保存或拉取数据不是很大的话是难以拉开很大差距,所以相比性能,我更加偏向易用性. DBFlow,综合了 ActiveAndroid, Schematic, Ollie,Sprin

Android 轻量级ORM数据库开源框架ActiveAndroid 源码分析

ActiveAndroid 项目地址在https://github.com/pardom/ActiveAndroid 关于他的详细介绍和使用步骤 可以看下面两篇文章: https://github.com/pardom/ActiveAndroid/wiki http://www.future-processing.pl/blog/persist-your-data-activeandroid-and-parse/ 请确保你在阅读本文下面的内容之前 熟读上面的2篇文章.我不会再讲一遍如何使用这个框

【Android】ORM数据库框架之GreenDao【关联】关系操作

上一篇我们介绍了greendao的基本使用方法,如果您还不了解,建议先看下上篇文章再来看这篇会有更好的效果.今天我们来继续学习greendao的relation部分,即数据表的关联操作部分,greendao默认支持一对一,一对多的关系操作,多对多目前暂不支持,下面我们来一步步实现greendao的关联操作: 1.一对一关系 假设我们现在只允许一夫一妻制,好像现在就是啊,哈哈哈哈哈,那么一个男人可以娶一个老婆,一个老婆也只能有一个男人,下面我们分别创建man表和women表,来演示一对一的关联操作

Android ORM数据库之GreenDao使用教程及源码分析

一.简介 1.Android ORM介绍 ?在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite.SugarORM.Active Android.Realm 与 GreenDAO.下面先介绍下当前流行的5种ORM数据库框架: 1)OrmLite ?OrmLite不是Android 平台专用的ORM框架,它是

FluentData - 轻量级.NET ORM持久化技术解决方案

目录: 一.什么是ORM? 二.使用ORM的优势 三.使用ORM的缺点 四.NET下的ORM框架有哪些? 五.几种常用框架的比较 六.什么是FluentData? 七.快速上手如何使用FluentData? 八.提供资源下载 内容: 一.什么是ORM?  ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法. 二

Android官方技术文档翻译——Gradle 插件用户指南(4)

近期赶项目,白天基本没时间,仅仅有晚上在家的时候才干看一看.昨天晚上仅仅翻译完了第四章,今天就仅仅发第四章吧. 本文译自Android官方技术文档<Gradle Plugin User Guide>,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide. 翻译不易.转载请注明CSDN博客上的出处: http://blog.csdn.net/maosidiaoxian/article/details/4195580