我在上一篇博客提到过我在做一个创训的项目,就是一个基于百度地图的简单记事本应用,这个应用目前已经完成,但是前几天在开发过程中遇到的一个问题,我感觉比较有意思,于是就分享出来。
项目背景:
两个activity之间通过intent实现数据传递。
Mainactivity:展示地图,同时当用户点击地图上的某点时,记录下被点击点的经纬度数值,将其保存进intent中,随着startactivity(intent);而传递到另一个activity中,注意,这个经纬度坐标是从LatLng对象中取出的,但是该对象中默认经纬度都是用double变量存储的;
另外,我在MainActivity中写了一个init()的方法,即每次创建该activity的时候就在数据库中存储的经纬度坐标上标记一个“marker”,而用户即可通过这个marker找到之前基于这个点保存的数据。
EditActivity:接收MainActivity传过来的intent,并从中取出经纬度数值,加上当前activity中得到的用户输入的信息,一起保存进sqlite数据库中。
错误现象:
每次执行MainActivity中的init()方法的时候,我都会首先从数据库中取出数据,因为在数据库中我把经纬度都设置为varchar类型,而LatLng对象中的经纬度是double型,我就必须得先把取出的数据转换成double型,而每当这时候程序就会报错,而且根据报错信息发现,从数据库中取出的经纬度数据都是null!这让我百思不得其解,一直纠结了两天没有发现问题……
init方法代码如下:
private void init(){
List<Item> items=new ArrayList<Item>();
System.out.println(getIntent().getStringExtra("password"));
items=getData(getIntent().getStringExtra("password"));
for(Item i:items){
String latitude = i.getLatitude();
String longitude = i.getLongitude();
System.out.println("username"+i.getUsername());
System.out.println("password"+i.getPassword());
System.out.println("标记!----->latitude:"+latitude+" longitude:"+longitude);
System.out.println("内容:------>"+i.getContent());
if(latitude != null && !"".equals(latitude.trim())&&longitude != null && !"".equals(longitude.trim())){
double dlatitude = Double.parseDouble(latitude);
double dlongitude = Double.parseDouble(longitude);
LatLng point = new LatLng(dlatitude, dlongitude);
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap);
//在地图上添加Marker,并显示
mBaiduMap.addOverlay(option);
}
排错结果:
后来我在检查代码的时候无意中发现,在我从LatLng对象中取出经纬度数值之后根本没有进行类型转换,将其转换为String类型,相反,我直接将double型的数据保存进了intent对象中,而在EditActivity中依旧没有发现这个问题,最后把double型的数据保存进了varchar类型的字段中,于是造成了这个问题。
这中间,最坑爹的部分在于,当我把double型数据保存进varchar字段的时候,程序完全没有报错,而是直接保存了一个Null进去!于是导致这个问题非常地隐蔽,让我费了好大力气才发现。
人家都说程序员是最耐心,最细致的一类人,看来我还不够细心,还有待修炼啊,加油~