在项目中使用xutils创建数据库,经常遇到一些外键,内绑定查询等需求,也走过不少的弯路,今天在此总结一下!
1:使用外键@Foreign
1.1:一对多的外键方式:
在此使用用户实体User,地址Address实体,一般一个用户可能有多个地址,所以为一对多的对应关系,正常而言查找用户的同时,经常自动匹配的查询地址实体集合,那么以userId作为外键的标志,在Address实体中进行定义,同时在User实体中定义地址的集合List<Address>属性,用@Foreign进行标识!
Address实体
public class Address {
@Id(column = "id")
int id;
@Column(column = "addressDetail")
String addressDetail;
@Column(column = "city")
String city;
@Column(column = "district")
String district;
String userId;//用户的id 作为关联User实体
}
User实体:
public class User {
@Id(column = "id")
int id;
@Unique
@Column(column = "userId")
String userId;
@Column(column = "userName")
String userName;
@Column(column = "password")
String password;
@Foreign(foreign = "userId", column = "userId") //foreign:Address实体中的userId;
List<Address> addressList; //column:指的是本表中列名为userId,就是对应的实体中的userid属性!
}
业务代码部分:
User user=new User();
//user.setId(102);//如果保存时用saveOrUpdate方法,那么此时id不用添加,xutils会默认分配
//否则会保存不上,除非使用save方法
user.setPassword("123");
user.setUserId("33333");
user.setUserName("zhangyang");
//循环产生用户"
List<Address> addressList=new ArrayList<Address>();
for(int i=0;i<10;++i){
Address address=new Address();
address.setAddressDetail("新盛街道果园村马一组..."+i);
address.setCity("扬州市"+i);
address.setDistrict("邗江区"+i);
// address.setId(124+i);//如果保存时用saveOrUpdate,那么此时id不用添加,xutils会默认分配
//否则会保存不上,除非shi使用save方法
address.setUserId(user.getUserId());
// address.setUser(user);
AddressDao.saveDaveAddrsss(address);
addressList.add(address);
}
user.setAddressList(addressList);
UserDao.saveUser(user);
addressList=AddressDao.getAddressList();
Toast.makeText(context,"addressList size:"+addressList.size(), Toast.LENGTH_SHORT).show();
//进行打印信息
List<User> userList=UserDao.getUserList();
for(User user1:userList){
Toast.makeText(context,"userList size:"+userList.size(), Toast.LENGTH_SHORT).show();
if(user1.getAddressList()!=null){
Toast.makeText(context,"user addressList size:"+user1.getAddressList().size(),Toast.LENGTH_SHORT).show();
}
}
注意点:
tip1: 不建议在Address实体中定义User实体代替String类型的userId,如果定义,在实际运行中不行!页面运行失败!
所以用 字符串
类型的userId那么就足够了!
tip2:在User实体中定义的List<Address>属性,用外键@Foreign注解就能够自动地查找与用户匹配的地址集合,此时addressList该实体属性并不以字段的形式存储到表中!
1.2:一对一的外键方式:
比如用户对应的身份证是唯一的,那么用户与身份证实体对应的关系是一对一的:在User实体中的增加一个identity实体的属性,以@Foreign进行修饰,其中的foreign=“identityId”属性标识Identity实体中的identityId属性,其中的column=“identityId”为标识User实体中的表中的列名为identityId属性!
User实体
public class User {
@Id(column = "id")
int id;
@Unique
@Column(column = "userId")
String userId;
@Column(column = "userName")
String userName;
@Column(column = "password")
String password;
@Foreign(foreign = "userId", column = "userId")
List<Address> addressList;
@Foreign(foreign = "identityId", column = "identityId")
@Column(column = "identityId")
Identity identity;//身份证实体
}
Identity实体:
public class Identity {
@Id
int id;//表中的主键
int identityId;//身份证号码
}
在测试中:@Foreigner注解修饰的外键存在多种情况:
1:在User实体中本身就有userId实体的属性,同时在@Foreigner(column="userId",foreigner="userId"),在User表中只有一个
用户的"userId"列名,不会重新创建新
的列名!
2:在User实体中没有identityId属性,同时在@Foreigner(column="identityId",foreigner="identityId"),在User表结构中有一
身份标识"identityId"列表名,那么xUtils中
会为我们自动的创建列表名"identityId",如果同时在User实体中的identity属性中增加列名的注解
,那么xUtils也不会创建两个identityId的列表名!
1.3@finder的使用:
@finder标识在本表中有条件的查询,其中有targetColumn和valueColumn两个属性:其中"valueColumn"属性标识当前实体的列名,而"targetColumn"属性标识其从其他实体中查找的目标属性!
Node实体:
public class Node {
String nodeName;//节点的名称
@Unique
String nodeId;//节点的id
String deptId;//前置部门的id
boolean isDeptFlag;//是否是部门的提示
String localNodeId;//本地标识的id
String localDeptId;//本地前置部门的标识
int sortNo;//排序的字段
@Finder(targetColumn = "localNodeId",valueColumn = "localDeptId")
Node parent;//finder的作用是:查找父节点!
}