当前位置:首页 > 行业动态 > 正文

安卓开发之room实体定义数据

Room实体定义基础

Room是Android官方推荐的持久化框架,通过注解处理简化SQLite数据库操作,定义实体是使用Room的第一步,实体类对应数据库中的表结构。

核心注解说明

注解 作用
@Entity 标记当前类为数据库实体(表),可指定tableName参数定义表名
@PrimaryKey 标记主键字段,可配置autoGenerate属性控制自增
@ColumnInfo 定义字段与数据库列的映射关系,可指定colName/type/affinity等属性
@Ignore 排除字段不参与数据库操作
@Embedded 嵌入另一个实体对象(用于处理嵌套结构)
@Relation 定义实体间的关系(一对多/多对多)

字段类型支持

Java类型 SQLite类型 说明
int/Integer INTEGER 整数类型(推荐使用包装类)
long/Long INTEGER(64) 长整型(需显式声明长度)
float/Float REAL 浮点数
double/Double REAL(8) 双精度浮点数
String TEXT 文本类型
byte[] BLOB 二进制数据
List/Set 需通过@Relation处理 集合类型需特殊处理

实体定义示例

@Entity(tableName = "user_table")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id; // 自增主键
    @ColumnInfo(name = "user_name", typeAffinity = ColumnInfo.TEXT)
    private String name;
    @ColumnInfo(name = "create_time")
    private long createTime; // 默认存储为INTEGER类型
    @Ignore
    private transient Address address; // 被忽略的字段
    // 嵌入式对象示例
    @Embedded
    public Profile profile;
    // 构造方法、getter/setter省略...
}
@Entity
class Profile {
    @PrimaryKey(autoGenerate = true)
    public int profileId;
    @ColumnInfo(name = "bio_text")
    public String bio;
}

主键策略配置

配置方式 说明
autoGenerate = true 主键自动递增(整型/长整型)
autoGenerate = false 需要手动指定主键值
@PrimaryKey(autoGenerate = true) 复合主键需使用@PrimaryKey联合多个字段

关系型数据处理

  1. 一对一关系:使用@Embedded直接嵌入对象
  2. 一对多关系:通过@Relation建立关联
  3. 多对多关系:需要中间表实现关联
// 定义订单-商品多对多关系
@Entity
public class Order {
    @PrimaryKey(autoGenerate = true)
    public int orderId;
    @Relation(parentColumn = "orderId", entityColumn = "productId")
    public List<OrderProduct> products;
}

常见问题处理

Q1:如何定义外键约束?
A1:使用@ForeignKey注解,需指定entity和childColumns/parentColumns参数:

@Entity(foreignKeys = @ForeignKey(
    entity = User.class, 
    parentColumns = "id", 
    childColumns = "userId"))
public class Order {
    @PrimaryKey(autoGenerate = true)
    public int orderId;
    public int userId; // 外键字段
}

Q2:如何处理默认值?
A2:Room不支持字段级默认值,可通过以下方式实现:

  1. 在构造方法中设置默认值
  2. 在插入前手动赋值
  3. 使用@ColumnInfo(defaultValue = "value")(仅部分类型有效)

注意:字符串类型默认值需配合@ColumnInfo(defaultValue = "''")使用,数值类型可直接设置默认

0