2017-02-06 15 views
0

В моей модели пользователя хранить некоторый список, как это:Realm: Создание новых экземпляров пользователя удаляют сохраненные списки других пользовательских экземпляров

public final class User: Object, Mappable { 

    dynamic var id: Int = 0 
    dynamic var name: String? = nil 
    var addresses = List<Address>() 
    var children = List<Child>() 
    var godparents = List<User>() 
} 

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

Но когда я хочу создать совершенно новых пользователей, например пользователей с идентификаторами 2 & 3, пользователь с идентификатором 1 потеряет все данные списка (имя будет по-прежнему сохранено, но все адреса или дети будут потеряны). Что здесь не так?

Вот код, где я хочу, чтобы добавить пользователей 2 & 3 в списке крестных пользователя 1:

do { 
    try realm.write { 
     // users contains user 2 & 3 
     let users = self.users.map { (userData) -> User in     
      return realm.create(User.self, value: userData, update: true) 
     } 

     UserManager.currentUser?.godparents.removeAll() 
     UserManager.currentUser?.godparents.append(contentsOf: users) 
    } 
} catch let error { 
    print(error) // no error is triggered at this point 
} 

После выполнения этого кода, пользователь 1 потерял все данные в адресах & детей

Вот код метода CurrentUser, если это необходимо (чтобы получить идентификатор пользователя 1):

struct UserManager { 
    static var currentUser: User? { 
     get { 
      guard let id = UserDefaults.standard.object(forKey: "current_user_id") else { 
       return nil 
      } 

      let user = realm?.object(ofType: User.self, forPrimaryKey: id) 
      return user 
     } 
    } 
} 
+1

Включен ли пользователь 1 в этот 'self.users.map'? Поскольку 'update' равно true, если пользователь 1 находится там, он также будет обновлен. И если свойства 'address' и' children' присутствуют, но пусты, это очистит эти ранее существовавшие свойства. – TiM

+0

Хммм, на самом деле вы правы, users.count относится только к этим двум пользователям, но один из этих пользователей содержит пользователя 1 в его свойства подсети (крестные родители). Все обновляется в конце, черт! –

+0

Хахаха ага! Я так думала. Хорошо, я напишу официальный ответ на этот вопрос. – TiM

ответ

1

При использовании realm.create() остроумия h update: true, вам нужно быть очень осторожным, что вы проходите к нему. Царство не рассматривает текущие, но пустые значения как «не трогайте», вместо этого вы предполагаете, что хотите получить значение nil.

Предполагая, что userData является стандартным словарем, вы должны передавать только те значения, которые хотите изменить, и (в идеале) опустить любые значения, которые не изменяются.

 Смежные вопросы

  • Нет связанных вопросов^_^