当我从 Xamarin 中的同步领域数据库中删除项时出现空引用异常

null reference exception when i delete item from sync realm database in xamarin

提问人:maria nabil 提问时间:6/19/2019 最后编辑:maria nabil 更新时间:6/20/2019 访问量:164

问:

enter image description here从同步领域数据库中删除任何项目后,我收到了空引用异常。 该项目已从数据库中删除,但会引发异常和故障 我不知道为什么它会抛出这个异常,也不知道null对象在哪里。

但是当我删除这一行时,异常消失了: listView.ItemsSource = 员工;

PS:当我尝试在线同步领域数据库时,出现了此异常。

public MainPage()
    {
        InitializeComponent();
        Initialize();
        listView.ItemsSource = Employees;
    }    
private async Task Initialize()
    {
        _realm = await OpenRealm();
        Employees = _realm.All<Employee>();
        Entertainments= _realm.All<Entertainment>();
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Employees)));
    }

void OnDeleteClicked(object sender, EventArgs e)
    {
        try {
            var o = _realm.All<Employee>().FirstOrDefault(c => c.EmpId == 4);
            if (o != null)
                _realm.Write(() => { _realm.Remove(o); });
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Employees)));
        }
        catch (Exception exp)
        {
            string msg = exp.Message;
        }

    }

下面是异常的屏幕截图

Xamarin 领域 NullReferenceException

评论

0赞 Jason 6/19/2019
learn.microsoft.com/en-us/visualstudio/mac/......
0赞 Bruno Caceiro 6/19/2019
什么是员工?一个清单?Observable集合?
0赞 maria nabil 6/19/2019
@BrunoCaceiro为:IEnumerable<Employee>
1赞 Bruno Caceiro 6/20/2019
有你的问题。请使用 ObservableCollection<Employee>以便可以动态添加或删除绑定到列表视图的项
0赞 Jason 6/20/2019
这不会导致 null 引用。异常对象的堆栈跟踪应告诉您哪一行导致了异常

答:

0赞 Cherry Bu - MSFT 6/20/2019 #1

这解决了异常!谢谢。但是ListView现在不会自动更新!

根据您的代码和描述,您希望删除项目窗体领域数据库,并更新 Listview。我发现您使用 PropertyChanged 想要更新 Employees,但它不起作用,因为您从领域数据库中删除了项目,没有更改 Employees,因此它不会触发 PropertyChanged 事件。

 List<Employee> Employees = new List<Employee>();
    private async Task Initialize()
    {
        _realm = await OpenRealm();
        Employees = _realm.All<Employee>().ToList(); ;
        Entertainments = _realm.All<Entertainment>();

    }
    void OnDeleteClicked(object sender, EventArgs e)
    {
        try
        {
            var o = _realm.All<Employee>().FirstOrDefault(c => c.EmpId == 4);
            if (o != null)
                _realm.Write(() => { _realm.Remove(o); });
            Employees = _realm.All<Employee>().ToList();
            listView.ItemsSource = Employees;
        }
        catch (Exception exp)
        {
            string msg = exp.Message;
        }

    }

对您有帮助的文章: https://dzone.com/articles/xamarinforms-working-with-realm-database