Интеграция с Realm

#ios #swift #xcode #realm

#iOS #swift #xcode #realm

Вопрос:

У меня есть приложение, которое работает просто отлично. Приложение представляет собой список автомобилей. Пользователь может добавлять, удалять и редактировать автомобили. Я пытался интегрировать RealmSwift для хранения данных, но застрял. До сих пор данные для работы приложения хранятся в статической переменной в Cars классе:

 struct CarData {
    var name: String
    var year: String
}

class Cars {
    static var list = [
        CarData(name: "Toyota Corolla", year: "2007"),
        CarData(name: "BMW 3", year: "2011")
    ]
    static var index = -1
    static var newCar = false
}
  

Мне нужна область в 2 контроллерах просмотра:

  1. ListViewController — для заполнения tableView . Что-то вроде:
 Cars.list = realmListOfCars
  

и остальная часть кода останется прежней.
2) ConfirmViewController — для изменения сохраненных данных.

 if toProceed {
    if Cars.newCar {
        Cars.list.append(carToEdit!) //add new car
    } else {
        Cars.list[Cars.index] = carToEdit! //edit car
    }
} else {
    if Cars.newCar == false {
        Cars.list.remove(at: Cars.index) //delete car
    }
}
//the idea is to add something like:
realmListOfCars = Cars.list
  

Итак, идея состоит в том, чтобы просто сделать Cars.list равным realmListOfCars после загрузки и сделать realmListOfCars равным Cars.List после того, как произойдет изменение.
Звучит просто, но я полностью застрял и запутался в создании и доступе realmListOfCars .
Прошу вашей помощи!
P.S. Установлен RealmSwift

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

1. Взгляните на это замечательное руководство, а затем вы можете начать с чего-нибудь. realm.io/docs/tutorials/realmtasks , appcoda.com/realm-database-swift

2. Я опубликовал ответ, который должен помочь, но я не уверен, как настроены ваши модели. У вас есть объект Cars, который, очевидно, содержит cars, но для чего это index свойство и newCar означает ли, что этот объект Cars содержит только not new cars (если он false)? Возможно, вы захотите переосмыслить эту структуру, если это так — если newCar имеет значение true для списка, это только новые автомобили или false, если нет, у вас будет только два объекта; один с новыми автомобилями, а другой без. Может быть лучший способ их сгруппировать

Ответ №1:

Если вы хотите хранить данные в Realm, вам необходимо сделать ваши объекты объектами Realm. Во-первых, класс Cars необходимо будет изменить

 class Cars: Object { 
  

и затем необходимо обновить каждое свойство, которым вы хотите управлять

 @objc dynamic var newCar = false 
  

например. Вы также хотели бы использовать объект списка Realm в качестве свойства данных Car для хранения cars (CarData должен быть классом, а не структурой)

 let carList = List<CarData>()
  

затем, когда вы добавляете car в свойство Cars class CarList, он также будет записан в Realm как объект.

Итак, вот ваши объекты Realm

 class CarData: Object {
    @objc dynamic var name = ""
    @objc dynamic var year = ""
}

class Cars: Object {
    let carList = List<CarData>()
    @objc dynamic var index = -1
    @objc dynamic var newCar = false
}
  

предположим, что ваш объект Cars — это все объекты McLaren, и мы назвали его allMcLarens. Вот добавление автомобиля в этот список

 let myCar = CarData()
myCar.name = "570GT"
myCar.year = "2019"

try realm.write {
    allMcLarens.carList.append(myCar)
}
  

Многое из этого также описано в руководстве по началу работы с Realm.