2017-09-08 4 views
0

Ceci est mon premier projet DB, donc je suis confronté à des problèmes. J'espère que vous pouvez m'aider! J'utilise FMDB pour avoir accès à une base de données existante. Quand j'essaie d'exécuter une requête simpel comme "Select * From films", elle renvoie des trucs comme "no such table". J'ai regardé dans le dossier du simulateur IPhone et j'ai trouvé la base de données, mais elle était vide. Mon étape suivante consistait à inclure cette méthode:Copier la base de données après avoir démarré rapidement

func copyDatabaseIfNeeded() { 
    // Move database file from bundle to documents folder 

    let fileManager = FileManager.default 

    let documentsUrl = fileManager.urls(for: .documentDirectory, 
             in: .userDomainMask) 

    guard documentsUrl.count != 0 else { 
     return // Could not find documents URL 
    } 

    let finalDatabaseURL = documentsUrl.first!.appendingPathComponent("foo.db") 

    if !((try? finalDatabaseURL.checkResourceIsReachable()) ?? false) { 
     print("DB does not exist in documents folder") 

     let documentsURL = Bundle.main.resourceURL?.appendingPathComponent("foo.db") 

     do { 
      try fileManager.copyItem(atPath: (documentsURL?.path)!, toPath: finalDatabaseURL.path) 
     } catch let error as NSError { 
      print("Couldn't copy file to final location! Error:\(error.description)") 
     } 

    } else { 
     print("Database file found at path: \(finalDatabaseURL.path)") 
    } 
} 

Mais cette méthode ne fonctionne pas. Je l'appelle de DidFinishLaunching.

Ceci est le message d'erreur:

OverBurned/Library/Developer/CoreSimulator/Devices/B5EAE004-A036-4BD5-A692-C25EF3875D25/data/Containers/Bundle/Application/5ABA8D38-7625-4F98-83E9-4266A3E5B6B0/GameOne.app/foo.db, NSUnderlyingError=0x600000053230 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}} 

()

Suis-je utiliser la mauvaise méthode ou est mis en oeuvre ne va pas?

+0

je l'ai trouvé plus facile à utiliser la bibliothèque sqlite.swift pour ma première application DB au lieu de FMDB. Cela pourrait valoir le détour. – Martheli

+0

Votre message d'erreur ne correspond pas au code que vous avez publié. Et vous avez vraiment besoin de vous familiariser avec les options. – rmaddy

Répondre

1

L'erreur est claire. Il n'y a pas de foo.db dans l'ensemble de ressources de votre application.

Vous avez beaucoup de problèmes avec le code que vous avez publié.

  1. Votre code pour obtenir le chemin vers foo.db est loin d'être idéal.
  2. Vous ne traitez pas correctement les options.
  3. Les noms de vos variables doivent être améliorés. Exemple - le deuxième documentsURL implique qu'il s'agit d'un URL référençant le dossier "Documents". Il s'agit en fait d'un URL dans un fichier du regroupement de ressources. Il n'y a pas besoin de NSError

Voici comment j'écrire ce code:

func copyDatabaseIfNeeded() { 
    // Move database file from bundle to documents folder 

    let fileManager = FileManager.default 

    guard let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } 

    let finalDatabaseURL = documentsUrl.appendingPathComponent("foo.db") 

    do { 
     if !fileManager.fileExists(atPath: finalDatabaseURL.path) { 
      print("DB does not exist in documents folder") 

      if let dbFilePath = Bundle.main.path(forResource: "foo", ofType: "db") { 
       try fileManager.copyItem(atPath: dbFilePath, toPath: finalDatabaseURL.path) 
      } else { 
       print("Uh oh - foo.db is not in the app bundle") 
      } 
     } else { 
      print("Database file found at path: \(finalDatabaseURL.path)") 
     } 
    } catch { 
     print("Unable to copy foo.db: \(error)") 
    } 
} 
+0

Je pensais que la base de données serait copiée par défaut. Il m'a fallu beaucoup de temps pour découvrir que j'avais tort. Donc j'ai juste copié la méthode d'un autre article. Ce n'est pas le mien. Mais merci beaucoup pour votre méthode! J'ai essayé mais l'erreur est malheureusement la même. Y at-il quelque chose, je dois chercher lors de l'importation de la DB, sauf la copie de la case à cocher? – OverBurned

+0

En utilisant le code que j'ai posté, que se passe-t-il exactement? Quel message apparaît? – rmaddy

+0

OverBurned/Bibliothèque/Developer/CoreSimulator/Périphériques/B5EAE004-A036-4BD5-A692-C25EF3875D25/data/Conteneurs/Données/Application/C15B1423-7531-4F90-B726-AAB5528A656F/Documents/foo.db, NSUnderlyingError = 0x600000052300 {Error Domain = NSPOSIXErrorDomain Code = 2 "Aucun fichier ou répertoire de ce type"}} () – OverBurned