2015-09-06 6 views
2

Это соответствующий код в моем UIViewController:Realm не работает после миграции

class HabitTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{ 

    @IBOutlet weak var habitTableView: UITableView! 
    private var _numOfRowsInSects: [Int] = [] 
    private var _allSections = Set<Int>() //_[0] = 1 -> Morning 
    private let _timeInDay = [0: "Morning", 1: "Afternoon", 2:"Evening", 3:"Anytime"] 
    private var _habitsBySection:[[Habit]] = [] 
    private var _whatIsToday = -1 //means no button other than today has been pressed 


    override func viewDidLoad() { 


     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     habitTableView.delegate = self 
     habitTableView.dataSource = self 
     var error: NSError? 
     NSFileManager.defaultManager().removeItemAtPath(Realm.defaultPath, error:&error) 


     let realm = Realm() 
     //for testing purposes, preload some habits 

     let habit1 = Habit() 
     let habit2 = Habit() 
     let habit3 = Habit() 
     let habit4 = Habit() 


     //set up code -- assigning properties and etc. 

     realm.write{realm.add(habit1)} 
     realm.write{realm.add(habit2)} 
     realm.write{realm.add(habit3)} 
     realm.write{realm.add(habit4)} 

    } 


    @IBAction func reloadTableForDay(sender: DayButton){ 
     if sender.tag != getDayOfWeek(-1){ 
      _whatIsToday = sender.tag 
      _habitsBySection = [] 
      _allSections = [] 
      habitTableView.reloadData() 
     } 
     else{ 
      _whatIsToday = -1 
     } 

    } 



    func getHabitsForDay(daySelected: Int) -> Results<Habit> { 
     let daySelected = String(daySelected) 
     let habitsOfDay = Realm().objects(Habit).filter("durationByDay_days contains %@", "7") 

     return habitsOfDay 
    } 
} 

настроить данные, которые будут упорствовать в viewDidLoad(), для целей тестирования. Однако моя функция getHabitsForDay(daySelected: Int) возвращает результат только после запуска программы, то есть когда я нажимаю кнопки, вызывающие функцию reloadTableForDay(sender: DayButton), которая, в свою очередь, вызывает перезагрузку до UITable, ничего не происходит, и в моей консоли я вижу, что запрос возвращает пустой Result<Habit> , Все это произошло после того, как я изменил модель данных (добавил свойство и класс) и выполнил миграцию.

Я также подозреваю, что var error: NSError? NSFileManager.defaultManager().removeItemAtPath(Realm.defaultPath, error:&error) может быть запутанным, но я не уверен.

EDIT: Теперь я уверен, что это было вызвано миграцией, так как я начал новый проект и скопировал код. Все работало нормально, пока я не перебрался.

Это код миграции в моем AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     // Override point for customization after application launch. 
    let config = Realm.Configuration(
     //You need to increment the version everytime you change your object schema (starts at 0) 
     schemaVersion: 1, 
     migrationBlock: { migration, oldSchemaVersion in 
      //If you want to preserve any data, you can do it here, otherwise just leave it blank. 
     } 
    ) 

    Realm.Configuration.defaultConfiguration = config 

    let realm = Realm() 
    return true 
} 
+0

Я достал код миграции, и все снова сработало ... Почесывая голову сейчас .... – Liumx31

ответ

0

Я согласен, что строка кода в контроллере представления, где вы удаляете файл Realm, скорее всего, причиной проблемы , Если вы хотите удалить файл Realm по умолчанию, было бы гораздо безопаснее сделать это до того, как Realm() будет вызываться где угодно в первый раз.

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

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

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