2016-11-07 2 views
3

Мы разрабатываем расширение iMessage. Он успешно использует Core Data. Нам нужно оценить файл store.sqlite, но он не может его найти.Как загрузить файл хранилища sqlite расширения iMessage для MacBook

Мы пытаемся найти его, как это:

  • В Xcode: Window -> Устройства
  • В Installed Apps выберите наше расширение
  • Download Container ...

Но контейнер пуст:


Update:

Благодаря @Mundi's answer мы узнали, как получить модели URL:

file:///var/mobile/Containers/Data/PluginKitPlugin/9C15B67C-8917-4A24-9FB0-BD119C43B3C4/Library/Application%20Support/Model.sqlite

Сейчас мы пытаемся скопировать модель в папку Documents, чтобы быть в состоянии загрузить его позже в наш MacBook через Xcode (см. выше).

К сожалению, путь к `Документы:

NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] 

снова в /var/mobile/Containers/:

file:///var/mobile/Containers/Data/PluginKitPlugin/D0BBD375-A8B7-43DD-8486-1909965CAEB0/Documents 

Как можно скачать Model.sqlite файл из общего контейнера в нашем MacBook?

+0

Возможно ли это сделать на тренажере? Затем вы можете получить доступ к файлам непосредственно в файловой системе MacOS. – Mundi

+0

К сожалению, нам нужен один из устройств. – shallowThought

+0

Не копирует файл в папку «Документы» и не передает его в mac через airdrop, программно решить проблему здесь? Вы пытались это сделать? – KrishnaCA

ответ

1

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

func exportAllDataSqlite() { 
    let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 

    var newFilePath: URL! 
    var mutablePathComponents = [String]() 
    var sqliteFileCopied = false 

    do { 
     let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil, options: FileManager.DirectoryEnumerationOptions()) 
     for f in directoryContents { 
      let pathComponents = f.pathComponents 
      if pathComponents.last == "XXXXWhatever your file is called when created by the persisten store.sqliteXXXXX" { 
       //create a copy of the file with a dated file name 
       mutablePathComponents = pathComponents 

       let dateComponents = (Calendar.current as NSCalendar).components([.day, .month, .year], from: Date()) 
       let dateString = "\(dateComponents.day)-\(dateComponents.month)-\(dateComponents.year)" 

       mutablePathComponents[mutablePathComponents.count-1] = "Events App \(dateString).sqlite" 


       newFilePath = NSURL.fileURL(withPathComponents: mutablePathComponents) 
       do { 
        try FileManager.default.copyItem(at: f, to: newFilePath!) 
        sqliteFileCopied = true 
        print("Copied sqlite file") 
       } catch let error as NSError { 
        print(error.localizedDescription) 
       } 

      } 
     } 
    } catch let error as NSError { 
     print(error.localizedDescription) 
    } 

    if sqliteFileCopied == true { 
     //sharing 
     let activityItem:URL = newFilePath! 

     let objectsToShare = [activityItem] 
     let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) 

     activityVC.completionWithItemsHandler = { activity, success, items, error in 
      do { 
       try FileManager.default.removeItem(at: newFilePath!) 
       print("Deleted file: \(newFilePath!)") 
      } catch let error as NSError { 
       print(error.localizedDescription) 
      } 
     } 

     let excludeActivities = [UIActivityType.airDrop, 
           UIActivityType.print, 
           UIActivityType.assignToContact, 
           UIActivityType.saveToCameraRoll, 
           UIActivityType.addToReadingList, 
           UIActivityType.postToFlickr, 
           UIActivityType.postToVimeo] 
     activityVC.excludedActivityTypes = excludeActivities 

     self.present(activityVC, animated: true, completion: nil) 
    } else { 
     print("file not copied so can't be shared") 
    } 
} 

Это мой ранний Свифт, поэтому он не велик, но он работает. Я использовал его на днях в развернутой копии моего приложения для отладки проблемы, просто отправлю электронное письмо себе и открыть с помощью Sqlite viewer на вашем Mac.

+0

Hardcore но отлично :-) – shallowThought

2

Фактический файл sqlite, вероятно, будет находиться в общем контейнере.

То, что работает для меня, чтобы войти в магазин URL и использовать, чтобы найти его:

print(container.persistentStoreCoordinator.persistentStores.first!.url!) 

Урожайность что-то вроде

file:///Users/developer/Library/Developer/CoreSimulator/Devices/2EAE0CD4-7899-45A3-8E83-E7D79DEEA08F/data/Containers/Data/Application/37F48A5E-7DAB-4E30-A752-F5B62826A15A/Library/Application%20Support/Events.sqlite

+0

Как это получить от 'NSPersistentContainer'? – shallowThought

+0

Я обновил ответ, чтобы продемонстрировать, как добраться до URL-адреса. – Mundi

+0

Вопрос обновлен. – shallowThought

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