React Native Firebase iOS端数字数组用array-contains-any查询失效问题
React Native Firebase Firestore 数字数组查询iOS端失效问题
数据库情况
selectedJobTypesArr 字段为数字类型数组,元素均来自选择器直接输出,为数字格式。
实现代码
通过array-contains-any算子匹配selectedJobTypesArr中包含任意传入值的记录,代码如下:
export const hasMatchingJobType = (user_id, jobTypeCodeArr) => { return new Promise((resolve, reject) => { let foundFlag = false; firestore() .collection('profiles') .where('user_id', '==', user_id) .where('selectedJobTypesArr', 'array-contains-any', jobTypeCodeArr) .orderBy('preferredName') .get() .then((value) => { value.docs.map((doc) => { foundFlag = true; }); resolve(foundFlag); }); }); };
测试调用代码:
const user_id = 'TUJawBQN9ge9qNl1l5Qi320UZXK2'; const jobTypeCodeArr = [101, 102, 103, 104, 105]; hasMatchingJobType(user_id, jobTypeCodeArr).then((res) => { console.log('res ', res); });
问题表现
- 预期:传入匹配数据时函数返回
true - 实际:iOS端返回
false,Android端返回正常。如果将数据库数组元素改为字符串类型,双端均返回正常。
运行环境
- 依赖版本:
@react-native-firebase/firestore@11.4.1 - Android端build.gradle配置:
ext { buildToolsVersion = "29.0.2" minSdkVersion = 21 compileSdkVersion = 30 targetSdkVersion = 30 }
- iOS端Podfile配置:
$FirebaseSDKVersion = '8.0.0'
问题根因
这是@react-native-firebase/firestore v11.x版本和iOS端Firebase SDK 8.0.0的兼容缺陷:数字类型参数在iOS端调用array-contains-any算子时,会被错误转换为字符串类型传递给Firestore服务,无法匹配数据库中存储的数字类型值,Android端无此转换问题。
修复方案
方案1:升级依赖(推荐)
将@react-native-firebase/firestore升级到12.0.0及以上版本,同时将iOS端Podfile中的$FirebaseSDKVersion调整为8.5.0及以上版本,官方已在后续版本修复了该类型转换缺陷。
方案2:统一字段类型为字符串
如果暂时无法升级依赖,可将数据库中selectedJobTypesArr字段存储内容改为字符串类型,查询时传入的jobTypeCodeArr元素也统一转换为字符串,可兼容双端查询逻辑。
方案3:临时兼容处理
不修改存储结构的情况下,对iOS端查询参数做特殊处理即可:
import { Platform } from 'react-native'; // 查询前先处理参数 const queryArr = Platform.OS === 'ios' ? jobTypeCodeArr.map(item => Number(item)) : jobTypeCodeArr; // 后续查询使用处理后的queryArr .where('selectedJobTypesArr', 'array-contains-any', queryArr)
内容的提问来源于stack exchange,提问作者bugman
相关产品推荐
相关产品推荐

