这是我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
,没有任何反应,在我的控制台中,我可以看到查询返回空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
}
答案 0 :(得分:0)
我同意视图控制器中您删除Realm文件的代码行很可能是导致问题的原因。如果你想删除默认的Realm文件,那么在第一次调用Realm()
之前执行它会更安全。
Realm在内存中保留了对自身的引用(因此,每次在不同的线程上调用Realm()
时,它都不需要不断自我设置),所以我要说它。可以安全地假设它在内存中的状态可能会在文件被打开后被删除。
如果您要删除该文件,仅出于测试原因,我建议您在设置迁移阻止之前将其删除,并首次拨打Realm()
。