1、SugarContext.init(Context) 初始化的过程中包含SugarContext、SugarDb、ConcurrentMap对象的初始化
代码如下:
private SugarContext(Context context) {
this.context = context;
//初始化SugarDb
this.sugarDb = new SugarDb(context);
//初始化ConcurrentMap缓存信息
this.entitiesMap = new MapMaker().weakKeys().makeMap();
}
初始化SugarDb代码:SugarDb继承SQLiteOpenHelper
public SugarDb(Context context) {
super(context,
//根据注册文件中的配置获取数据库名
ManifestHelper.getDatabaseName(context),
//根据注册文件中的配置获取是否现实查询日志
new SugarCursorFactory(getDebugEnabled(context)),
//根据注册文件中的配置获取数据库版本
getDatabaseVersion(context));
//包含创建数据库,建表,删表,升级库等一些工具方法稍后解析
schemaGenerator = new SchemaGenerator(context);
}
以上初始化工作都处理完毕,在调getReadableDatabase或getWritableDatabase时,会判断指定的数据库是否存在,不存在则调SQLiteDatabase.create创建, onCreate只在数据库第一次创建时才执行,开发人员无需再自己判断表是否存在。
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//SchemaGenerator已经初始化过了,在数据库第一次创建的时候调用createDatabase
schemaGenerator.createDatabase(sqLiteDatabase);
}
SchemaGenerator中创建数据库的方法
public void createDatabase(SQLiteDatabase sqLiteDatabase) {
//获取所有需要映射的domain,核心是通过配置文件中指定的包路径去获取
List<Class> domainClasses = getDomainClasses(context);
for (Class domain : domainClasses) {
//根据每个domain遍历去创建表
createTable(domain, sqLiteDatabase);
}
}
//创建表核心代码,主要是根据传进来的domain中的属性进行组装
Paste_Image.png
网友评论