ORM百度百科
上一篇分析了数据库创建相关的核心代码,这一篇主要是分析Sugar中怎么通过domain映射相关table
首先分析SchemaGenerator.java
createTable(Class<?> table, SQLiteDatabase sqLiteDatabase)
中的getTableFields方法
List<Field> fields = ReflectionUtil.getTableFields(table);
此方法根据domain获取相关的Field列表,下面具体看获取Field列表的代码
其中有两种获取Field列表的方式
1、SugarConfig.getFields()如果获取了列表回直接返回
2、SugarConfig.getFields()返回null时调用getAllFields方法
我们先分析第一个流程SugarConfig.getFields(table)
可以看见SugarConfig中有个静态的缓存集合,这个集合用来保存已经set进来的table的Field,第一次进来根据key去获取是不可能有值的,会返回null,走上面的第二种获取方式
现在来看第二种getAllFields(typeFields, table)方法的获取流程
以上代码分别获取了当前domain及domain父类中的Field
if (!field.isAnnotationPresent(Ignore.class) && !Modifier.isStatic(field.getModifiers()) && !Modifier.isTransient(field.getModifiers()))
接着判断当前Field的注释是否可以被忽略及Field的修饰类型,如果不是上面三种类型则添加进列表,并且保存到SugarConfig中的缓存中,然后返回给getTableFields方法,到目前为止已经拿到了domain中的所有相关Field,接着就可以根据相关Field来创建table了