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

来源:互联网 发布:软件ui界面设计素材 编辑:程序博客网 时间:2024/04/29 17:55
在项目中使用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 0