Xamarin Android加载Firebase数据触发FirebaseException问题求助
Firebase数据库加载数据异常排查方案
问题背景
在Xamarin Android应用中从Firebase数据库加载全量数据时,持续抛出Firebase.Database.FirebaseException,但使用LimitToLast(10)配合OrderByKey()时可正常运行,怀疑是反序列化问题。数据由SQLite通过DB Browser导出JSON(或转CSV再转JSON)后上传至Firebase控制台。
调用栈信息
0xC in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:157,13 C# 0x6 in System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b__7_0 at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1021,49 C# 0xC in Android.App.SyncContext. at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.App/SyncContext.cs:36,19 C# 0xE in Java.Lang.Thread.RunnableImplementor.Run at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:36,6 C# 0x8 in Java.Lang.IRunnableInvoker.n_Run at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-30/mcw/Java.Lang.IRunnable.cs:84,4 C# 0x8 in Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PP_V at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:22,5 C#
数据加载代码
public async Task<List<Elementi>> SelectAll() { return (await firebase .Child("Test") .OnceAsync<ElementiDiRete>()).Select(elemento => new Elementi { Posizione = elemento.Object.Posizione, Comune = elemento.Object.Comune, Nome = elemento.Object.Nome, TipoElemento = elemento.Object.TipoElemento, idElemento = elemento.Object.idElemento, Area = elemento.Object.Area, Appartenenza = elemento.Object.Appartenenza, Coordinate = elemento.Object.Coordinate }).ToList(); }
Elementi实体类
public class Elementi { public int idElemento { get; set; } public string TipoElemento { get; set; } public string Nome { get; set; } public string Comune { get; set; } public string POP { get; set; } public string Posizione { get; set; } public string Area { get; set; } public int Coordinate { get; set; } public string Appartenenza { get; set; } }
排查与解决步骤
1. 补全ElementiDiRete类的检查
代码中使用OnceAsync<ElementiDiRete>进行反序列化,但未提供该类的定义。需确认:
- 该类的属性名称、数据类型与Firebase中
Test节点下的字段完全匹配(Firebase大小写敏感) - 若Firebase存在
ElementiDiRete未定义的字段,需添加[JsonIgnore]标记忽略,或补全对应属性 - 检查属性是否为可空类型:若Firebase中存在
null值,对应属性需设为可空(如int? Coordinate)
2. 检查Firebase数据中的异常值
全量加载报错但加载最后10条正常,大概率是部分数据存在反序列化无法处理的值:
- 核对
Coordinate字段:Firebase中是否存在字符串、小数或null值(代码中定义为int,无法转换非整数类型) - 检查其他字段:如
idElemento是否有非整数内容,字符串字段是否存在格式错误(如未闭合的引号) - 可在Firebase控制台筛选数据,逐一排查超出前10条的记录是否有异常
3. 修复JSON导出/转换的格式问题
从SQLite导出JSON时可能存在格式缺陷:
- 检查导出的JSON是否有语法错误(如多余逗号、缺失引号),可通过本地JSON校验工具验证
- 确保JSON字段名与实体类属性完全一致(包括大小写),SQLite导出可能自动转换字段名大小写
- 避免CSV转JSON时出现的格式丢失(如数值型字段被转为字符串)
4. 添加异常捕获获取详细错误信息
修改SelectAll方法,捕获并输出具体错误,定位反序列化失败的具体原因:
public async Task<List<Elementi>> SelectAll() { try { var data = await firebase.Child("Test").OnceAsync<ElementiDiRete>(); return data.Select(elemento => new Elementi { Posizione = elemento.Object.Posizione, Comune = elemento.Object.Comune, Nome = elemento.Object.Nome, TipoElemento = elemento.Object.TipoElemento, idElemento = elemento.Object.idElemento, Area = elemento.Object.Area, Appartenenza = elemento.Object.Appartenenza, Coordinate = elemento.Object.Coordinate }).ToList(); } catch (FirebaseException ex) { // 输出详细错误信息到日志或控制台 System.Diagnostics.Debug.WriteLine($"Firebase错误: {ex.Message}"); System.Diagnostics.Debug.WriteLine($"内部错误: {ex.InnerException?.Message}"); throw; } }
内容的提问来源于stack exchange,提问作者Exception
相关产品推荐
相关产品推荐

