Должен ли я распоряжаться экземплярами Realm?

#c# #xamarin.forms #realm

#c# #xamarin.forms #realm

Вопрос:

У меня есть приложение Xamarin Forms с Realm в качестве базы данных.

Приложение загружает данные при запуске. Я сравниваю его с существующими данными, и если конкретный объект существует, я его обновляю. Если нет, то я добавляю его. Если в базе данных есть какие-то объекты, которые не были загружены, я их удаляю. Я повторяю процесс несколько раз, когда пользователь перемещается по приложению. Просто чтобы поддерживать все в актуальном состоянии, если это возможно.

Я подписался на ShouldCompactOnLaunch событие, и я наблюдаю, что каждый раз, когда я запускаю базу данных приложения, она использует все больше и больше памяти, несмотря на то, что в загруженных данных ничего не изменилось. Мне интересно, что происходит? Должен ли я утилизировать каждый экземпляр вручную? В официальной документации я нашел заявление:

The Realm class implements IDisposable in order to take care of native memory deallocation and file descriptors so instances will be closed automatically when variables go out of scope.

https://realm.io/docs/dotnet/latest/#closing-realm-instances

Утилизация каждой области немного сложна для меня, поскольку я поместил доступ к области внутри моего хранилища данных, и я получаю доступ к данным из разных потоков (каждый раз вызывая Realm.getInstance() внутри моего хранилища данных). Однако, если удаление вручную является обязательным, я попытаюсь провести рефакторинг своего кода. Если это не так, то мне интересно, почему каждый раз, когда я запускаю приложение, realm занимает все больше и больше места на диске.

Комментарии:

1. Привет, если вам нужно часто использовать экземпляр класса Realm при запуске приложения, не нужно повторно устанавливать его вручную. Потому что частое создание и выпуск также потребляют много памяти

Ответ №1:

Чтобы прямо ответить на ваш вопрос, да, вы должны утилизировать Realm экземпляры, особенно в фоновых потоках.

Это связано с тем, что внутренняя база данных Realm работает с несколькими версиями Realm, и чем больше разница между самой старой и самой новой версией, тем больше места она будет занимать.

Области в потоке пользовательского интерфейса будут автоматически обновляться для обновления до последней версии, в то время как для областей в фоновых потоках этого не происходит, и поэтому они привязываются к более старой версии, пока не будут закрыты. По этой причине вам следует вручную удалять экземпляры Realm в фоновых потоках, как только вы закончите с ними.

К сожалению.СЕТЕВАЯ документация Realm не содержит всех этих подробностей, но вы можете взглянуть на Android здесь и здесь, поскольку она работает аналогичным образом.