Так что я в ситуации, когда мне нужно перенести одну из моделей в моей базе данных. Я добавил поле модели DateTimeOffset
к модели, которая будет содержать дату для моей модели Recommendation
, которая в настоящее время не существует в базе данных. Таким образом, нет возможности заполнить новое поле из существующих данных.Удалить данные из старой области во время миграции базы данных Realm
В моем обратном обращении миграции я хочу чистый лист для модели Recommendation
и всех ее подмоделей (он состоит из нескольких классов). Поэтому я могу получить новый набор рекомендаций из моего web-api с новым полем. Когда я пытаюсь очистить старую базу данных всех существующих данных модели, я получаю исключение.
Realms.Exceptions.RealmInvalidTransactionException
Невозможно выполнить операции на только чтение Realms.
Как достичь вышеуказанного?
Вот код для моего обратного вызова миграции.
var config = new RealmConfiguration("salt.realm");
config.SchemaVersion = 2;
config.MigrationCallback = (migration, oldSchemaVersion) =>
{
Settings.UpdateDateRecommendationsUtc = DateTime.MinValue;
migration.OldRealm.Write(() =>
{
migration.OldRealm.RemoveAll("RecDataString");
migration.OldRealm.RemoveAll("RecChart");
migration.OldRealm.RemoveAll("RecSummary");
migration.OldRealm.RemoveAll("RecTickerSymbol");
migration.OldRealm.RemoveAll("Recommendation");
});
};
Hi SushiHangover, вы правы и почти правы, я понял, что опубликует обновленный ответ. Не нужно для части NewRealm.Write(), поскольку, как оказалось, MigrationCallback является самой транзакцией Write. Также ему не нравится вызов RemoveAll (""). Он бросает RealmException, жалуясь, что Realm.RemoveRange() ожидает IQueryable от .Все или что-то в этом роде. Я предполагаю, что он использует Realm.RemoveRange() под капотом. См. Мой обновленный ответ. Также спасибо за хэдз-ап на ошибке DateTimeOffset !!! –
@MarkSilver Я сделал это из памяти и просто вырезал/вставил ваш код ..., используйте 'migration.NewRealm.RemoveAll();' вместо 'RemoveRange' –
SushiHangover
Я протестировал его с помощью' RemoveAll() ' и он работает. Кажется, что это просто динамическая функция, которая не нравится 'RemoveAll (" className ")' будет генерировать исключение. Спасибо за помощь. –