Orm之XML解析

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.
 * CSDN :http://write.blog.csdn.net/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.
 * CSDN :http://write.blog.csdn.net/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.
 * CSDN :http://write.blog.csdn.net/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.
 * CSDN :http://write.blog.csdn.net/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;
   }
}
实体类和工具类写完之后,我们只需要在Application初始化的时候获取到XML中的内容Orm集合(对应所有的XML关系映射文件,这里只写举例一个Student,当然不管多少个映射文件,都不需要改动library的代码),那么我们就可以在数据库操作建立Model的时候使用了。
这里我们建议一个 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.
 * CSDN :http://write.blog.csdn.net/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对象实现),使用起来感觉很棒哦大笑
源码:Orm_Reflect_DB
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值