Orm_Reflect_DB——Orm(XML)
ORM系列章节列表(点击查阅):
一、ORM之开篇
上一章我们用代码结构阐述了Orm的基本概念,分别建立了Student.orm.xml文件,以及Student.java,BaseDataBaseHelper两个类,并通过xml文件将实体和数据库表中的字段关联起来,切记(属性中的值的名字必须跟字段名一模一样,不然后面的Reflect部分会出bug)。那么这一章我们讲一下XML文件的解析(这里用
XmlPullParser解析器
),以及Application初始化配置文件:
这里我们需要先建立三个实体类,分别是Item实体类(存放子标签的属性值):
package com.ormoperatedb.object; /** * Created by pdm on 2016/10/3. * 优快云 :http://write.blog.youkuaiyun.com/postlist * GitHub :https://github.com/flyingfishes */ public class Item { /** * <item column="stu_classname" * property="stuClass" * type="java.lang.String"></item> */ private String column; private String property; private String type; public String getColumn() { return column; } public void setColumn(String column) { this.column = column; } public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } public String getType() { return type; } public void setType(String type) { this.type = type; } @Override public String toString() { return "Item [column=" + column + ", property=" + property + ", type=" + type + "]"; } }
Key实体类(存放子标签中"Key"的属性值,这个区分于其他item,表示主键):
package com.ormoperatedb.object; /** * Created by pdm on 2016/10/3. * 优快云 :http://write.blog.youkuaiyun.com/postlist * GitHub :https://github.com/flyingfishes */ public class Key extends Item { private boolean identity; public boolean isIdentity() { return identity; } public void setIdentity(boolean identity) { this.identity = identity; } @Override public String toString() { return "Key [identity=" + identity + "]"; } }
Orm实体类(存放父标签的属性值,以及所有的子标签对象)
package com.ormoperatedb.object; import java.util.ArrayList; import java.util.List; /** * Created by pdm on 2016/10/3. * 优快云 :http://write.blog.youkuaiyun.com/postlist * GitHub :https://github.com/flyingfishes */ public class Orm { private String tableName; private String beanName; private String daoName; private Key key; private List<Item> items = new ArrayList<Item>(); public String getTableName() { return tableName; } public void setTableName(String tableName) { this.tableName = tableName; } public String getBeanName() { return beanName; } public void setBeanName(String beanName) { this.beanName = beanName; } public String getDaoName() { return daoName; } public void setDaoName(String daoName) { this.daoName = daoName; } public Key getKey() { return key; } public void setKey(Key key) { this.key = key; } public List<Item> getItems() { return items; } public void setItems(List<Item> items) { this.items = items; } @Override public String toString() { return "Orm [tableName=" + tableName + ", beanName=" + beanName + ", daoName=" + daoName + ", key=" + key + ", items=" + items + "]"; } }
接下来XML解析代码如下:
package com.ormoperatedb.utils; import android.util.Xml; import com.ormoperatedb.object.Item; import com.ormoperatedb.object.Key; import com.ormoperatedb.object.Orm; import org.xmlpull.v1.XmlPullParser; import java.io.InputStream; import java.util.HashMap; import java.util.Map; /** * Created by pdm on 2016/10/3. * 优快云 :http://write.blog.youkuaiyun.com/postlist * GitHub :https://github.com/flyingfishes */ public class DBConfig { //这里用于存放所有的Orm集合 public static Map<String,Orm> mapping = new HashMap<String, Orm>(); //这里用于反射cursor取值的方法 public static Map<String,String> methodMaps = new HashMap<String,String>(); static{ methodMaps.put("java.lang.Integer","getInt"); methodMaps.put("java.lang.String","getString"); methodMaps.put("java.lang.Float","getFloat"); methodMaps.put("java.lang.Double","getDouble"); methodMaps.put("java.lang.Long","getLong"); methodMaps.put("java.lang.Short","getShort"); } /** * @param is * @return * @throws Exception */ public static Orm parse(InputStream is) throws Exception { Orm orm = null; //初始化XML解析器 XmlPullParser parser = Xml.newPullParser(); parser.setInput(is,"UTF-8"); //获取事件类型 int eventType = parser.getEventType(); //判断文档遍历是否结束 while (eventType!=XmlPullParser.END_DOCUMENT){ //获取标签名 String tagName = parser.getName(); switch (eventType){ //判断标签头 case XmlPullParser.START_TAG: if ("orm".equals(tagName)){ orm = new Orm(); //这里的"tablename"是XML的属性名 orm.setTableName(parser.getAttributeValue(null,"tablename")); orm.setBeanName(parser.getAttributeValue(null,"beanName")); orm.setDaoName(parser.getAttributeValue(null,"daoName")); }else if ("key".equals(tagName)){ Key key = new Key(); key.setColumn(parser.getAttributeValue(null,"column")); key.setProperty(parser.getAttributeValue(null,"property")); key.setType(parser.getAttributeValue(null,"type")); key.setIdentity(Boolean.parseBoolean(parser.getAttributeValue(null,"identity"))); orm.setKey(key); }else if ("item".equals(tagName)){ Item item = new Item(); item.setColumn(parser.getAttributeValue(null,"column")); item.setProperty(parser.getAttributeValue(null,"property")); item.setType(parser.getAttributeValue(null,"type")); orm.getItems().add(item); } break; } //下移 eventType = parser.next(); } return orm; } }
这里我们建议一个
BaseApplication:
package com.ormoperatedb.baseapplication; import android.app.Application; import com.ormoperatedb.utils.DBConfig; import com.ormoperatedb.object.Orm; /** * Created by pdm on 2016/10/3. * 优快云 :http://write.blog.youkuaiyun.com/postlist * GitHub :https://github.com/flyingfishes */ public class BaseApplication extends Application { @Override public void onCreate() { super.onCreate(); initOrm(); } public void initOrm(){ //初始化orm //初始化assets目录下面的所有xxx.orm.xml try { //遍历assets目录,找到根目录所有file String[] files = getAssets().list(""); for (String fileName : files){ //找到所有以.orm.xml结尾的文件 if (fileName.endsWith(".orm.xml")){ Orm orm = DBConfig.parse(getAssets().open(fileName)); DBConfig.mapping.put(fileName,orm); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
当然一定要记得这一步必须在清单文件中声明:
到这里我们的第一部分就讲完了,接下来我们进入第二部分
Reflect
操作,以及数据库操作的封装(这里是通过Reflect结合Orm对象实现),使用起来感觉很棒哦
。
