zoukankan      html  css  js  c++  java
  • Android通过xml文件配置数据库

         之前一段时间自己封装了两个数据库,一个是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里面。

             后面会讲如何通过这些解析出来的信息构建数据库信息。

  • 相关阅读:
    谷雨路
    ObjectiveC_2.0大全.pdf iOS 5 Programming Cookbook http://www.devdiv.com
    http://www.120ask.com/zjamk/13/13658784.htm
    iPhone学习系列、代码教程___持续更新中
    30天精通iPhone手机编程
    font
    iPhone开发学习资料汇总
    tools
    http://blog.csdn.net/likendsl
    http://blog.csdn.net/iukey
  • 原文地址:https://www.cnblogs.com/wenjiang/p/4492303.html
Copyright © 2011-2022 走看看