標籤:
之前一段時間自己封裝了兩個資料庫,一個是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裡面。
後面會講如何通過這些解析出來的資訊構建資料庫資訊。
Android通過xml檔案設定資料庫