/** 获取缓存实体表信息 */ public EntityTable getEntityTable(Class<?> claxx, boolean needPK) { EntityTable table = getEntityTable(claxx.getName()); if (table == null) { table = new EntityTable(); putEntityTable(claxx.getName(), table); table.claxx = claxx; table.name = TableUtil.getTableName(claxx); table.pmap = new LinkedHashMap<String, Property>(); List<Field> fields = FieldUtil.getAllDeclaredFields(claxx); // Field[] fields = claxx.getDeclaredFields(); for (Field f : fields) { if (FieldUtil.isInvalid(f)) { continue; } Property p = new Property(); p.field = f; // 获取列名,每个属性都有,没有注解默认取属性名 Column col = f.getAnnotation(Column.class); if (col != null) { p.column = col.value(); } else { p.column = f.getName(); } // 主键判断 PrimaryKey key = f.getAnnotation(PrimaryKey.class); if (key != null) { // 主键不加入属性Map table.key = new com.litesuits.orm.db.model.PrimaryKey(p, key.value()); // 主键为系统分配,必须为Long型 if (table.key.isAssignedBySystem()) { if (table.key.field.getType() != Long.class && table.key.field.getType() != long.class) { throw new RuntimeException( PrimaryKey.AssignType.AUTO_INCREMENT + "要求主键属性必须是Long型( the primary key should be Long or long...)\n 提示:把你的主键设置为Long或long型"); } } } else { // ORM handle Mapping mapping = f.getAnnotation(Mapping.class); if (mapping != null) { table.addMapping(new MapProperty(p, mapping.value())); } else { table.pmap.put(p.column, p); } } } } if (needPK && table.key == null) { throw new RuntimeException( "你必须设置主键(you must set the primary key...)\n 提示:在对象的属性上加PrimaryKey注解来设置主键。"); } return table; }
/** * 检测映射表是否建立,没有则建一张新表。 * * @param db * @param tableName * @param column1 * @param column2 * @return */ public void checkOrCreateMappingTable( SQLiteDatabase db, String tableName, String column1, String column2) { // 关键点1:初始化全部数据库表 initAllTablesFromSQLite(db); EntityTable table = TableUtil.getMappingTable(tableName, column1, column2); synchronized (table) { // 关键点2:判断表是否存在,是否需要新加列。 if (!checkExistAndColumns(db, table)) { // 关键点3:新建表并加入表队列 if (createTable(db, table)) { putSqlTableIntoList(table); } } } }
/** * 检测表是否建立,没有则建一张新表。 * * @param db * @param entity */ public EntityTable checkOrCreateTable(SQLiteDatabase db, Object entity) { // 关键点1:初始化全部数据库表 initAllTablesFromSQLite(db); EntityTable table = TableUtil.getTable(entity); // table lock synchronized synchronized (table) { // 关键点2:判断表是否存在,是否需要新加列。 if (!checkExistAndColumns(db, table)) { // 关键点3:新建表并加入表队列 if (createTable(db, table)) { putSqlTableIntoList(table); } } } return table; }
/** * global lock synchronized * * @param db */ private void initAllTablesFromSQLite(SQLiteDatabase db) { synchronized (instance) { if (Checker.isEmpty(mSqlTableList)) mSqlTableList = TableUtil.getAllTablesFromSQLite(db); } }