ios - 迁移后 Realm 不工作

标签 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 ,没有任何 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/

相关文章:

ios - 如何在 iOS 的 Realm 中使用主键( objective-c )

android - 从 Realm 数据库中获取单个列(Android)

Java 计数 Realm 结果

IOS 在除一个单元格之外的所有单元格上禁用 UItableview 选择

ios - 核心剧情: doxygen config file does not exist

ios - 将JSON文件保存到iPhone

ios - 在 Swift 中以编程方式将 UIGestureRecognizer 添加到 subview

android - Realm.init() 无法解析方法 init 在应用程序 onCreate 中不起作用?

swift3 - Realm Swift 回调函数

ios - 将项目从 swift 1.x 升级到 swift 2