说明:

Android Room 第二篇 - Entity使用

主要介绍entity的作用

原文地址:https://developer.android.com/training/data-storage/room/defining-data

第一篇:Android Room概述

使用Room entities 来定义数据

当你在使用Room的时候,定义了一组相关的字段作为一个实体。对于每个实体,都会通过在数据库里面创建一张表的方式来处理这些数据。

通常来说,Room 会为实体类中定义的每个字段在数据库中创建“列”。如果实体类中有某个字段你不想在数据库中进行存储的,你可以对这些字段使用@Ignore注解。

下面这个代码块展示了如何定义一个实体

@Entity
public class User {@PrimaryKeypublic int id;public String firstName;public String lastName;@IgnoreBitmap picture;
}

为了能够保存某个字段,Room必须能够对它进行操作。你可以使用public修饰符,或者你可以提供getter和setter方法。如果你选择后者,记住Room是基于JavaBeans约定的。

主键

每个实体必须定义至少一个字段作为主键。即使是实体只有一个字段,你仍然需要对该字段使用@PrimaryKey注解。同时,如果你想通过Room来自动分配ID,也可以设置@PrimaryKey的autoGenerate属性。如果实体有组合主键,你可以通过primaryKeys属性来说声明,下面是代码示例:

@Entity(primaryKeys = {"firstName", "lastName"})
public class User {public String firstName;public String lastName;@IgnoreBitmap picture;
}

通常来说,Room会使用类名作为数据库表名。如果你希望自定义表名,在@Entity注解下设置tableName属性,下面是代码示例:

@Entity(tableName = "users")
public class User {...
}

注意:在SQLite中,表名是不区分大小写的

和tableName属性类似。Room用变量名称作为数据库表的字段名称。如果你希望字段名和变量名不一样,在变量处加上@ColumnInfo注解,下面是代码示例:

@Entity(tableName = "users")
public class User {@PrimaryKeypublic int id;@ColumnInfo(name = "first_name")public String firstName;@ColumnInfo(name = "last_name")public String lastName;@IgnoreBitmap picture;
}

索引和唯一性

根据你操作数据的方式,可能你需要通过索引来提高查询数据库的速度。想要对实体添加索引,可以通过在@Entity注解下添加indices属性来实现,加上你想要添加索引的列名。下面是代码示例:

@Entity(indices = {@Index("name"),@Index(value = {"last_name", "address"})})
public class User {@PrimaryKeypublic int id;public String firstName;public String address;@ColumnInfo(name = "last_name")public String lastName;@IgnoreBitmap picture;
}

有时候,一些字段需要具有唯一性。你可以通过在@Index注解下设置unique为true,即可强制实现该字段的唯一性。下面这段代码就防止firstName和lastName这两列具有相同的属性,保证其唯一性

@Entity(indices = {@Index(value = {"first_name", "last_name"},unique = true)})
public class User {@PrimaryKeypublic int id;@ColumnInfo(name = "first_name")public String firstName;@ColumnInfo(name = "last_name")public String lastName;@IgnoreBitmap picture;
}

定义对象之间的关系

由于SQLite是关系型数据库,你可以指定对象之间的关系。虽然大多数对象关系型数据库都匀速实体对象互相引用,但是Room是明确禁止的。如果你想知道这个决定背后的技术原因,可以参见:Understand why Room doesn’t allow object references.

虽然你不能使用直接关系,Room仍然允许你在实体之间定义外键。

例如,如果有另一个实体叫做Book,你可以在User实体下使用@ForeignKey注解来定义他们之间的关系,就像下面的代码段所示:

@Entity(foreignKeys = @ForeignKey(entity = User.class,parentColumns = "id",childColumns = "user_id"))
public class Book {@PrimaryKeypublic int bookId;public String title;@ColumnInfo(name = "user_id")public int userId;
}

外键是非常强大的,它能够允许你在引用实体发生改变时,指定当前实体做出相应操作。例如,当一个在@ForeignKey注解使用了onDelete = CASCADE 语句的User被删除了,你可以让SQLite删除这个User下所有的books

注意: SQLite 处理 @Insert(onConflict = REPLACE) 的时候看作是 REMOVE 和 REPLACE 操作,而不是单纯的UPDATE操作。这个方法会替换冲突值,同时也会对外键约束有影响。更多细节请看:SQLite documentation

创建嵌套对象

有时,你希望将实体或普通旧Java对象(POJO)表达为数据库逻辑中的一个整体,即使该对象包含多个字段。在这些情况下,你可以使用@Embedded批注来表示要分解到表中子字段的对象。然后,你可以像查找其他单个列一样查询嵌入字段。

例如,我们的User类可以包含Address类型的字段,它表示名为street,city,state和postCode的字段的组合。要将组合列分别存储在表中,请在User类中包含使用@Embedded注释的Address字段,如以下代码段所示:

public class Address {public String street;public String state;public String city;@ColumnInfo(name = "post_code")public int postCode;
}@Entity
public class User {@PrimaryKeypublic int id;public String firstName;@Embeddedpublic Address address;
}

这个表示User对象的表包含具有以下名称的列:id,firstName,street,state,city和post_code。

注意:嵌套字段能够包含在其他嵌套内

如果实体具有多个相同类型的嵌入字段,则可以通过设置prefix属性使每个列保持唯一。然后,Room将提供的值添加到嵌入对象中每个列名称的开头。

Android Room Entity使用相关推荐

  1. Android零基础入门第44节:ListView数据动态更新

    2019独角兽企业重金招聘Python工程师标准>>> 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据 ...

  2. Android Room概述

    说明: 大部分译自Android Developers的Room官网指导文档第一篇,小部分自己查阅资料和理解后加上. 原文地址:https://developer.android.com/traini ...

  3. Androidclient与服务端交互之登陆演示样例

    今天了解了一下androidclient与服务端是如何交互的,发现事实上跟web有点类似吧,然后网上找了大神的登陆演示样例.是基于IntentService的 1.后台使用简单的servlet,支持G ...

  4. html制作统计期末成绩,JS-结合html综合练习js的对象——班级成绩表制作

    对象综合练习 body { font: 14px "微软雅黑"; } span { padding: 5px; } table { margin: 0 auto; border: ...

  5. 将Openfire中的MUC改造成类似QQ群一样的永久群

    一.思路 1.新建立永久房间,同时保证房间中的成员存储到"ofmucmember"表当中. 2.新建一个用户登陆监听的插件,这个插件监听用户的登陆行为,同时在用户登陆时查询&quo ...

  6. 安卓Service组件使用系列2:使用Service下载网络图片并存储于sdCard卡上

    使用启动式Service的方式可以处理网络的数据交互.音乐播放.执行IO操作(这些操作都是来自后台的).下面我们以下载网络图片并存储于sdCard卡为实际应用背景来说明它的使用方法. 整体思路:在xm ...

  7. 安卓开发项目——智能农业

    智能农业的开发步骤 首先需要导一下数据包. compile 'com.makeramen:roundedimageview:2.2.1'--让图片变成圆形的效果compile 'com.loopj.a ...

  8. 关于ContentProviderContentResolver的学习与使用

    一.ContentProvider的定义 1.ContentProvider是Android的四大组件 2.ContentProvider是一种数据包装器(发布者),它提供统一的接口对数据进行操作,调 ...

  9. java建立http_java-创建一个HttpEntity

    我正在尝试更新到com.loopj.android:android-async-http的最新版本(1.4.9),其中org.apache.http被cz.msebera.android.httpcl ...

最新文章

  1. 近期要推出的ISA2006系列文章
  2. Java 面试题 —— 老田的蚂蚁金服面试经历
  3. 不是keys,记一次因 redis 使用不当导致应用卡死 的过程
  4. PS/2键盘鼠标接口各针脚定义
  5. linux账号前有个base,安装 aconda 后Linux的终端界面前部出现(base)字样
  6. 前端学习(2781):底部tabber配置
  7. 技术干货 | 应用上线前的“体检”,你知道需要检测哪些指标吗?
  8. C# 中 NPOI 库读写 Excel 文件的方法【摘】
  9. java文件移动重命名_Java重命名文件和移动文件
  10. 在线音乐播放器 --- 图片上传
  11. P问题、NP问题、NPC问题、NPH问题详解
  12. 富文本编辑器kindeditor支持从word复制粘贴保留格式和图片的插件
  13. android 数组赋值字符串_字符串数组的赋值
  14. 游戏贴图打包工具——TexturePacker详解
  15. 安装hadoop1.2集群环境
  16. spotlight on linux 安装及配置
  17. i国网app苹果版_阿里云盘app苹果版 -阿里云盘app官方手机版下载
  18. ffmpeg硬解码与软解码的压测对比
  19. 黄灰色鱼骨流程图图表合集PPT模板-优页文档
  20. bat: 删除文件、文件夹

热门文章

  1. Android-利用动画实现背景逐渐变暗
  2. RASNET EDCF
  3. 惠普HP DeskJet Ink Advantage 5088 打印机驱动
  4. 专访迈奔灵动CEO谈毅:Android掘金者
  5. Vscode 快捷键生成代码片段
  6. char与short的区别
  7. cocos2dx 制作单机麻将(六)
  8. Linux -- ftok函数
  9. Cpp / 无锁编程
  10. 2022年导游资格导游业务考试模拟试题卷及答案