LitePal源码学习开篇

来源:互联网 发布:商城软件开发 编辑:程序博客网 时间:2024/06/05 17:31
     让我们一起来了解下在Android数据库开发中应用广泛的一个开源库——LitePal。它采用了ORM对象关系映射的模式,什么叫对象关系映射?简单地理解就是,我在代码中写了个Model,就能被映射到数据库的表中。首先我们来学习下这个Tony Green大神写的基类——LitePalBase。它主要用在LitePal的组件之间处理它们的一些关联。然后一起来看一下一些重要的属性和方法。

1、类型映射
private OrmChange[] typeChangeRules = { new NumericOrm(), new TextOrm(), new BooleanOrm(),new DecimalOrm(), new DateOrm() };
     可以看到这个数组创建了数据库支持的几个映射:
NumericOrm——把int、long、short映射成INTEGER
TextOrm——把char、String、Character映射成TEXT
BooleanOrm——把boolean、Boolean映射成INTEGER
DecimalOrm——把float、Float、double、Double映射成REAL
DateOrm——把Date映射成INTEGER

     这几个继承了OrmChange的类,实现了它的一个抽象方法:
public abstract String[] object2Relation(String className,String fieldName, String fieldType);
className是类名,也就是Model的类名;
fieldName是属性名,它将成为表中每个列的列名;
fieldType是属性的类型;
返回的String[]数组,第一个数据是columnName,也就是fieldName,第二个数据是映射过的数据类型。

因此由上,我们可以一窥Litepal的一点牛逼之处。例如我创建一个Model:
class Classmate {
    private String name;//必须要是private,为什么?下文会解释到。
    private int age;
    public boolean isMale;
}
     这个Model映射到数据库后将会生成一个表,表名是Classmate,其中只有两个列(而非三个),第一个列,列名是name,数据类型是TEXT;第二个列,列名是age,数据类型是INTEGER。

2、表间关联
     我们都知道数据库有三种关联:一对一、一对多、多对多。这边基类就提供了两个属性来表示表间关联。
private Collection<AssociationsModel> mAssociationModels;
private Collection<AssociationsInfo> mAssociationInfos;
     具体我们后面再看这两个类的源码。

3、getTableModel(String className) —> TableModel
     这个TableModel呢是用来描述表。仅用了三个属性就把表描述得很清楚,tableName(String)、columnsMap(HashMap<String,String>)、className(String)。这里通过columnsMap来添加或者移除表中的列,使用HashMap来保存columnName和columnType。是不是设计得很好!
     那我们继续看这个get方法,入参依然是类名全称,返参就是映射表。这个方法有个准则是在我们的model类中,所有private修饰的,并且类型是(int/Integer, long/Long,short/Short, float/Float, double/Double, char/Character, boolean/Boolean or String)属性才能被生成对应的列。这也解释了为什么上文三个属性只映射了两个列。
    该方法会通过className转换成tableName,并且通过getSupportedFields方法获取到需要转换成列的属性,以及数据类型。最后生成一个TableModel。

4、oneToAnyConditions(String className,Field field,int action)
    这个方法是来处理一对多或者一对一的情况。举例来说,Song和Album,Album里面有很多Songs,但是一个Song只属于一个Ablum。因此我们在代码里面会在Song类里面写一个私有的Album属性,而在Album里面会有一个私有的Song列表,这就是一对多,那如果Album里面只有一个私有的Song属性,那么就是一对一。因此,该方法就是遵循这个规律,将每个属性取出来,如果某个属性是目标类,说明是一对一的关系,如果是目标类的列表,那就是一对多的关系。
    表间关联将通过addIntoAssociationInfoCollection方法存到AssiociationsInfo集合里面。该方法第一个参数是selfClassName,第二个是associatedClassName,第三个是classHoldsForeignKey,第四个是在内部什么关联类的属性,第五个是在关联类里面什么自己类的属性,最后一个是关联类型。
    还有一个方法manyToAnyConditions,也是采用同样的道理处理多对多的情况。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝买家确认收货后申请退款怎么办 淘宝东西失效了但付过款了怎么办 淘宝图片被投诉盗图怎么办原图没了 淘宝退款申请不小心撤销了怎么办 淘宝不小心点了撤销退款怎么办 淘宝上退款不小心撤销了怎么办 新店淘宝卖家想开通直播怎么办 想开通淘宝直播却没有粉丝怎么办 淘宝店家拒绝给我改地址怎么办0 淘宝被投诉卖假申诉失败怎么办 要退保证金但是有人买东西了怎么办 手机淘宝上我是商家停止服务怎么办 淘宝上买的电脑商家关闭了怎么办 淘宝链接复制链链接发不出去怎么办 淘宝卖家填错地址货已经发了怎么办 拼多多没交保证金无法提现怎么办 信用卡被别人刷了没证据怎么办 我在淘宝开个店卖衣服没人买怎么办 收货地址填错了卖家已发货怎么办 淘宝店上的供货商不发货怎么办 在淘宝买的花退到卖家后死了怎么办 在淘宝买东西付款开通了花呗怎么办 淘宝网投诉卖家也不处理问题怎么办 淘宝图片空间上传不了大图片怎么办 不小心把设置里打印机删掉了怎么办 电脑上qq不小心删掉了怎么办 进了一批款式不好卖的衣服怎么办? 淘宝首页图片不居中代码装的怎么办 小语言代码装修以后不是全屏怎么办 招教年龄超过4个月怎么办 淘宝上注册的店铺被别人用了怎么办 淘宝贷款后店铺转让了贷款怎么办 手机千牛发布宝贝类目找不到怎么办 亚马逊被移除销售权该怎么办 玉米煮水不够熟吃了怎么办 华为云手机找回关了找回手机怎么办 我的淘宝号被别人盗用开店怎么办 淘宝买东西发货了不想要了怎么办 两张单号一样罚款已被处理怎么办 58同城登录电话换了怎么办 在超市买的东西坏了怎么办