2017-02-17 3 views
1

Так что я в ситуации, когда мне нужно перенести одну из моделей в моей базе данных. Я добавил поле модели 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"); 
      }); 
     }; 

ответ

0

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

Вам нужно только данные OldRealm во время миграции, если вам нужно получить доступ к «старому» свойству и выполнять некоторый тип преобразования данных на нем и обновить NewRealm с ним ...

migration.NewRealm.RemoveAll<POCO>(); 
await UpdateRecommendationFromYourWebApi(); 

Примечания: Так как вы добавляете DateTimeOffset, вы можете принять к сведению текущую ошибку, которая устанавливает значение по умолчанию «1/1/1970 12:00:00 AM +00: 00» против «1/1/0001 12: 00:00 AM +00: 00 "

Re: https://github.com/realm/realm-dotnet/issues/1225

+0

Hi SushiHangover, вы правы и почти правы, я понял, что опубликует обновленный ответ. Не нужно для части NewRealm.Write(), поскольку, как оказалось, MigrationCallback является самой транзакцией Write. Также ему не нравится вызов RemoveAll (""). Он бросает RealmException, жалуясь, что Realm.RemoveRange() ожидает IQueryable от .Все или что-то в этом роде. Я предполагаю, что он использует Realm.RemoveRange() под капотом. См. Мой обновленный ответ. Также спасибо за хэдз-ап на ошибке DateTimeOffset !!! –

+0

@MarkSilver Я сделал это из памяти и просто вырезал/вставил ваш код ..., используйте 'migration.NewRealm.RemoveAll ();' вместо 'RemoveRange' – SushiHangover

+0

Я протестировал его с помощью' RemoveAll () ' и он работает. Кажется, что это просто динамическая функция, которая не нравится 'RemoveAll (" className ")' будет генерировать исключение. Спасибо за помощь. –

0

Так как @SushiHangover правильно заявил, что я должен был работать на newRealm, а не на oldRealm. Поскольку я заинтересован в удалении RealmObjects нового Королевства. Не требуется операция записи, поскольку config.MigrationCallback уже является самой транзакцией записи. Я не мог получить RemoveAll("className"), чтобы работать, это исключение, это рабочее решение, которое я имею в настоящее время.

 var config = new RealmConfiguration("salt.realm"); 
     config.SchemaVersion = 1; 
     config.MigrationCallback = (migration, oldSchemaVersion) => 
     { 
      Settings.UpdateDateRecommendationsUtc = DateTime.MinValue; 

      migration.NewRealm.RemoveAll<Recommendation>(); 
      migration.NewRealm.RemoveAll<RecDataString>(); 
      migration.NewRealm.RemoveAll<RecChart>(); 
      migration.NewRealm.RemoveAll<RecSummary>(); 
      migration.NewRealm.RemoveAll<RecTickerSymbol>(); 
     }; 
Смежные вопросы