android中的xUtils中的数据库知识总结

在项目中使用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的作用是:查找父节点!
}

        
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值