我在使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()
} ...
答案 0 :(得分:2)
从它的声音来看,在这里执行复制操作之前,你必须在某处调用Realm()
。
default.realm
仅在您第一次致电Realm()
时才会打开。一旦它打开,它就会将有关文件的缓存信息存储在内存中,所以如果你在事后更换它,你最终会有不可预知的行为。
如果您绝对需要对Realm()
执行某种操作,可以将其括在@autoreleasepool { }
块中,以确保在执行文件复制之前可以预测其内存中的缓存条目被刷新。
除此之外,我建议检查您的代码,以确保在触摸Realm()
指向它的任何实例之前执行此文件副本。