这可能不是最好的方法,但它确实可以工作。
我的应用程序新版本的架构是如此不同,以至于我认为使用迁移是不合理的。因此,我决定创建一个错误屏幕,通知用户他们将丢失数据。这可以正常工作,并且数据被删除,但是我必须重新启动应用程序才能看到空数据库。在不重新启动应用程序的情况下,这样做的最佳方法是什么?
这是代码:
@IBOutlet weak var myTextView: UITextView!
@IBOutlet weak var doneButton: UIBarButtonItem!
@IBAction func doneAction(sender: UIButton) {
createAppData()
let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc : UIViewController = storyboard.instantiateViewControllerWithIdentifier("NCStartMenuTV")
self.presentViewController(vc, animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
let filemgr = NSFileManager.defaultManager()
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,
.UserDomainMask, true)
let docsDir = dirPaths[0]
let newDir = docsDir.stringByAppendingPathComponent("CREWData.sqlite")
do {
try filemgr.removeItemAtPath(newDir)
}
catch let error as NSError {
error.description
}
}
override func viewDidAppear(animated: Bool) {
myTextView.text = "Your app will lose data if you proceed. Please accept our apologies but the new features in this version makes this necessary."
}
删除数据并创建新数据的工作代码。
@IBAction func doneAction(sender: UIButton) {
deleteAppData ()
createAppData()
let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc : UIViewController = storyboard.instantiateViewControllerWithIdentifier("NCStartMenuTV")
self.presentViewController(vc, animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(animated: Bool) {
myTextView.text = "Your app will lose data if you proceed. Please accept our apologies but the new features in this version makes this necessary."
}
最佳答案
因此,我决定创建一个错误屏幕,通知用户他们将丢失数据。
嗯哇。您的可怜用户。请重新考虑。丢失用户数据是应用程序最糟糕的事情之一。故意破坏用户数据会使情况更糟。
在不重新启动应用程序的情况下,这样做的最佳方法是什么?
在对Core Data执行任何操作之前,请删除旧数据。然后,您将没有任何理由重新启动。
let newDir = docsDir.stringByAppendingPathComponent("CREWData.sqlite")
do {
try filemgr.removeItemAtPath(newDir)
}
此代码几乎可以保证会失败。 Core Data使用单独的日记文件,其名称与主持久性存储的名称相同,但添加了
-wal
和-shm
。如果不删除这些数据,您的数据很可能会从死里复活。关于swift - Xcode:removeItemAtPath之后重置CoreData,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33640867/