移植后领域无法正常工作

时间:2015-09-06 03:13:09

标签: ios realm

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

1 个答案:

答案 0 :(得分:0)

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

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

如果您要删除该文件,仅出于测试原因,我建议您在设置迁移阻止之前将其删除,并首次拨打Realm()