removeItemAtPath之后重置CoreData

removeItemAtPath之后重置CoreData

这可能不是最好的方法,但它确实可以工作。

我的应用程序新版本的架构是如此不同,以至于我认为使用迁移是不合理的。因此,我决定创建一个错误屏幕,通知用户他们将丢失数据。这可以正常工作,并且数据被删除,但是我必须重新启动应用程序才能看到空数据库。在不重新启动应用程序的情况下,这样做的最佳方法是什么?

这是代码:

@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/

10-09 02:18