XML文件报错与R文件ID报错解决方法

本文详细解析了在Android开发中遇到的资源找不到错误(ResourceNotFoundException)和BinaryXML文件行数错误的问题,分享了一种常见但易忽视的解决方案:确保图片资源正确放置在drawable文件夹而非drawable-v24中,避免因路径问题导致的资源加载失败。

报错一:

android.content.res.Resources$NotFoundException: Resource ID

报错二:

Binary XML file line # : Error inflating class

解决方法:

百度很多问题都无法解决。最后发现错误原因比较基础,是我直接将png文件复制进 drawable 文件夹里时,没修改路径,导致默认保存到drawable-v24文件夹内。应该在copy图片进来的时候手动更改路径为drawable,如图:

下图这三个图片文件是不一样的!在我Android 6.0的设备上,addimg.png可以读到,但是addimg.png(v24)addimg.png(v26)这两个图片是读不到的!一直报前两个错误。

copy有风险,一定要注意路径!!

 

在MyBatis的XML映射文件中,`<=`符号在动态SQL的`<if>`标签中可能导致解析错误,因为XML解析器会将`<=`视为标签的开始符号(似`<`的处理方式)。以下是解决方案和详细说明: --- ### **错误原因** XML文件中直接使用`<=`会被解析为非法标签结构,导致以下报错: ``` Error parsing Mapper XML. Cause: org.xml.sax.SAXParseException; lineNumber: X; columnNumber: Y; The content of elements must consist of well-formed character data or markup. ``` --- ### **解决方案** #### 方法1:使用XML转义字符 将`<=`替换为对应的XML转义实体: - `<=` → `<=` - `>=` → `>=` ```xml <if test="age != null"> and age >= #{age} and age <= #{ageEnd} </if> ``` #### 方法2:使用CDATA包裹条件 通过`<![CDATA[ ]]>`避免XML解析干扰: ```xml <if test="age != null"> <![CDATA[ and age >= #{age} and age <= #{ageEnd} ]]> </if> ``` #### 方法3:调整逻辑避免直接比较(推荐) 将范围查询拆分为两个独立条件: ```xml <if test="age != null"> and age >= #{age} </if> <if test="ageEnd != null"> and age <= #{ageEnd} </if> ``` --- ### **完整示例** ```xml <select id="selectByAgeRange" resultType="User"> SELECT * FROM user WHERE 1=1 <if test="age != null"> and age >= #{age} </if> <if test="ageEnd != null"> and age <= #{ageEnd} </if> </select> ``` --- ### **其他注意事项** 1. **动态SQL中的特殊字符** 以下符号在XML中需转义或使用CDATA: - `<` → `<` - `>` → `>` - `&` → `&` - `'` → `&apos;` - `"` → `"` 2. **MyBatis版本差异** - MyBatis 3.5.0+ 对动态SQL的解析更严格,建议始终使用转义或CDATA。 3. **日志调试** 开启MyBatis日志检查实际生成的SQL: ```properties # application.properties logging.level.your.mapper.package=DEBUG ``` 4. **参数校验** 确保传入的`age`和`ageEnd`为数值型,避免型不匹配: ```java // 调用示例 Map<String, Object> params = new HashMap<>(); params.put("age", 20); // Integer型 params.put("ageEnd", 30); // Integer型 sqlSession.selectList("selectByAgeRange", params); ``` --- ### **常见问题扩展** 1. **如何在动态SQL中安全使用字符串比较?** → 字符串比较需加引号并转义: ```xml <if test="name != null"> and name = '${name}' <!-- 注意:${}需手动防SQL注入 --> <!-- 或 --> and name = #{name} <!-- 推荐:自动预编译 --> </if> ``` 2. **如何处理动态SQL中的NULL值默认值?** → 使用MyBatis的`<choose>`标签: ```xml <choose> <when test="age != null">and age = #{age}</when> <otherwise>and age = 18</otherwise> <!-- 默认值 --> </choose> ``` 3. **XML文件编码问题** → 确保文件保存为UTF-8(无BOM),并在XML头声明: ```xml <?xml version="1.0" encoding="UTF-8"?> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值