数据类型转换不当导致数据库不能正确插入数据问题

本文介绍了一款基于百度地图的应用开发过程中的问题。主要讨论了如何在两个Activity间正确传递和存储经纬度坐标数据,包括数据类型转换的重要性及错误排查经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在上一篇博客提到过我在做一个创训的项目,就是一个基于百度地图的简单记事本应用,这个应用目前已经完成,但是前几天在开发过程中遇到的一个问题,我感觉比较有意思,于是就分享出来。

项目背景:

两个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进去!于是导致这个问题非常地隐蔽,让我费了好大力气才发现。

人家都说程序员是最耐心,最细致的一类人,看来我还不够细心,还有待修炼啊,加油~

### 达梦数据库数据类型不匹配的原因及解决方案 #### 原因分析 当在达梦数据库中遇到数据类型不匹配的问题时,通常是因为插入或更新的数据与目标字段定义的类型不符。这种错误可能由以下几个方面引起: 1. **字段类型的差异** 插入或更新的数据类型与表结构中的字段类型不一致。例如,尝试向`VARCHAR2`类型的字段插入整数或将字符串插入到数值型字段中[^2]。 2. **隐式转换失败** 当数据库试图自动将一种数据类型转换为目标字段所需的另一种类型时,可能会发生不可逆的转换错误。例如,在某些情况下,浮点数无法精确表示为整数。 3. **约束条件冲突** 如果表中有定义好的约束(如外键、唯一性约束),而插入或更新的数据违反了这些约束,则会引发异常。这不仅涉及数据类型本身,还可能涉及到数据范围或格式的要求。 4. **驱动程序版本问题** 使用不当的JDBC驱动版本可能导致客户端发送给服务器的数据被误解或处理方式不同步,从而造成类型不匹配的情况。因此,确保选用适合当前达梦数据库版本的JDBC驱动至关重要[^1]。 #### 解决方案 针对上述提到的各种可能性,可以采取如下措施来解决问题: 1. **验证并调整数据类型一致性** - 检查SQL语句中待插入/更新的数据及其对应的目标列的数据类型是否完全吻合。 - 对于复杂查询结果集作为输入源的情形下,需确认每一条记录都满足目标表各字段的需求标准。 2. **显式指定数据类型转换** 利用CAST() 或 CONVERT() 函数强制执行必要的类型转换操作前再提交至数据库层面上去存储。下面是一个简单的例子展示如何应用这两个函数之一来进行日期时间戳之间的相互转变过程: ```sql -- 将字符形式的时间串转成DATE类型后再存入库内相应位置上 INSERT INTO my_table (date_column) VALUES (TO_DATE('2023-10-07', 'YYYY-MM-DD')); ``` 3. **审查现有约束设置** 查找是否有任何适用于此事务期间所影响行上的特殊规则限制,并依据实际情况决定要么修正源头供给端提供的参数值使其合法化;要么临时解除部分不必要的控制以便顺利完成写入动作之后再恢复原状。 4. **升级或校准JDBC连接器配置** 参考官方发布的最新版次说明文档挑选最贴近实际部署环境需求状况下的适配组件下载安装好以后重新测试联机功能表现情况看能否彻底消除之前存在的隐患现象。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值