realm / realm-dotnet

Realm is a mobile database: a replacement for SQLite & ORMs
https://realm.io
Apache License 2.0
1.23k stars 158 forks source link

RealmResults (from Realm live queries) no longer notify UI observers #3602

Open uixiu opened 1 month ago

uixiu commented 1 month ago

What happened?

I am not sure if this is a bug or a feature side effect, anyway I'm building a significant product feature (live queries) based on the previous version's behavior. Feel free to change Label accordingly. This is a miniature project for example usage

Consider the attached code snippets or linked example project;

Before version 12.0.0 ( <= 11.7.0), when adding or deleting objects to database, the list box is populated and updated correctly, When upgraded to version 12.0.0 or above, the listbox is neither populated nor updated after object removal. On my full-fledged project, list boxes and data grids are sometimes populated, but are not always updated after deletions.

Repro steps

Compile and run linked example projects(Visual Studio 2022 is required for WinUI )

Version

12.1.0

What Atlas Services are you using?

Local Database only

What type of application is this?

Other

Client OS and version

Windows 11 Pro 23H2 - 22631.3447

Code snippets

public partial class Cat : IRealmObject
{
    [PrimaryKey]
    public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
    public string Name { get; set; } = string.Empty;
    public int Age { get; set; } = 0;
    public string Breed { get; set; } = string.Empty;
}
 public partial class MainWindowViewModel : ObservableObject
 {
     public MainWindowViewModel()
     {
         var config = new RealmConfiguration(@"d:\temp\cats.realm");
         _localRealm = Realm.GetInstance(config);
         CatsQuery = _localRealm.All<Cat>();
     }

     private Realm _localRealm;

     [ObservableProperty] 
     private IQueryable<Cat> _catsQuery;

     public Cat? SelectedCat { get; set; }

     [RelayCommand]
     private void RemoveCat()
     {
         if (SelectedCat == null)
             return;
         _localRealm.Write(() => { _localRealm.Remove(SelectedCat); });
     }

     [RelayCommand]
     public void Populate()
     {
         Cat ninja = new() { Name = "Ninja", Age = 1, Breed = "Angora" };
         Cat nounou = new() { Name = "Nounou", Age = 2, Breed = "Siamese" };

         _localRealm.Write(() => _localRealm.Add(nounou));
         _localRealm.Write(() => _localRealm.Add(ninja));
     }
 }
<Window
    x:Class="RealmWinUI.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
        <Button Content="Populate" Command="{x:Bind MainViewModel.PopulateCommand}" />
        <Button Content="Delete" Command="{x:Bind MainViewModel.RemoveCatCommand}" />

        <ListBox ItemsSource="{x:Bind  MainViewModel.CatsQuery}"
                 DisplayMemberPath="Name"
                 SelectedItem="{x:Bind MainViewModel.SelectedCat, Mode=TwoWay}"/>
    </StackPanel>
</Window>

Stacktrace of the exception/crash you're getting

No response

Relevant log output

No response

sync-by-unito[bot] commented 1 month ago

➤ PM Bot commented:

Jira ticket: RNET-1146

uixiu commented 1 month ago

When I compile my project against x64, the program behaves as expected Going back to x86, causes collections bindings and SubscribeForNotifications issues reappear.

nirinchev commented 1 month ago

Are you running the x86 version on an x86 machine or on a x64 one?

uixiu commented 1 month ago

Are you running the x86 version on an x86 machine or on a x64 one?

Thanks for your reply I am running the x86 version on an x64 machine (Windows 11-x64, intel 12900H processor)

nirinchev commented 1 month ago

Okay, I can reproduce this running x86 on Arm64 - will try and investigate further.