境界迁移后无法使用

这是我UIViewController的相关代码:

 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 } } 

为了testing的目的,我设置了要在viewDidLoad()保存的数据。 然而,我的getHabitsForDay(daySelected: Int)函数只返回查询结果,当程序第一次运行,即当我点击调用reloadTableForDay(sender: DayButton)函数,这反过来调用重新加载到UITable ,没有任何反应,在我的控制台我可以看到查询返回了一个空的Result<Habit> 。 这一切都发生在我改变我的数据模型(添加一个属性和一个类)并执行迁移。

我也怀疑var error: NSError? NSFileManager.defaultManager().removeItemAtPath(Realm.defaultPath, error:&error) var error: NSError? NSFileManager.defaultManager().removeItemAtPath(Realm.defaultPath, error:&error)可能会搞砸了,但我不知道。

编辑:现在我确定这是由迁移引起的,因为我开始了一个新的项目,并通过代码复制。 一切都很好,直到我做了一个移民。

这是我的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 } 

我同意在视图控制器中删除Realm文件的代码行很可能是问题的原因。 如果你想删除默认的Realm文件,那么在第一次调用Realm()之前,这样做会更安全。

Realm在内存中保留对自身的引用(因此,每次在不同的线程上调用Realm()时都不需要继续设置自己),所以我认为可以安全地假设它在内存中的状态可能会与该文件已被打开后被删除。

如果您要删除文件,仅仅出于testing的原因,我build议您在设置迁移块之前删除它,并首次调用Realm()