android build error when add cast

本文介绍了如何解决在Android开发过程中遇到的编译错误,特别是当使用特定版本的库与项目API级别不匹配时出现的问题。通过调整项目的API级别或者更换兼容的库版本可以有效解决此类错误。
No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.

这是因为你的progject structer 是选的 API22 ,但是某个库需要23来编译,所以你改成23就行了

[img]http://dl2.iteye.com/upload/attachment/0115/5088/e7decb83-d4c4-3114-8e23-46327485a6b2.png[/img]

[img]http://dl2.iteye.com/upload/attachment/0115/5090/968f510c-9e76-38bc-9b95-72785babe158.png[/img]

[img]http://dl2.iteye.com/upload/attachment/0115/5092/3e38a0a2-ceb7-334e-a1e6-0b5724d1e07d.png[/img]

http://stackoverflow.com/questions/32075498/error-retrieving-parent-for-item-no-resource-found-that-matches-the-given-name


我项目用了cast,然后cast 第三方库里有个 compile 'com.google.android.gms:play-services-cast:8.4.0'
然后build出错,

[img]http://dl2.iteye.com/upload/attachment/0115/5158/1d295832-e457-3197-9511-e0a784f15180.png[/img]

后来换成 7.8.+ 就可以build了,但是这不是原因,原因还是在于两个playservice不一致导致的。 主项目里换成8.4.0 也可以解决这问题
<think>我们正在处理的问题是:在PostgreSQL中,当我们尝试将一个文本字段(text)与一个整数(integer)相加时,会得到错误“operatordoesnotexist:text+integer”。这是因为PostgreSQL要求操作符两侧的数据类型必须兼容。用户之前的操作是想要将一个字段的值增加15,但是该字段可能是文本类型(text),而不是数值类型。因此,我们需要通过类型转换来解决。解决方案:1.在更新语句中,我们需要将文本类型的字段转换为数值类型(例如integer或numeric),然后再进行加法运算。2.使用`CAST`函数或`::`操作符进行类型转换。例如,如果字段`indicatorvalue`是文本类型,我们可以这样写:```sqlUPDATEmv_js_build_sync_copy1SETindicatorvalue=CAST(indicatorvalueASINTEGER)+15;```但是,这里有一个问题:更新后,我们将一个整数值赋给了原本是文本类型的字段。这会导致该字段的类型不变但存储了整数文本?同时,如果原来的文本字段包含非数字字符(比如'abc'),转换会失败并抛出异常。因此,更安全的做法是:1.确保该字段的所有值都可以转换为整数,或者2.在更新之前处理掉非数字字符,或者只更新可以转换的记录。另外,更新后,由于我们转换成了整数并加15,然后再存回文本字段,所以实际上该字段的值变成了整数文本(如原来的'10'变成了'25')。但如果我们希望保持文本类型,就必须再转换回文本。不过,在PostgreSQL中,整数赋值给文本字段会自动转换吗?实际上,在赋值时,整数会被隐式转换为文本吗?这取决于数据库的设置和类型转换规则。但是,显式转换是更安全的。因此,我们可以这样:```sqlUPDATEmv_js_build_sync_copy1SETindicatorvalue=(CAST(indicatorvalueASINTEGER)+15)::TEXT;```但是,如果存在非数字字符,这个转换就会失败。为了避免整个更新失败,我们可以只更新那些可以转换为整数的记录,或者使用更安全的方式。另外,如果字段可能是空字符串,转换也会失败。我们可以先处理空字符串为0(如果业务允许)或者跳过。更安全的更新方法(只更新能够转换为整数的记录,并将无法转换的记录跳过):```sqlUPDATEmv_js_build_sync_copy1SETindicatorvalue=(CAST(indicatorvalueASINTEGER)+15)::TEXTWHEREindicatorvalue~'^[0-9]+$';--只更新由纯数字组成的字符串```或者,如果字段中可能有负数、小数等,需要调整正则表达式。如果无法转换的记录也需要更新为某个默认值,我们可以使用`CASE`语句或`TRY_CAST`(但是PostgreSQL没有TRY_CAST,我们可以用函数实现类似效果)。但是,如果数据量不大,我们可以先检查数据:```sqlSELECTindicatorvalueFROMmv_js_build_sync_copy1WHEREindicatorvalue!~'^[0-9]+$';```根据检查结果,再决定如何处理。因此,根据不同的情况,我们提供不同的解决方案:方案一:假设所有数据都可以转换为整数,或者希望更新失败时整体回滚(事务性更新):```sqlBEGIN;--将字段转换为整数类型(如果原本是text,而且需要永久改为整数类型,可以考虑修改表结构)ALTERTABLEmv_js_build_sync_copy1ALTERCOLUMNindicatorvalueTYPEINTEGERUSINGindicatorvalue::integer;--然后执行加法更新UPDATEmv_js_build_sync_copy1SETindicatorvalue=indicatorvalue+15;COMMIT;```注意:修改表结构会锁表,大表需谨慎。方案二:如果不修改表结构,只更新当前数据,并且数据都是数字字符串:```sqlUPDATEmv_js_build_sync_copy1SETindicatorvalue=(indicatorvalue::INTEGER+15)::TEXT;```方案三:只更新有效数字字符串,跳过无效的:```sqlUPDATEmv_js_build_sync_copy1SETindicatorvalue=(indicatorvalue::INTEGER+15)::TEXTWHEREindicatorvalue~'^[0-9]+$';```方案四:如果有无效数据,但希望无效数据也更新为一个固定值(比如0+15=15),可以使用正则表达式或函数进行转换,例如:```sqlUPDATEmv_js_build_sync_copy1SETindicatorvalue=CASEWHENindicatorvalue~'^[0-9]+$'THEN(indicatorvalue::INTEGER+15)::TEXTELSE'15'--如果原值不能转数字,则直接设为15(或者0+15=15)--或者保留原值不更新:ELSEindicatorvalueEND;```或者使用函数创建一个安全的转换函数:```sqlCREATEORREPLACEFUNCTIONto_integer(vtext)RETURNSINTEGERAS$$BEGINRETURNv::integer;EXCEPTIONWHENothersTHENRETURN0;END;$$LANGUAGEplpgsql;UPDATEmv_js_build_sync_copy1SETindicatorvalue=(to_integer(indicatorvalue)+15)::TEXT;```但要注意,创建函数需要权限,且这种方式效率较低。总结:根据业务需求和数据质量选择合适的方案。注意:执行更新前务必备份数据!根据用户之前的操作,我们推荐使用方案二(如果数据都是数字)或方案四(如果数据有非数字但想更新全部)。如果数据允许,最好修改表结构为整数类型(如果字段存储的都是整数的话)。相关问题:1.如何检查一个字符串是否表示整数?2.在PostgreSQL中修改表结构(修改列数据类型)的注意事项?3.如何为PostgreSQL自定义一个安全转换函数?4.PostgreSQL中的异常处理机制是怎样的?5.如何批量更新包含不同格式文本的数字列?</think> 在 PostgreSQL 中遇到 `operator does not exist: text + integer` 错误时,表明您正在尝试将文本类型与整数类型相加。以下是详细解决方案和最佳实践: ### 解决方案(分步操作) 1. **类型转换核心语法** 使用 `::` 或 `CAST()` 函数显式转换文本为数值类型: ```sql -- 方法1: 使用 :: 操作符 UPDATE mv_js_build_sync_copy1 SET indicatorvalue = (indicatorvalue::NUMERIC) + 15; -- 方法2: 使用 CAST 函数 UPDATE mv_js_build_sync_copy1 SET indicatorvalue = CAST(indicatorvalue AS NUMERIC) + 15; ``` 2. **安全更新建议** - **空值处理**:添加 `WHERE` 条件过滤无效数据 - **异常捕获**:使用安全转换函数避免转换失败 ```sql -- 带条件的安全更新 UPDATE mv_js_build_sync_copy1 SET indicatorvalue = ( CASE WHEN indicatorvalue ~ '^[0-9\.]+$' -- 只处理数字格式文本 THEN (indicatorvalue::NUMERIC) + 15 ELSE indicatorvalue::NUMERIC -- 保留原值或设为默认值 END ) WHERE indicatorvalue IS NOT NULL; -- 排除空值 ``` 3. **永久性解决方案(推荐)** 修改表结构,直接使用正确的数据类型: ```sql -- 步骤1: 备份数据 CREATE TABLE mv_js_build_sync_copy1_backup AS SELECT * FROM mv_js_build_sync_copy1; -- 步骤2: 修改列数据类型 ALTER TABLE mv_js_build_sync_copy1 ALTER COLUMN indicatorvalue TYPE NUMERIC USING indicatorvalue::NUMERIC; -- 步骤3: 执行数值计算 UPDATE mv_js_build_sync_copy1 SET indicatorvalue = indicatorvalue + 15; ``` ### 关键说明 1. **类型选择建议** - 整数用 `::INTEGER` - 小数用 `::NUMERIC` 或 `::DECIMAL` - 货币用 `::MONEY` 2. **安全注意事项** - 使用 `~ '^[0-9\.]+$'` 正则表达式确保文本为有效数字[^1] - 非数字文本转换会触发 `invalid input syntax` 错误 - 重要数据操作前**必须备份** 3. **性能优化** 大表更新时分批执行: ```sql WITH batches AS ( SELECT id FROM mv_js_build_sync_copy1 WHERE indicatorvalue ~ '^[0-9\.]+$' LIMIT 1000 -- 每批1000行 ) UPDATE mv_js_build_sync_copy1 t SET indicatorvalue = t.indicatorvalue::NUMERIC + 15 FROM batches b WHERE t.id = b.id; ``` ### 类型转换参考表 | 原始类型 | 目标类型 | 转换函数 | 适用场景 | |----------|------------|----------------------|----------------------| | TEXT | INTEGER | `value::INTEGER` | 纯整数文本 | | TEXT | NUMERIC | `value::NUMERIC` | 含小数的数值文本 | | TEXT | FLOAT | `value::REAL` | 科学计数法文本 | | VARCHAR | MONEY | `CAST(value AS MONEY)`| 货币格式文本 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值