Проблема с Realm

swift
xcode
realm
ios

#1

Здравствуйте!
Помогите, пожалуйста, разобраться, в чем проблема. Для знакомства с Realm, создал простой проект. Две кнопки: одна производит запись в базу данных (записывает простой объект класса Dog, с двумя стринговыми свойствами name и age), другая - берет объект из базы данных и выводит в консоль его свойство name.

  1. Файл DogModel.swift:

     import  RealmSwift
    
    class Dog : Object {
        @objc dynamic var name = "Proba"
        @objc dynamic var age = "Proba 14"
    }
    
  2. Файл StorageSave.swift:

      import  RealmSwift
    
     let realm = try! Realm()
    
     class StorageManager {
        
         static func saveObject (_ dog : Dog) {
             try! realm.write{
                 realm.add(dog)
             }
         }
     }
    
  3. Файл ViewController.swift

    import UIKit
    import RealmSwift

    class ViewController: UIViewController {

     var dogs : Results<Dog>!
    
     override func viewDidLoad() {
         super.viewDidLoad()
       
     }
    
     @IBAction func presentAction(_ sender: UIButton) {
         print(dogs[1].name)
     }
     
     @IBAction func addAction(_ sender: UIButton) {
         let dog = Dog()
         StorageManager.saveObject(dog)
     }
    

    }

    В результате, запись в базу данных производится. Если посмотреть файл realm.default через Realm Studio - там данные есть. Но, при попытке извлечь объект из базы данных - приложение падает с ошибкой.


#2

Так у вас вроде нет метода чтения из базы. У вас ни где не инициализирован массив (вы туда ничего не записываете) - он нил: компилятор так и сказал.

возможно надо что-то типа этого

 var dogs : Results<Dog> { 
     return realm.objects(Dog.self)
 }

Плюс на всякий случай обращайтесь к первому элементу массива, а не ко второму.


#3

Вроде бы строчка var dogs : Results! - уже самодостаточна, если можно так сказать.
dogs - становиться массивом, в который элементы Dog из базы данных прилетают динамически. Что-то, типа, того).
Такие познания я почерпнул из видеокурса Swiftbook) И, в их проекте, который прикреплен к курсам и который можно скачать - синтаксис именно такой, и все работает. (Я скачал и попробывал).
В любом случае, большое спасибо за совет! Попробую.


#5

А можете показать скрин из видеокурса с кодом.
У меня аналогичный подход так же падает и в доках я не нашел такой инфы, что достаточно объявить тип Result.


#6
Посмотрел еще раз проект из курса Свифтбук:

`var places: Results<Place>!

    override func viewDidLoad() {
        super.viewDidLoad()

        places = realm.objects(Place.self)
    }`
Действительно, я в своем проекте не инициализировал массив dogs.
В проекте из курса это было сделано в методе viewDidLoad()
А я это как-то пропустил...
Большое спасибо! Вы, сразу, все верно сказали.

#7

Здравствуйте! Недостаточно. Я, просто, тупанул)
Смотрите переписку выше


#8

Уже увидел.
Я сперва немного в недоумении был. Думал может я проспал долго и чего-то не знаю о реалме.
Во всех проектах юзаю реалм с самого начала мобильной разработки на обеих платформах и доку много раз перечитывал.
Но я не спорю, что так было бы проще, только лишь с одним объявлением типа. Но, это и путало бы многих, т.к. это не стандартное поведение.