Orm之XML解析

Orm_Reflect_DB——Orm(XML)

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對象實現),使用起來感覺很棒哦大笑
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章