之前一段时间自己封装了两个数据库,一个是ORM数据库,另一个是事件流数据库,项目相应的地址如下:
ORM数据库:https://github.com/wenjiang/SimpleAndroidORM
事件流数据库:https://github.com/wenjiang/EventStreamDB
有兴趣的人可以上去看看。
如果要讲这两个项目,一篇文章的篇幅是放不下的,所以就只是每篇都只讲一点点。
两个自己写的数据库都有一个必须用到的地方:在xml文件中配置数据库。
利用文件配置数据库在很多语言的框架中都有提供,因为这是一个很方便的特性:只要在一个地方对数据库进行配置,不用牵扯到具体的代码,可维护性更高。
在Android中,能想到的就是利用xml文件。
理论上,这个xml文件可以放在任何文件夹,但最好是放在assets文件夹内,因为这个文件夹内的文件是只读的,像是这种配置性文件当然是只读的。
现在我们就来规定这个xml文件内的东西。
我们在assets文件夹内创建一个database.xml文件,该文件就是数据库的配置文件。
xml文件可以允许我们自己定义标签,只要我们有对应的xml解析器就行。
对于数据库的配置,常见的有三种:数据库名字,版本和表。
database.xml文件的内容如下:
<?xml version="1.0" encoding="utf-8"?> <database> <!-- 数据库名称 --> <dbname value="zwb.db"></dbname> <!-- 数据库版本 --> <version value="1"></version> <!-- 数据库表 --> <list> <mapping class="com.zwb.args.dbpratice.model.Status"></mapping> <mapping class="com.zwb.args.dbpratice.model.User"></mapping> </list> </database>
当然,这些标签都可以自己定义,像是mapping就可以改为table,但如果某些标签是一组的,最好就是放进list标签里,这样方便xml解析器解析。
现在我们有了自己的xml文件,可以开始编写xml解析器了。
首先是读取assets下的database.xml文件。
Android提供了assets文件夹的读取方法:
InputStream in = null; try { in = context.getResources() .getAssets().open("database.xml"); } catch (IOException e) { throw new BaseSQLiteException("database.xml is not exist"); }
Android 中读取系统文件或者资源的时候,都可以通过getResources方法获取到Resources对象,然后通过这个对象获取到相应的资源。
得到database.xml文件的InputStream之后,就可以开始读取文件内容了。
读取xml文件可以利用XmlPullParserFactory这个类。
XmlPullParserFactory factory; try { factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(in, "UTF-8"); int evtType = xpp.getEventType(); // 一直循环,直到文档结束 while (evtType != XmlPullParser.END_DOCUMENT) { switch (evtType) { case XmlPullParser.START_TAG: String tag = xpp.getName(); if (tag.equals("dbname")) { dbName = xpp.getAttributeValue(0); } else if (tag.equals("version")) { version = Integer.valueOf(xpp.getAttributeValue(0)); } else if (tag.equals("mapping")) { tableSet.add(xpp.getAttributeValue(0)); } break; case XmlPullParser.END_TAG: break; default: break; } //获得下一个节点的信息 evtType = xpp.next(); } } catch (Exception e) { LogUtil.e(e.toString()); } finally { List<String> tableList = new ArrayList<String>(); for (String table : tableSet) { tableList.add(table); }
我们前面定义的xml文件是DOM格式的xml文件,所以需要检验该xml文件是否合法,否则就可能发生解析失败。检验的方法就是设置setNamespaceAware为true。
现在我们已经解析xml文件,并将相应的节点信息放在tableList里面。
后面会讲如何通过这些解析出来的信息构建数据库信息。