簡(jiǎn)介
本項(xiàng)目基于Davanum Srinivas開(kāi)發(fā)的BrowseMap,BrowseMap是一個(gè)為Android開(kāi)發(fā)的Google Maps瀏覽器,能提供:
(這樣的地圖應(yīng)用程序基礎(chǔ)功能實(shí)際上已經(jīng)在Android上實(shí)現(xiàn)了)
但是MapMe在這些基礎(chǔ)功能之上提供了不少新特性,這都得感謝db4o對(duì)象持久引擎:
- 把位置信息登記到db4o(完整的地圖持久化,包括縮放級(jí)別以及衛(wèi)星交通視圖)
- 瀏覽書(shū)簽列表
- 編輯書(shū)簽
- 從書(shū)簽中導(dǎo)航到地圖上某個(gè)位置
- 根據(jù)當(dāng)前GPS所報(bào)告的位置居中顯示地圖
屏幕截圖
想看應(yīng)用程序是如何運(yùn)作的,你可以觀看在YouTube上的MapMe視頻、從一個(gè)外部服務(wù)器下載高分辨率視頻(30 Mb)或下面的屏幕截圖:
db4o總部(衛(wèi)星+交通視圖)
MapMe主菜單:
建立書(shū)簽/導(dǎo)航點(diǎn)(navpoint):
保存的書(shū)簽/導(dǎo)航點(diǎn)(navpoint)列表:
MapMe是如何運(yùn)用db4o的
如果你查看源代碼(下面有下載),你會(huì)發(fā)現(xiàn)DB helper類處理了所有的持久化操作(開(kāi)啟、存儲(chǔ)、查詢、計(jì)數(shù)數(shù)據(jù)庫(kù)),而這一切都不超過(guò)80行代碼!
這一切都很簡(jiǎn)單,而且不會(huì)喪失性能。讓我們來(lái)看一些項(xiàng)目中用到的持久化方法。
開(kāi)啟數(shù)據(jù)庫(kù)
開(kāi)啟數(shù)據(jù)庫(kù)的確簡(jiǎn)單,并且在必要的時(shí)候還能自動(dòng)生成數(shù)據(jù)庫(kù)文件。一旦打開(kāi),db4o將鎖定數(shù)據(jù)庫(kù)文件。
?????? try ?{
???????????? if (oc? == ? null ? || ?oc.ext().isClosed())
??????????????????oc? = ?Db4o.openFile(dbConfig(),?db4oDBFullPath(context));
???????????? return ?oc;
??????}? catch ?(Exception?e)?{
????????????Log.e(Db4oHelper. class .getName(),?e.toString());
???????????? return ? null ;
??????}
}
?
private ?String?db4oDBFullPath(Context?ctx)?{
?????? return ?ctx.getDataDir()? + ? " / " ? + ? " browsemap.db4o " ;
}
注意我們所存放的數(shù)據(jù)庫(kù)文件路徑是和上下文數(shù)據(jù)目錄有關(guān)的。
配置數(shù)據(jù)庫(kù)
這里我們提供一個(gè)配置對(duì)象,以便在打開(kāi)數(shù)據(jù)庫(kù)的時(shí)候把它傳遞進(jìn)去(代碼如下)。
??????Configuration?c?=?Db4o.newConfiguration();
??????c.objectClass(MapBookmark.class).objectField("name").indexed(true);
??????c.objectClass(MapBookmark.class).updateDepth(2);
??????c.objectClass(MapBookmark.class).minimumActivationDepth(3);
??????c.objectClass(MapBookmark.class).cascadeOnDelete(true);
??????return?c;
}?
注意,為MapBookmark對(duì)象建立的索引字段是“name”,并設(shè)置激活和更新級(jí)別。
保存書(shū)簽
在這里我們調(diào)用一系列的操作,無(wú)論對(duì)象是否存在于數(shù)據(jù)庫(kù),對(duì)象都會(huì)被更新或插入。
????????????????????????String?name,
????????????????????????String?description,
????????????????????????int?latitude,
????????????????????????int?longitude,
????????????????????????int?zoomLevel,
????????????????????????boolean?satellite,
????????????????????????boolean?traffic){
?????
??????MapBookmark?bkm?=?getBookmark(name);
??????if(bkm?==?null)
????????????bkm?=?new?MapBookmark(name);
??????bkm.setDescription(description);
??????bkm.setLatitude(latitude);
??????bkm.setLongitude(longitude);
??????bkm.setZoomLevel(zoomLevel);
??????bkm.setSatellite(satellite);
??????bkm.setTraffic(traffic);
??????db().set(bkm);
??????db().commit();
}
在保存到數(shù)據(jù)庫(kù)之前,我們?cè)O(shè)置好所有字段。
根據(jù)名字查詢書(shū)簽
我們通過(guò)Query by Example(QBE)傳入一個(gè)原型來(lái)取回以名字為條件的書(shū)簽。
??????MapBookmark?proto?=?new?MapBookmark(name);
??????ObjectSet?result?=?db().get(proto);
??????if(result.hasNext()){
????????????return?(MapBookmark)result.next();
??????}
??????return?null;
}
QBE利用反射來(lái)檢查原型對(duì)象的字段。
查詢所有書(shū)簽
這里我們把SODA查詢結(jié)果拷貝到ArrayList中。但要注意,當(dāng)使用Native Queries時(shí)你不必這樣做(在這種情況下將直接返回List<MapBookmark>)。
??????ArrayList<MapBookmark>?ret?=?new?ArrayList<MapBookmark>();
????????ObjectSet?result?=?getBookmarks();
????????while?(result.hasNext())
????????????ret.add((MapBookmark)result.next());
????????return?ret;
}
???
private?ObjectSet?getBookmarks(){
??????Query?query?=?db().query();
??????query.constrain(MapBookmark.class);
??????query.descend("name").orderAscending();
??????return?query.execute();
}
刪除書(shū)簽
??????MapBookmark?bkm?=?getBookmark(name);
??????if(bkm?!=?null){
????????????db().delete(bkm);
????????????db().commit();
??????}
}?
如果你的對(duì)象在db4o參考系統(tǒng)中存在,你可以輕松的調(diào)用delete()操作從數(shù)據(jù)庫(kù)中刪除它。
書(shū)簽計(jì)數(shù)
??????return?getBookmarks().size();
}
???
private?ObjectSet?getBookmarks(){
??????Query?query?=?db().query();
??????query.constrain(MapBookmark.class);
??????query.descend("name").orderAscending();
??????return?query.execute();
}
要通過(guò)查詢來(lái)進(jìn)行對(duì)象計(jì)數(shù),你只要詢問(wèn)查詢結(jié)果的大小即可。
待完成
- 基于書(shū)簽的查詢功能(通過(guò)db4o查詢)
- 支持手勢(shì)識(shí)別(gesture recognition)(鏈接)
- 當(dāng)前位置提示(Tweet current location)(鏈接)
- 把跟蹤到的GPS位置接收到屏幕上并把GPS路線存儲(chǔ)到數(shù)據(jù)庫(kù)上(以便今后查看)
- 把位置發(fā)送給聯(lián)系人(短消息、e-mail等)
下載
MapMe.Zip
YouTube上的MapMe視頻
高分辨率視頻(30 Mb)
請(qǐng)注意!引用、轉(zhuǎn)貼本文應(yīng)注明原譯者:RosenJiang 以及出處:http://www.aygfsteel.com/rosen