上一篇
安卓开发之room实体定义数据
- 行业动态
- 2025-04-22
- 10
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联合多个字段 |
关系型数据处理
- 一对一关系:使用@Embedded直接嵌入对象
- 一对多关系:通过@Relation建立关联
- 多对多关系:需要中间表实现关联
// 定义订单-商品多对多关系 @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不支持字段级默认值,可通过以下方式实现:
- 在构造方法中设置默认值
- 在插入前手动赋值
- 使用
@ColumnInfo(defaultValue = "value")
(仅部分类型有效)
注意:字符串类型默认值需配合
@ColumnInfo(defaultValue = "''")
使用,数值类型可直接设置默认