Android、iOS平台下如何在Firestore数据库中读写数组?
解决Firestore保存数组的跨平台问题
问题根源
你的RestaurantInfoModel里使用了非泛型的System.Array,Xamarin Android/iOS的Firestore SDK无法直接将其转换为平台兼容的数组类型(Android需要Java侧的集合类型,iOS需要Foundation框架的NSArray),从而触发类型转换错误。
解决方案步骤
1. 修改数据模型
把Categories的类型从Array改为泛型List<string>(若你的分类是其他类型,可对应调整泛型参数),泛型集合在跨平台转换时兼容性更强:
using System; using System.Collections.Generic; using SQLite; namespace tipAppRestaurant.Model { public class RestaurantInfoModel { public string Id { get; set; } public string RestaurantId { get; set; } public List<string> Categories { get; set; } // 替换原Array类型 } }
2. 修复Android端代码
需要将C#的List<string>转换为Java侧的Java.Util.ArrayList,才能符合Dictionary<string, Java.Lang.Object>的类型要求:
public bool Insert_restaurantInfo(RestaurantInfoModel restaurantInfo) { try { // 将C# List转为Java ArrayList var javaCategories = new Java.Util.ArrayList(restaurantInfo.Categories); var restaurantInfoDocument = new Dictionary<string, Java.Lang.Object> { {"restaurantId", Firebase.Auth.FirebaseAuth.Instance.Uid}, {"categories", javaCategories} }; var collection = FirebaseFirestore.Instance.Collection("restaurants"); collection.Add(new HashMap(restaurantInfoDocument)); return true; } catch(Exception ex) { // 建议添加日志输出,方便调试异常 // Console.WriteLine(ex.Message); return false; } }
3. 修复iOS端代码
iOS的NSArray无法直接接收System.Array,需要将List<string>中的每个元素转为NSString,再通过NSArray.FromObjects生成兼容的NSArray:
public bool Insert_restaurantInfo(RestaurantInfoModel restaurantInfo) { try { // 将C# List转为NSObject数组,再生成NSArray var nsCategories = restaurantInfo.Categories .Select(c => new NSString(c)) .ToArray(); var keys = new[] { new NSString("restaurantId"), new NSString("categories") }; var values = new NSObject[] { new NSString(Firebase.Auth.Auth.DefaultInstance.CurrentUser.Uid), NSArray.FromObjects(nsCategories) }; var document = new NSDictionary<NSString, NSObject>(keys, values); var collection = Firebase.CloudFirestore.Firestore.SharedInstance.GetCollection("restaurants"); collection.AddDocument(document); return true; } catch(Exception ex) { // 建议添加日志输出,方便调试异常 // Console.WriteLine(ex.Message); return false; } }
额外说明
- 若
Categories不是字符串类型,只需对应调整泛型类型(比如List<int>)和平台转换代码(Android侧转对应Java类型,iOS侧转对应NSObject子类)即可。 - 开发中尽量避免使用非泛型
System.Array,泛型集合在Xamarin跨场景下兼容性更好,也更易维护。
内容的提问来源于stack exchange,提问作者Entity_45
相关产品推荐
相关产品推荐

