greenDao3.x 深入使用

参数类型

1.默认参数

byte, Byte
short, Short
int, Integer
long, Long
float, Float
double, Double

boolean, Boolean
byte[]
String
Date

2.自定义参数

使用数据库支持的原生数据类型通过PropertyConverter类转换成你想要的属性。
1.给自定义类型参数添加 @Convert注释并添加对应参数:
converter:参数转换类,columnType:在数据库中对应的原始支持类型
2. 实现PropertyConverter类

下面例子为list转成String。

@Entity 
public class User {
 @Id 
 private Long id; 
 @Convert(converter = GreenConverter.class, columnType = String.class)
 } 

//-----------------转换类
public class GreenConverter implements PropertyConverter<List,String> {
    @Override
    public List convertToEntityProperty(String databaseValue) {
        if (databaseValue == null) {
            return null;
        }
        else {
            List lista = Arrays.asList(databaseValue.split(","));
            return lista;
        }
    }

    @Override
    public String convertToDatabaseValue(List entityProperty) {
        if(entityProperty==null){
            return null;
        }
        else{
            StringBuilder sb= new StringBuilder();
            for(Object link:entityProperty){
                sb.append(link);
                sb.append(",");
            }
            return sb.toString();
        }
    }
}

清除缓存

greenDao查询原则:同一个Session如果已经记录了entity,下次查询会直接从内存中读取,若内存中没有再从数据库查找。注意当entity发生改变时,仍然从缓存中读取。此时,为保证数据的正确性需要在entity更改后执行清除缓存操作.清除方法:

1.清除所所有的缓存
daoSession.clear();
2.清除指定类缓存
projectDao = daoSession.getNoteDao();
projectDao.detachAll();

多表关联存储

关联:在主表中定义一个外键去关联副表,然后需要用外键去副表中查询所需要的数据。

1.一对一 @ToOne

joinProperty参数来定义一个外键

@Entity 
public class Order {    
  @Id //主键 必须为long
  private Long id;   
  private long customerId;  
  @ToOne(joinProperty = "customerId")  //表示order类的customerId字段与Customer类的id相等
  private Customer customer;
}

@Entity 
public class Customer {
 @Id 
 private Long id; 
 }

2.一对多 @ToMany

2.1 referencedJoinProperty ,目标实体拥有源实体的主键,然后在源实体里将目标实体中的外键((customerId))作为referencedJoinProperty的属性。也就是下面例子中的customerId表示的是Customer 中的主键id.

//源实体
@Entity 
public class Customer {
 @Id 
 private Long id; 
 @ToMany(referencedJoinProperty = "customerId")  
 private List orders; 
 }
//目标实体
@Entity
  public class Order {
      @Id private Long id;
      private long customerId;
  }

2.2 如果两个实体之间的关联外键不是通过id,而是通过自定义的属性就需要使用@JoinProperty。

@Entity 
public class Customer {
 @Id 
 private Long id; 
 @Unique 
 private String tag; 
 @ToMany(joinProperties = { @JoinProperty(name = "tag", referencedName = "customerTag") }) 
 private List orders; 
 } 

@Entity 
public class Order { 
@Id private Long id; 
private Date date; 
 private String customerTag; 
 }

多对多 @JoinEntity

不是两个表或者两个对象直接关联,而是要通过一个“第三者”关联

greenDao3.x 深入使用_第1张图片

@JoinEntity中的entity 表示中间表(第三者),sourceProperty 表示实体属性,targetProperty 表示外联实体。在两个实体中都需要写@JoinEntity。

@Entity 
public class Person{ 
@Id(autoincrement = true) 
private Long id; 
private String name; 
// 一对多,@JoinEntity注解:entity 中间表;sourceProperty 自身实体属性;targetProperty 外链实体属性 
@ToMany @JoinEntity( entity = JoinStudentToPerson.class, sourceProperty = "pid", targetProperty = "sid" )
//一个person对应多个student
 private List students;
---------------------------------------------------
//中间表 “第三者” 
@Entity
 public class JoinStudentToPerson {
private Long id; //和person关联的id
 private Long pid; //和student关联的id private Long sid; 
 }

@Entity 
public class Student { 
@Id private Long id; 
private String name; 
// 多对多,@JoinEntity注解:entity 中间表;sourceProperty 自身实体属性;targetProperty 外链实体属性 
@ToMany @JoinEntity( entity = JoinStudentToPerson.class, sourceProperty = "sid", targetProperty = "pid" ) 
//一个person对应多个student
private List persons; }

关联表查询与更新

同样因为缓存问题,需要手动添加和移除。如:获取当前顾客的订单列表
List ordersList= customer.getOrders();
添加或者删除的订单为 :Order order = new Order();
1.添加
// 添加到数据库
daoSession.insert(order);
手动添加到订单列表ordersList.add(order )
2.删除
// 从数据库中移除
daoSession.delete(someOrder);
手动从缓存列表移除ordersList.remove(order )

多表查询

join()
1.关联单个表
ueryBuilder.join()方法即可完成,第一个参数是关联的类,第二个是关联类中的关联属性。

//查询地址住在国贸的帅哥 
QueryBuilder queryBuilder = userDao.queryBuilder(); 
queryBuilder.join(Address.class, AddressDao.Properties.userId) .where(AddressDao.Properties.Street.eq("国贸")); 
List users = queryBuilder.list();

2.关联多个表
通过queryBuilder.join()链式调用来实现多表查询.

//查询在欧洲人口超过100000的城市 
QueryBuilder qb = cityDao.queryBuilder().where(Properties.Population.ge(1000000)); 
Join country = qb.join(Properties.CountryId, Country.class); 
Join continent = qb.join(country, CountryDao.Properties.ContinentId, Continent.class, ContinentDao.Properties.Id); 
continent.where(ContinentDao.Properties.Name.eq("Europe")); 
List bigEuropeanCities = qb.list();

你可能感兴趣的:(Android,GreeDao)