Xamarin Firebase 连接中的 NullReferenceException

NullReferenceException in Xamarin Firebase connection

提问人: 提问时间:2/24/2021 最后编辑:Frank van Puffelen 更新时间:2/24/2021 访问量:185

问:

我正在将我的 xamarin 应用程序连接到 firebase,我创建了一个完整的 CRUD 函数并将其实现到我的应用程序中。

我认为我做的一切都是正确的,但实际上我没有,因为 UPDATE 和 DELETE 功能并没有真正起作用。

我可以将项目添加到数据库,但不能更新或删除它们。当我尝试更新或删除项目时,我的更新和删除功能出现错误。

这是我的FirebaseHelper.cs,其中包含所有CRUD函数:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Firebase.Database;
using Firebase.Database.Query;

namespace ElseWareApp.Models
{
    public class FirebaseHelper
    {
        FirebaseClient firebase = new FirebaseClient("https://urldb-4fcca-default-rtdb.firebaseio.com/");

        public async Task<List<Person>> GetAllPersons()
        {

            return (await firebase
                .Child("Persons")
                .OnceAsync<Person>()).Select(item => new Person
            {
                Name = item.Object.Name,
                PersonId = item.Object.PersonId
            }).ToList();
        }

        public async Task AddPerson(int personId, string name)
        {

            await firebase
                .Child("Persons")
                .PostAsync(new Person() { PersonId = personId, Name = name });
        }

        public async Task<Person> GetPerson(int personId)
        {
            var allPersons = await GetAllPersons();
            await firebase
                .Child("Persons")
                .OnceAsync<Person>();
            return allPersons.Where(a => a.PersonId == personId).FirstOrDefault();
        }

        public async Task UpdatePerson(int personId, string name)
        {
            var toUpdatePerson = (await firebase
                .Child("Persons")
                .OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault();

            await firebase
                .Child("Persons")
                .Child(toUpdatePerson.Key)
                .PutAsync(new Person() { PersonId = personId, Name = name });
        }

        public async Task DeletePerson(int personId)
        {
            var toDeletePerson = (await firebase
                .Child("Persons")
                .OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault();
    

    await firebase.Child("Persons").Child(toDeletePerson.Key).DeleteAsync();

    }
  }
}

我得到的错误是在 DeletePerson 类的最后一行:**await firebase.Child("Persons").Child(toDeletePerson.Key).DeleteAsync();**

我在UpdatePerson类中得到的错误也在最后一行

 await firebase
                    .Child("Persons")
                    .Child(toUpdatePerson.Key)
                    .PutAsync(new Person() { PersonId = personId, Name = name });

这两个函数都给了我这个错误:

System.NullReferenceException:“对象引用未设置为对象的实例。

希望有人能帮忙!

.NET Xamarin Firebase-Realtime-Database CRUD NullReferenceException

评论

0赞 Jason 2/24/2021
这与您之前的问题相同。你有一个空对象,你需要弄清楚它是哪一个,然后是为什么,然后修复它。您需要使用调试器来确定该语句中的哪些对象为 null。
0赞 2/24/2021
@Jason,当我找到那个物体时,我该怎么办?
0赞 Jason 2/24/2021
找出为什么它是 null
0赞 2/24/2021
感谢您@Jason反馈,但我在这里问这个问题的原因是 obvios,我不知道如何找到哪一个是空的
0赞 Jason 2/24/2021
在调试器中,但该行上有断点,将鼠标悬停在每个元素上以检查值,并确定哪个元素返回 null。或者,如果您不知道如何使用调试器,请将复合语句分解为多行和每行的值,以确定是哪一行导致了中断Console.WriteLine

答:

1赞 Jason 2/24/2021 #1

如果此查询返回 null

var toDeletePerson = (await firebase
            .Child("Persons")
            .OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault();

那么这将引发一个 null 引用异常

await firebase.Child("Persons").Child(toDeletePerson.Key).DeleteAsync();

应首先测试 null

if (toDeletePerson != null) 
{
    await firebase.Child("Persons").Child(toDeletePerson.Key).DeleteAsync();
}

评论

0赞 2/24/2021
当我调试时,personId = 0,这很奇怪,因为我的数据库中没有 0
0赞 Jason 2/24/2021
那么你应该调试它 - 该值最初是从哪里传递的?它是如何设置为无效值的?等。。。