2015-11-10 3 views
0

Это может быть не лучший способ сделать это, но он работает.Xcode: Reset CoreData после removeItemAtPath

Схема новой версии моего приложения настолько отличается, что я не думаю, что разумно использовать миграцию. Поэтому я решил создать экран ошибки, который информирует пользователя о том, что они потеряют свои данные. Это работает, и данные удаляются, но я должен перезапустить приложение, чтобы увидеть пустую базу данных. Какой был бы лучший способ сделать это без перезапуска приложения?

Вот код:

@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." 
} 
+0

Приложение все еще выполняет ту же работу для пользователей, хотя? Итак, как изменилась схема? Если вы не сообщите об этом пользователям до того, как будет выпущено обновление, будет подготовлен для * много * несчастных людей ... – Wain

+0

Я полностью понимаю, но насколько я могу судить, не так много пользователей, так как у нас нет продвигали приложение. Изменены ключи объектов. Я действительно думаю о приложении как бета-версии. Как вы, наверное, можете догадаться, что я любитель, пытающийся разработать приложение для небольшого сообщества. Я также добавил функцию отправки всех данных в виде резервной копии. Я рассмотрю сопоставление старых ключей с новыми ключами и сохраню данные. Я опубликую пересмотренный код для удаления данных выше. – PatriciaW

ответ

0

Так что я решил создать экран ошибки, который информирует пользователя о том, что они потеряют свои данные.

Um. Вау. Ваши бедные пользователи. Пожалуйста, передумайте. Потеря данных пользователя - одна из худших вещей, которые может сделать приложение. Из-за неправильной работы с данными пользователя это еще хуже.

Что было бы лучшим способом сделать это без перезапуска приложения?

Удалите старые данные перед тем, как что-либо сделать с помощью Core Data. Тогда у вас не будет причин для возобновления.

let newDir = docsDir.stringByAppendingPathComponent("CREWData.sqlite") 

do { 
    try filemgr.removeItemAtPath(newDir) 
} 

Этот код в значительной степени гарантированно сработает. Основные данные используют отдельные файлы журналов с тем же именем, что и основное постоянное хранилище, но с добавлением -wal и -shm. Если вы не удалите их, ваши данные могут вернуться из мертвых.

+0

База данных изменилась настолько, что было бы невозможно перенести данные. Я хочу, чтобы пользователи знали об этом, а не о сбое приложения. ... но я не уверен, что вы имеете в виду для удаления старых данных, прежде чем делать что-либо с данными ядра? Вы хотите удалить данные из объектов? BTW Я предоставил функцию, позволяющую им получать данные для себя, чтобы она не была слишком болезненной. – PatriciaW

+0

Ваш фрагмент кода удаляет старый файл хранимого хранилища. Сделайте это перед запуском любого кода, который пытается загрузить данные из файла. –

+0

Мне нужно определить, являются ли данные старыми, и единственный способ сделать это - загрузить данные и изучить содержимое. Можете ли вы предложить лучший способ? – PatriciaW

Смежные вопросы