这是我的 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
}
}
我设置要持久化的数据在
viewDidLoad()
, 用于测试目的。但是我的getHabitsForDay(daySelected: Int)
函数仅在程序第一次运行时返回查询结果,即当我单击调用 reloadTableForDay(sender: DayButton)
的按钮时函数,然后调用重新加载到 UITable
,没有任何 react ,在我的控制台中我可以看到查询返回了一个空的 Result<Habit>
.这一切都发生在我更改数据模型(添加属性和类)并执行迁移之后。我也怀疑
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 文件的 View Controller 中的代码行很可能是问题的原因。如果要删除默认的 Realm 文件,在 Realm()
之前这样做会更安全。第一次在任何地方调用。
Realm 在内存中保留对自身的引用(因此它不需要在每次调用 Realm()
时在单独的线程上不断设置自己),所以我认为可以安全地假设它在内存中的状态可能与文件在打开后被删除。
如果您要删除文件,仅出于测试原因,我建议您在设置迁移 block 并调用 Realm()
之前将其删除。首次。
关于ios - 迁移后 Realm 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32419664/