LitePal源码学习开篇

本文介绍了 LitePal 开源库在 Android 数据库开发中的应用,探讨了 ORM 模式,详细解析了 LitePalBase 类的重要属性和方法。包括类型映射如 NumericOrm、TextOrm 等,如何将 Model 映射到数据库表,并展示了如何处理表间关联,如一对一、一对多关系的建立。此外,还解释了为何只有 private 属性会被生成为数据库列。
     让我们一起来了解下在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,也是采用同样的道理处理多对多的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值