You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:45:30