GreenDao 3.x 注解中ToOne和ToMany的个人理解

GreenDao是什么东西这个就不用多说了。自从GreenDao升级到3.0之后,编译的方法发生了改变。当然这个改变是有助于快速开发的。

区别在哪随便百度一下都可以知道。这里就不多说了。

这里主要说的是关于3.0之后实体类通过注解的方式使用。

- @Id :主键 long/Long型,可以通过@Id(autoincrement = true)设置自增长 
- @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb=”name”) 
- @NotNul:设置数据库表当前列不能为空 
- @Transient :添加次标记之后不会生成数据库表的列 
1.)索引注解 
- @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束 
- @Unique:向数据库列添加了一个唯一的约束 
2.)关系注解 
- @ToOne:定义与另一个实体(一个实体对象)的关系 
- @ToMany:定义与多个实体对象的关系


这里讲的是ToOne和ToMany的用法

原来的ToOne是这样用的:

Property property = entity.addLongProperty("customerId").getProperty(); <br>entity.addToOne(Customer, property);


3.0之后的用法我借用了别人的代码:

@Entity
public class Order {
    @Id private Long id;
  
    private long customerId;
  
    @ToOne(joinProperty = "customerId")
    private Customer customer;
}
  
@Entity
public class Customer {
    @Id private Long id;
}
这里的意思是 customerId作为外键与Customer中的主键(也就是id)相连。


举个例子一个User类里面有个关于用户头像地址的参数,我们假设为icon,类型为int。

同时,我们也有一个实体类Picture专门保存icon的数据,id啊,大小啊什么的。在User类里面使用了ToOne,在项目运行的时候,获取User里面的icon,实际上就是获取了Picture类里面的数据。大概是这个意思。


接下来说ToMany,这个有点复杂,先引用一下其他人的代码吧:

@Entity
public class User {
    @Id private Long id;
  
    @ToMany(referencedJoinProperty = "ownerId")
    private List<Site> ownedSites;
}
  
@Entity
public class Site {
    @Id private Long id;
    private long ownerId;
}
 
// ----------------------------
 
@Entity
public class User {
    @Id private Long id;
    @Unique private String authorTag;
  
    @ToMany(joinProperties = {
            @JoinProperty(name = "authorTag", referencedName = "ownerTag")
    })
    private List<Site> ownedSites;
}
  
@Entity
public class Site {
    @Id private Long id;
    @NotNull private String ownerTag;
}
 
// ----------------------------
 
@Entity
public class Site {
    @Id private Long id;
  
    @ToMany
    @JoinEntity(
            entity = JoinSiteToUser.class,
            sourceProperty = "siteId",
            targetProperty = "userId"
    )
    private List<User> authors;
}
  
@Entity
public class JoinSiteToUser {
    @Id private Long id;
    private Long siteId;
    private Long userId;
}
  
@Entity
public class User {
    @Id private Long id;
}

这里根据分割线分成3种的情况

第一种 Site类的ownerId作为外键,与User的主键相连。

第二种 Site类的ownerId作为外键,与User的非主键不为空的键相连。
第三种。还没理解。

@ToMany的属性referencedJoinProperty,类似于外键约束。

@JoinProperty 对于更复杂的关系,可以使用这个注解标明目标属性的源属性。

@JoinEntity 如果你在做多对多的关系,有其他的表或实体参与,可以给目标属性添加这个额外的注解


暂时先这样吧



  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
GreenDAO 是一个基于 SQLite 的 Android ORM 框架,它提供了一种简单方便的方式来将 Java 对象映射到 SQLite 数据库。 关于 GreenDAO 的 join 操作,它可以通过 QueryBuilder 类实现。具体步骤如下: 1. 创建两个实体类,例如 A 和 B,它们之间可能存在关联关系。 2. 在 A 实体类定义一个 ToOne 类型的关联属性,表示 A 对象关联到一个 B 对象。例如: ``` @Entity public class A { @Id private Long id; private String name; @ToOne(joinProperty = "bId") private B b; private Long bId; // ... } ``` 其,`@ToOne` 注解表示关联属性是一个 ToOne 类型,`joinProperty` 属性指定了关联的外键属性名称。 3. 在 B 实体类定义一个 ToMany 类型的关联属性,表示 B 对象关联到多个 A 对象。例如: ``` @Entity public class B { @Id private Long id; private String desc; @ToMany(referencedJoinProperty = "bId") private List<A> aList; // ... } ``` 其,`@ToMany` 注解表示关联属性是一个 ToMany 类型,`referencedJoinProperty` 属性指定了关联的外键属性名称。 4. 根据需要创建 A 和 B 对象,并设置它们之间的关联关系。 5. 使用 QueryBuilder 类查询 A 和 B 对象的关联数据。例如: ``` QueryBuilder<A> aQueryBuilder = aDao.queryBuilder(); QueryBuilder<B> bQueryBuilder = bDao.queryBuilder(); List<A> aList = aQueryBuilder.join(B.class, ADao.Properties.BId) .where(BDao.Properties.Desc.eq("xxx")) .list(); ``` 其,`join` 方法表示要进行关联查询,`B.class` 表示关联的实体类,`ADao.Properties.BId` 表示 A 实体类的外键属性,`.where` 方法表示要添加查询条件,`BDao.Properties.Desc.eq("xxx")` 表示查询 B 实体类 desc 属性为 "xxx" 的数据,最后调用 `list` 方法获取查询结果。 以上就是 GreenDAO join 操作的基本步骤。需要注意的是,在进行关联查询时,建议使用 QueryBuilder 类来构建查询语句,以便更加方便地添加查询条件和排序规则。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值