2017-07-02 4 views
1

J'ai récemment commencé un projet iOS et j'ai besoin de travailler avec une base de données autonome qui sera téléchargée à partir d'Internet quand il y aura des mises à jour. C'est mon premier projet iOS, alors j'essaie de faire fonctionner les fonctionnalités avant de concevoir le mécanisme de téléchargement.Comment travailler avec une base de données SQLite existante dans iOS?

J'ai sélectionné l'encapsuleur SQLite SWLite.swift (https://github.com/stephencelis/SQLite.swift) et mes requêtes et vues de table sont prêtes à être exécutées. Mais je ne peux pas me connecter à la base de données. J'ai essayé à peu près toutes les autres questions/réponses ici avec absolument aucun succès.

Par exemple, j'ai laissé tomber la base de données SQLite dans le Assets.xcassets et essayé let path = Bundle.main.path(forResource: "myDb", ofType: "db")! et les accidents d'applications (que je suis de retour nil - sans doute parce que le chemin n'a pas pu être localisé). De même, j'ai essayé ce que d'autres ont suggéré, y compris la création d'un dossier sur mon Mac, en y déposant le fichier, en ajoutant .bundle au nom du dossier, et en déposant cela dans les Assets ... encore, nil.

Quelqu'un pourrait-il nous conseiller? J'ai regardé les Apple Docs et je n'ai pas vraiment trouvé ce que je cherchais - encore une fois, c'est ma première fois, alors peut-être que je me trompe.

Répondre

1

Vous ne pouvez pas lire directement à partir de fichiers sqlite groupés sur votre téléphone. Vous devez d'abord le copier dans le dossier Documents et commencer à lire à partir de là. Cela a seulement besoin d'être fait une fois. Pour le déplacer,

let path = Bundle.main.path(forResource: "DBName", ofType: "sqlite") 
do{ 
    try fileManger.copyItem(atPath: path!, toPath: dbPath) 
}catch let error as NSError { 
    print("error occurred, here are the details:\n \(error)") 
} 

de vous connecter, vous pouvez utiliser

let doumentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString 
let dbPath = doumentDirectoryPath.appendingPathComponent("DBName.sqlite") 
+0

@ The48Percent dbPath est chemin de format de chaîne de votre fichier SQLite sous le dossier de documents. Vous pouvez utiliser votre bibliothèque SQLite pour lire le fichier à partir de là. –

+0

Pourriez-vous donner un exemple de ce que 'dbPath' devrait être? App se bloque à l'instruction try avec 'erreur fatale: trouvé de manière inattendue nil tout en déballant une valeur facultative». Le code était un mélange de ce que vous aviez suggéré: 'essayer fileManager.copyItem (atPath: path !, toPath:" myDb.sqlite ")' – The48Percent

+0

@ The48Percent Utilisez le 'dbPath' dans mon deuxième exemple. –

-1

Tout d'abord, vous ne voulez jamais avoir votre db nulle part ailleurs, sauf dans votre dossier Documents.

Voici le processus à voir avec SQLite.Swift: -

// this is the path where your DB should be 

let path = NSSearchPathForDirectoriesInDomains(
.documentDirectory, .userDomainMask, true 
).first! 


// this is how you create a DB with a table:- 

    do { 
       let db_name = "my_db" 
       let db = try Connection("\(path)" + "/" + db_name! + ".sqlite3") 
       try db.key("12345") // if db is encrypted with SQLCipher 

       do { 
        try db.run(mastertableName.create(ifNotExists: true) { t in 

         t.column(database_name) 
         t.column(email, unique: true) 
         t.column(date_created) 
         t.column(device_info) 
        }) 
       } 
       catch { 

        print("Creating Master Table Failed!") 
       } 

Juste en faisant une connexion, il va créer un DB pour vous, si elle n'existe pas !!

lecture du DB: -

do { 
     let db_name = "my_db" 
     let db = try Connection("\(path)" + "/" + db_name! + ".sqlite3") 
     try db.key("12345") 

    // db is now open... do your stuff.. 
} 

catch { 
print("opening the db failed!") 
}