MapMe(翻译)

简介

本项目基于Davanum Srinivas开发的BrowseMapBrowseMap是一个为Android开发的Google Maps浏览器,能提供:

  • 在Android上浏览Google Maps
  • 地图的放大和缩小
  • 跟随鼠标移动(在真实设备上应该是触摸屏)
  • 交通和卫星视图之间转换
  • 定位

(这样的地图应用程序基础功能实际上已经在Android上实现了)

但是MapMe在这些基础功能之上提供了不少新特性,这都得感谢db4o对象持久引擎:

  • 把位置信息登记到db4o(完整的地图持久化,包括缩放级别以及卫星交通视图)
  • 浏览书签列表
  • 编辑书签
  • 从书签中导航到地图上某个位置
  • 根据当前GPS所报告的位置居中显示地图

屏幕截图

想看应用程序是如何运作的,你可以观看在YouTube上的MapMe视频、从一个外部服务器下载高分辨率视频(30 Mb)或下面的屏幕截图:

db4o总部(卫星+交通视图)

New-1.Png

MapMe主菜单:

New-2.Png

建立书签/导航点(navpoint):

New-3.Png

保存的书签/导航点(navpoint)列表:

New-4.Png

MapMe是如何运用db4o的

如果你查看源代码(下面有下载),你会发现DB helper类处理了所有的持久化操作(开启、存储、查询、计数数据库),而这一切都不超过80行代码!

这一切都很简单,而且不会丧失性能。让我们来看一些项目中用到的持久化方法。

开启数据库

开启数据库的确简单,并且在必要的时候还能自动生成数据库文件。一旦打开,db4o将锁定数据库文件。

public  ObjectContainer db(){

      
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 " ;

}

注意我们所存放的数据库文件路径是和上下文数据目录有关的。

配置数据库

这里我们提供一个配置对象,以便在打开数据库的时候把它传递进去(代码如下)。

private  Configuration dbConfig(){

      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对象建立的索引字段是“name”,并设置激活和更新级别。

保存书签

在这里我们调用一系列的操作,无论对象是否存在于数据库,对象都会被更新或插入。

public   void  setBookmark(

                        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();

}

在保存到数据库之前,我们设置好所有字段。

根据名字查询书签

我们通过Query by Example(QBE)传入一个原型来取回以名字为条件的书签。

public  MapBookmark getBookmark(String name){

      MapBookmark proto 
=   new  MapBookmark(name);

      ObjectSet result 
=  db().get(proto);

      
if (result.hasNext()){

            
return  (MapBookmark)result.next();

      }

      
return   null ;

}

QBE利用反射来检查原型对象的字段。

查询所有书签

这里我们把SODA查询结果拷贝到ArrayList中。但要注意,当使用Native Queries时你不必这样做(在这种情况下将直接返回List<MapBookmark>)。

public  List < MapBookmark >  getBookmarkList(){

      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();

}

删除书签

public   void  deleteBookmark(String name) {

      MapBookmark bkm 
=  getBookmark(name);

      
if (bkm  !=   null ){

            db().delete(bkm);

            db().commit();

      }

如果你的对象在db4o参考系统中存在,你可以轻松的调用delete()操作从数据库中删除它。

书签计数

public   int  bookamrkCount(){

      
return  getBookmarks().size();

}

   

private  ObjectSet getBookmarks(){

      Query query 
=  db().query();

      query.constrain(MapBookmark.
class );

      query.descend(
" name " ).orderAscending();

      
return  query.execute();

}


要通过查询来进行对象计数,你只要询问查询结果的大小即可。

待完成

  • 基于书签的查询功能(通过db4o查询)
  • 支持手势识别(gesture recognition)(链接
  • 当前位置提示(Tweet current location)(链接
  • 把跟踪到的GPS位置接收到屏幕上并把GPS路线存储到数据库上(以便今后查看)
  • 把位置发送给联系人(短消息、e-mail等)

下载

MapMe.Zip
YouTube上的MapMe视频
高分辨率视频(30 Mb)

请注意!引用、转贴本文应注明原译者:RosenJiang 以及出处:http://www.blogjava.net/rosen

167622.html

Rosen 2007-12-13 23:44 发表评论
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值