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
- LitePal源码学习开篇
- STL源码学习,开篇。
- Irrlicht 源码学习笔记 开篇
- LitePal学习
- LitePal 学习
- eoe:开篇-记录EOE源码学习过程
- 共同学习Java源码--开篇语
- 共同学习Spring源码--开篇语
- 共同学习SpringMVC源码--开篇语
- 【libevent】源码学习(一)--开篇
- 从Masonry 源码探 Objective-C [源码学习开篇]
- LitePal学习小结 (一)
- LitePal学习小结 (二)
- LitePal学习总结 (三)
- LitePal学习总结 (四)
- LitePal学习总结 (五)
- LitePal学习总结 (六)
- LitePal学习总结 (七)
- NVIDIA NVLink技术
- Java类更改常量后如何编译才能生效
- Linux细节 - iftop流量监控工具
- 黑马程序员_java新手路过花个十秒钟看一下,不然以后极有可能你也和我一样悲剧
- sicily 2015 A New Year Gift
- LitePal源码学习开篇
- SQLServer统计信息理解
- iOS开发之设计一个新闻客户端模板(Swift)
- 黑马程序员——基础知识——多线程
- Java web eclipse 配置-workset tab转空格
- cookie和Jsessionid
- linux教程
- VS2010中几个常用目录说明
- codeforces 150A 题解