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對象實現),使用起來感覺很棒哦。