使用Realm Swift预加载数据库

时间:2016-10-25 05:45:53

标签: swift database error-handling realm

我在使PreLoaded数据工作方面遇到了一些麻烦。首先,这是代码:

 if  firstRun  {
            userDefaults.set(1, forKey: "dayCount")
            userDefaults.set(dateFormatter.string(from: date), forKey: "date")

            let newPath = defaultPath.deletingLastPathComponent()
            let v0Path = bundleURL("default")
            do {
                //try FileManager.default.removeItem(at: defaultPath)
                try FileManager.default.copyItem(at: v0Path!, to:defaultPath)
            } catch {
                print(error)
            }
        } ...

v0Path:

  

文件:///用户/ dimasalbuquerque /库/开发商/ CoreSimulator /设备/ 7FE635BA-AA7A-4241-AF3B-88AD60693AE7 /数据/容器/捆绑/应用/ B6739B92-B7D8-4DD8-9DA8-CD9BBD84B109 /实施例。应用程序/ default.realm

defaultPath:

  

文件:///用户/ dimasalbuquerque /库/开发商/ CoreSimulator /设备/ 7FE635BA-AA7A-4241-AF3B-88AD60693AE7 /数据/容器/数据/应用/ A86C4337-9006-497C-A688-AD781F49EF04 /文档/ default.realm

我遵循了这个指南:https://github.com/realm/realm-cocoa/blob/master/examples/ios/swift-2.2/Migration/AppDelegate.swift

问题是,当程序第一次运行时,它会正确执行代码,但是当我尝试访问realm数据库时,它说它是空的。虽然当我第二次打开应用程序时,它可以工作,数据就在那里。已经超过1周了,我正在努力解决这个问题,我已经搜索了所有网络但没有成功。

这是首次调用Realm的地方:

class HomeViewController: UIViewController {

@IBOutlet weak var message: UILabel!
@IBOutlet weak var backward: UIButton!
@IBOutlet weak var forward: UIButton!
@IBOutlet weak var background: UIImageView!
@IBOutlet weak var timeBtn: UIButton!
@IBOutlet weak var favoriteBtn: UIButton!
@IBOutlet weak var googleAd: GADBannerView!

let userDefaults = UserDefaults.standard
let realm = try! Realm()
var currentDate = 1
var time = 0 {
    didSet {
        if time != oldValue {
            randomBackground(time)
        }
    }
}
var dailyMessage: DailyMessagesRealm?
var currentMsg: Message?

override func viewDidLoad() {
    super.viewDidLoad()
    let first = userDefaults.bool(forKey: "notFirstRun")
    if !first {
        userDefaults.set(true, forKey: "notFirstRun")
        reNew()
    }

    let day = userDefaults.integer(forKey: "dayCount")
    currentDate = day
    let empty = realm.objects(DailyMessagesRealm.self).isEmpty
    let dailyMessage = realm.objects(DailyMessagesRealm.self).filter("date == '\(day)'").first
    //*********Error occurs here***********
    self.dailyMessage = dailyMessage!
    self.currentMsg = dailyMessage?.morningMessage
    self.currentMsg = dailyMessage?.morningMessage
    changeMessage((dailyMessage?.morningMessage?.message)!)
    initAds()
    changeBackground("morning1")
    checkFavorite()
} ...

1 个答案:

答案 0 :(得分:2)

从它的声音来看,在这里执行复制操作之前,你必须在某处调用Realm()

default.realm仅在您第一次致电Realm()时才会打开。一旦它打开,它就会将有关文件的缓存信息存储在内存中,所以如果你在事后更换它,你最终会有不可预知的行为。

如果您绝对需要对Realm()执行某种操作,可以将其括在@autoreleasepool { }块中,以确保在执行文件复制之前可以预测其内存中的缓存条目被刷新。

除此之外,我建议检查您的代码,以确保在触摸Realm()指向它的任何实例之前执行此文件副本。