在開始使用LitePal时,要求在项目的assets文件夹下新建一个litepal.xml文件:

<?xml version="1.0" encoding="utf-8"?

> <litepal> <dbname value="Questionnaire"/> <version value="1"></version> <list> <mapping class="com.aliao.parser.entity.UserInfo"></mapping> <mapping class="com.aliao.parser.entity.SurveyInfo"></mapping> </list> </litepal>

该配置文件用来设定数据库的名字、版本以及全部的对象关系映射模型。

什么是对象关系映射模型?

由于sqlite数据库是关系型数据库,而编程是面向对象的,为了使用面向对象的方式来操作数据库,所以在关系数据库和实体对象之间做了一个映射,这样在进行数据库操作的时候,我们仅仅须要操作实体对象就可以,不须要直接处理sql语句。

在litepal.xml文件的<list>标签里来设置须要进行映射的对象,数据库里的每一张的表都相应一个实体对象类。

一个litepal.xml文件让我们在进行数据库基本信息配置上变得异常方便。那程序是怎么来获取到我们配置后的信息呢?

首先须要通过解析xml文件来获取到数据库名,版本号信息,以及须要映射的对象。

在Litepal里使用SAXParser来解析xml。那解析后的信息放在哪里呢,是由LitePalAttr该实体类来接收从litepal.xml里读取到的全部属性值。

本来想直接贴源代码的,还是立足源代码自己手动实现一下好了,勤奋宝宝在咬我,biaji biaji biaji~~~

创建一个LitePalAttr实体类,相应litepal.xml的属性及其set/get方法:

package com.aliao.parser.entity;import java.util.ArrayList;
import java.util.List;/*** Created by aliao on 2015/6/4.*/
public class LitePalAttr {private static LitePalAttr litePalAttr;//数据库版本号号private int version;//数据库名private String dbName;//全部在数据库中想要有映射关系的实体类private List<String> classNames;public int getVersion() {return version;}public void setVersion(int version) {this.version = version;}public String getDbName() {return dbName;}public void setDbName(String dbName) {this.dbName = dbName;}/*** 在sqlite里table_schema表示自己主动生成的,这里一定要手动加入进去* table_schema用来查看数据库的元数据。这里的元数据包含表名及表类型* @return*/public List<String> getClassNames() {if (classNames == null){classNames = new ArrayList<>();classNames.add("com.aliao.parser.entity.Table_Schema");}else if (classNames.isEmpty()){classNames.add("com.aliao.parser.entity.Table_Schema");}return classNames;}public void addClassName(String className){getClassNames().add(className);}/*** 这里用双重检測来实现单例模式* 整个程序创建一个唯一的litePalAttr对象,能够通过这个对象拿到数据库的基本信息* @return*/public static LitePalAttr getIntance(){if (litePalAttr == null){synchronized (LitePalAttr.class){if (litePalAttr == null){litePalAttr = new LitePalAttr();}}}return litePalAttr;}@Overridepublic String toString() {return "数据库名称:"+dbName+" ,数据库版本号"+version;}
}

接下来就是怎样解析litepal.xml的问题了。源代码里郭神使用SAXParser来解析,怎样使用SAXParser来解析一个xml文件的知识会单独写篇blog总结一下,这里就不啰嗦直接上吧。

解析litepal.xml须要创建两个类:

LitePalParser:这个类基本的操作就是创建解析器。然后解析文档

LitePalContentHandler(继承DefaultHandler):解析文档的详细实现,開始对文档进行扫描分析。将xml里的属性值保存到LitePalAttr的相应属性里。

创建解析器:

package com.aliao.parser.entity;import java.util.ArrayList;
import java.util.List;/*** Created by aliao on 2015/6/4.*/
public class LitePalAttr {private static LitePalAttr litePalAttr;//数据库版本号号private int version;//数据库名private String dbName;//全部在数据库中想要有映射关系的实体类private List<String> classNames;public int getVersion() {return version;}public void setVersion(int version) {this.version = version;}public String getDbName() {return dbName;}public void setDbName(String dbName) {this.dbName = dbName;}/*** 在sqlite里table_schema表示自己主动生成的,这里一定要手动加入进去* table_schema用来查看数据库的元数据,这里的元数据包含表名及表类型* @return*/public List<String> getClassNames() {if (classNames == null){classNames = new ArrayList<>();classNames.add("com.aliao.parser.entity.Table_Schema");}else if (classNames.isEmpty()){classNames.add("com.aliao.parser.entity.Table_Schema");}return classNames;}public void addClassName(String className){getClassNames().add(className);}/*** 这里用双重检測来实现单例模式* 整个程序创建一个唯一的litePalAttr对象,能够通过这个对象拿到数据库的基本信息* @return*/public static LitePalAttr getIntance(){if (litePalAttr == null){synchronized (LitePalAttr.class){if (litePalAttr == null){litePalAttr = new LitePalAttr();}}}return litePalAttr;}@Overridepublic String toString() {return "数据库名称:"+dbName+"\n数据库版本号:"+version+"\n\n数据库映射对象类名:";}
}

将xml的属性值保存到实体类相应属性里:

package com.aliao.parser.saxparser;import com.aliao.parser.entity.LitePalAttr;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;/*** Created by aliao on 2015/6/4.*/
public class LitePalContentHandler extends DefaultHandler{private LitePalAttr litePalAttr;@Overridepublic void startDocument() throws SAXException {litePalAttr = LitePalAttr.getIntance();litePalAttr.getClassNames().clear();//由于litePalAttr是静态的,所以假设再次进行解析要清空之前的数据}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {if ("dbname".equalsIgnoreCase(localName)){for (int i = 0; i<attributes.getLength(); i++){if ("value".equalsIgnoreCase(attributes.getLocalName(i))){litePalAttr.setDbName(attributes.getValue(i).trim());}}}else if ("version".equalsIgnoreCase(localName)){for (int i = 0; i<attributes.getLength();i++){if ("value".equalsIgnoreCase(attributes.getLocalName(i))){litePalAttr.setVersion(Integer.parseInt(attributes.getValue(i).trim()));}}}else if ("mapping".equalsIgnoreCase(localName)){for (int i = 0; i<attributes.getLength();i++){if ("class".equalsIgnoreCase(attributes.getLocalName(i))){litePalAttr.addClassName(attributes.getValue(i).trim());}}}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {super.endElement(uri, localName, qName);}@Overridepublic void endDocument() throws SAXException {super.endDocument();}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {super.characters(ch, start, length);}
}

在主程序里启动解析:

package com.aliao.parser.saxparser;import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;import com.aliao.parser.R;
import com.aliao.parser.entity.LitePalAttr;/*** Created by aliao on 2015/6/4.*/
public class LitePalParserFragment extends Fragment implements View.OnClickListener {public static final String TAG = LitePalParserFragment.class.getSimpleName();private TextView mTvResult;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_saxparser_litepal, container, false);}@Overridepublic void onViewCreated(View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);Button btnParse = (Button) view.findViewById(R.id.btn_parse_litepal);btnParse.setOnClickListener(this);mTvResult = (TextView) view.findViewById(R.id.tvSaxParserResult);}@Overridepublic void onClick(View v) {LitePalParser.parseLitePalConfiguration();showResult();}private void showResult() {mTvResult.setVisibility(View.VISIBLE);LitePalAttr mLitePalAttr = LitePalAttr.getIntance();StringBuffer sb = new StringBuffer(mLitePalAttr.toString());for (String className:mLitePalAttr.getClassNames()){sb.append("\n\n"+className);}mTvResult.setText("SAXParser解析litepal.xml结果:\n\n"+sb.toString());}
}

执行结果:

先到这吧

转载于:https://www.cnblogs.com/ljbguanli/p/6973468.html

解读郭神LitePal源代码-litepal.xml的解析相关推荐

  1. android开发--mp3播放器项目源代码(xml文件解析,.lrc,.mp3文件下载,同时显示歌词)

    一.mp3播放器源代码 1.MainActivity.java:在此中主要负责播放器首页的功能,包括服务器上的下载列表,和SD卡上已经下载的mp3文件列表package com.wyt.MP3play ...

  2. 配置郭神的LitePal(面向对象一样操作sqlite数据库,不再使用SQL语句)

    配置郭神的LitePal(面向对象一样操作sqlite数据库,不再使用SQL语句) 配置过程可见: https://github.com/guolindev/LitePal 但是我要补充一个小问题 然 ...

  3. Pull和SAX解析XML,以解析中国省市列表为例子

    废话不说直接上代码 //地区对象 public class Area { private String aName ; //地区名 private String aCode ; //地区号 publi ...

  4. Python Xml dom解析 输出json操作

    将region.xml文件解析为  列表  json格式 以下为xml文件部分内容: 1.DOMTree = xml.dom.minidom.parse('region.xml')       (获取 ...

  5. 自己实现JSON、XML的解析 没那么难

    本文的目的,不是针对现有的可用于生产环境的JSON.XML解析器源码进行剖析,而是介绍文本扫描的基础方法next(char),并以此为核心武器,根据目标语言的词法和语法特点,一步步地组织出条例清晰.易 ...

  6. Android中XML数据解析

    转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207 XML初步 今天我们来学习另一种非常重要的数据交换格式-XML.XML ...

  7. Spring 源码解读第七弹!bean 标签的解析

    Spring 源码解读继续. 本文是 Spring 系列第八篇,如果小伙伴们还没阅读过本系列前面的文章,建议先看看,这有助于更好的理解本文. Spring 源码解读计划 Spring 源码第一篇开整! ...

  8. Java菜鸟补给站--HTML,XML,以及解析XML

    目录 HTML,XML的区别 解析XML DOM解析 SAX解析 选择DOM还是选择SAX? DOM4J解析 JDOM解析 HTML,XML的区别 1. XML是区分大小写字母的,HTML不区分. 2 ...

  9. Oozie workflow.xml 视图解析

    最近半年多一直在做hive相关的开发工作,并且使用Oozie做为hive工作流的引擎,用于管理Hadoop任务.Oozie的任务流包括:croodinator.workflow.workflow用于描 ...

最新文章

  1. select初始化默认选项
  2. 【WC2014】紫荆花之恋【替罪羊思想】【动态点分树】【替罪羊树】
  3. python 列表、字典多排序问题
  4. BootStrap笔记-img相关
  5. shell for循环命令行_24 道 shell 脚本面试题
  6. 企业如何做好EDM-企业做EDM的方案设计
  7. 小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_18、SpringBoot测试进阶高级篇之MockMvc讲解...
  8. 用DW编写网页--个人简历
  9. for in在python中什么意思_python中for in的用法详解
  10. 慧正工作流注册码获取
  11. 【Unity】雷达 + 照片墙效果
  12. 7-1 统计大写辅音字母 (15 分)
  13. java,mysql,oracle出现科学记数法问题
  14. vmware设置虚拟机静态ip
  15. SAP PI/PO登录使用及基本功能简介
  16. 下载IE6的完整版的‘方法
  17. CleanMyMac 4.10.4
  18. adams中对槽口、凸轮等进行约束
  19. Python基础 if判断语句 篇
  20. 第十四届光学与光电子国际学术会议(SOPO 2022)

热门文章

  1. 模电之放大原理以及偏置电路
  2. ubuntu查看OpenGL版本
  3. 读书笔记——读《不断进步的电容器-片状陶瓷电容篇》
  4. CentOS 7 搭建Nextcloud私有云
  5. 【剑指offer】剪绳子(动态规划)
  6. GoF的23种设计模式速记
  7. TCGA下载基因表达矩阵、可视化分析
  8. 【Nginx】Nginx 1.22.0最新稳定正式版发布
  9. 【开心一笑】以后我结婚,如果新郎不是你怎么办?
  10. Vue 服务端渲染(SSR)、Nuxt2 - 从入门到实践