之前一段時間自己封裝了兩個數據庫,一個是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里面。
后面會講如何通過這些解析出來的信息構建數據庫信息。