读ActiveAndroid源码(五)

前面几篇,断断续续地囫囵吞枣地读了ActiveAndroid的部分源码,大致了解了ActiveAndroid的注解反射原理。其中很多细节还不算很清楚,加之内容非常多,为了更好地阅读接下来的内容,在此对前面阅读的部分作一个总结。

在之前的几篇中,重点阅读了ActiveAndroid中的三个类:Conguration , ModelInfo , TableInfo。下面将对这三个类的作用做一个简单地总结:

一、Conguration

  先看一下Conguration的成员变量: 

    public final static String SQL_PARSER_LEGACY = "legacy";
    public final static String SQL_PARSER_DELIMITED = "delimited";

    //////////////////////////////////////////////////////////////////////////////////////
    // PRIVATE MEMBERS
    //////////////////////////////////////////////////////////////////////////////////////

    private Context mContext;
    private String mDatabaseName;
    private int mDatabaseVersion;
    private String mSqlParser;
    private List<Class<? extends Model>> mModelClasses;
    private List<Class<? extends TypeSerializer>> mTypeSerializers;
    private int mCacheSize;

  其中有,写成常量的SQL解析器

    public final static String SQL_PARSER_LEGACY = "legacy";
    public final static String SQL_PARSER_DELIMITED = "delimited";

  数据库的上下文、

  数据库的名称、

  数据库的版本、

  数据库的解析器、

  数据库中model子类的列表、

  数据库中序列化的列表、

  和缓存大小。

总体来看,Conguration就是存了整个数据库的基本信息和数据库中有需要保存的类的列表。每次启动地初始化过程都会初始化这个类,并从AndroidManifest和文件中读取它的基本信息。

二、ModelInfo 

  同样先看一下ModelInfo的成员变量:

    private Map<Class<? extends Model>, TableInfo> mTableInfos = new HashMap<Class<? extends Model>, TableInfo>();
    private Map<Class<?>, TypeSerializer> mTypeSerializers = new HashMap<Class<?>, TypeSerializer>() {
        {
            put(Calendar.class, new CalendarSerializer());
            put(java.sql.Date.class, new SqlDateSerializer());
            put(java.util.Date.class, new UtilDateSerializer());
            put(java.io.File.class, new FileSerializer());
        }
    };

ModelInfo的成员变量只有两个mTableInfos和mTypeSerializers。

  mTableInfos储存了每个需要储存的类与TableInfo的映射关系。

  mTypeSerializers储存了每个序列化的接口。

  每当用户要对要储存的类进行读/写操作时,就需要从mTableInfos这个map中找到属于自己的TableInfo,然后根据TableInfo中信息进行相关操作。

三、TableInfo

  TableInfo的成员变量如下:

    private Class<? extends Model> mType;
    private String mTableName;
    private String mIdName = Table.DEFAULT_ID_NAME;

    private Map<Field, String> mColumnNames = new LinkedHashMap<Field, String>();

  分别是:

  TableInfo对应的类、

  这个类对应的表名、

  这个表的Id字段名、

  这个类和表中,成员和字段名的对应关系。

  当我们调用要储存的类的相关方法时,这个类就会找到它的TableInfo,然后根据mColumnNames的映射去操作数据库中的对应字段。

Done~

时间: 2024-10-23 04:06:05

读ActiveAndroid源码(五)的相关文章

读ActiveAndroid源码(二)

上一次粗略地读了一下TableInfo这个类,了解了一下ActiveAndroid中注解的使用方法,算是一个预热,这一篇,从正常的顺序开始. 所以,这次从ActiveAndroid的初始化开始阅读. public class Application extends android.app.Application { @Override public void onCreate() { super.onCreate(); ActiveAndroid.initialize(this); } @Ove

读ActiveAndroid源码(三)

上一章,我们读完了Conguration这个类.最后我们发现,Conguration就是为了数据库的初始化.其中包含了内存大小.数据库名称.数据库版本.parser信息. public static synchronized void initialize(Configuration configuration) { if (sIsInitialized) { Log.v("ActiveAndroid already initialized."); return; } sContext

读ActiveAndroid源码(四)

上一章在读DatabaseHelper的初始化时,发现读不动了,因为ModelInfo应该放在前面读.因此,现在开始读ModelInfo. final class ModelInfo { ////////////////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS //////////////////////////////////////////////////

读ActiveAndroid源码(一)

首先ActiveAndroid是依靠注解工作的. @Table(name = "UserBean") public class UserBean extends Model { @Column(name = "uid") public String uid; @Column(name = "nick_name") public String nick_name; public String getUid() { return uid; } pub

(转)读过滤器源码

今天按着Artech的文章又研究了研究过滤器的源码,主要究其实现,还有一点不清晰的地方,可惜周末得回趟家,老妈身体小样.周末只能小看一下书了.继续研究,过两天搞两个例子多试下,研究完了源码及其实现,清晰多了.要不用的总感觉不太清楚.还有几篇文章也看了,现在就不贴出了,等些例子的时候会一起给出. 在ActionInvoker对Action的执行过程中,除了通过利用ActionDescriptor对Action方法的执行,以及之前进行的Model绑定与验证之外,还具有一个重要的工作,那就是对相关筛选

读懂源码:一步一步实现一个 Vue

源码阅读:究竟怎样才算是读懂了? 市面上有很多源码分析的文章,就我看到的而言,基本的套路就是梳理流程,讲一讲每个模块的功能,整篇文章有一大半都是直接挂源码.我不禁怀疑,作者真的看懂了吗?为什么我看完后还是什么都不懂呢? 事实上一个经过无数次版本迭代的框架源码并不适合初学者直接阅读,因为里面有太多细节,太多噪点,太多枝枝蔓蔓.要想真正理解框架的核心逻辑,必须剥茧抽丝,还原出一个纯净的雏形.如同 jQuery 最早的版本只有六百多行,我相信 Vue 的核心功能也只需要几百行就能实现.所以,读懂源码的

读Zepto源码之样式操作

这篇依然是跟 dom 相关的方法,侧重点是操作样式的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zepto1.2.0 内部方法 classRE classCache = {} function classRE(name) { return name in classCache ? classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name

读 zepto 源码之工具函数

Zepto 提供了丰富的工具函数,下面来一一解读. 源码版本 本文阅读的源码为 zepto1.2.0 $.extend $.extend 方法可以用来扩展目标对象的属性.目标对象的同名属性会被源对象的属性覆盖. $.extend 其实调用的是内部方法 extend, 所以我们先看看内部方法 extend 的具体实现. function extend(target, source, deep) { for (key in source) // 遍历源对象的属性值 if (deep && (i

读Zepto源码之操作DOM

这篇依然是跟 dom 相关的方法,侧重点是操作 dom 的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zepto1.2.0 .remove() remove: function() { return this.each(function() { if (this.parentNode != null) this.parentNode.removeChild(this) }) }, 删除当前集合中的元素. 如果父