Requêtes sur base SQLite via SQLite.swift impossible[réglé]

toolsDevtoolsDev Membre
janvier 2017 modifié dans Objective-C, Swift, C, C++ #1

Bonjour à  toutes et tous,


 


Suite à  mon récent post 


 


http://forum.cocoacafe.fr/topic/15043-connexion-base-de-donn%C3%A9es-sqlite-direct-ou-via-orm-swift3r%C3%A9gl%C3%A9/


 


je souhaiterais avoir un petit coup de main sur la compréhension et la bonne pratique d'utilisation de la librairie SQLite.swift sous IOS 10 Xcode 8 et bien sur avec swift 3.


 


j'ai crée un projet (via cocoapods pour importer tout le nécessaire) simpleView avec dans mon ViewController ceci :



override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

var db: Connection? = nil

let path = NSSearchPathForDirectoriesInDomains(
.documentDirectory, .userDomainMask, true
).first!
do
{
db = try Connection("\(path)/jeux_video.sqlite")

if let db = db
{
try db.run(Table("jeux").drop(ifExists: true))
print("Connexion SQLite établie.")
}

for row in try! db.prepare("SELECT * FROM jeux")
{
// row[1] = nom du jeu.
print(row[1])
}
}

catch
{
print("Impossible de créer une connexion SQLite.")
}


et j'ai une erreur à  la compilation :


Value of optional type 'Connection?' not unwrapped; did you mean to use '!' or '?'?


 


bref, je n'arrive pas à  afficher un simple "SELECT"  >:(


Autre chose qui à  son importance, sauf erreurs ou incompréhension de ma part, la documentation officielle n'est pas correcte pour beaucoup de choses (erreur pour la connexion, requêtes etc)


 


https://github.com/stephencelis/SQLite.swift


 


Merci pour votre aide  :D


Réponses

  • En gros cela te dis que ton résultat est optionnel, il peut donc est nil. Donc soit tu acceptes qu'il soit nil et tu met un ? soit tu es sur que le résultat n'est pas nil et tu mets !


     


    Attention on prend vite l'habitude de mettre des ! partout mais ce n'est pas bien. Quand on force une valeur qui est nil avec ! le programme crash direct.


     


    A lire : http://alisoftware.github.io/swift/2015/09/06/thinking-in-swift-1/


  • toolsDevtoolsDev Membre
    janvier 2017 modifié #3
    Et sinon par rapport au code de connexion tu en penses quoi ?


    Car certes l'erreur provient de ton explication, mais avec "!" ou "?" Cela crash quand même ... Donc je ne comprends pas, j'aimeraiss bien au moins tester si la requête s'exécute bien, mais je n'y arrive pas.



    Edit:

    C'est au niveau de la méthode "prepare" (la requête) que cela crash
  • Comme ça vite fait à  22h30. Je retirerai 



    var db: Connection? = nil


    Et dans le do{ je remplacerai :



    db = try Connection("\(path)/jeux_video.sqlite")

    par



    let db = try Connection("\(path)/jeux_video.sqlite")

  • Merci de ton aide, je testerais demain matin, et reviendrais
  • Et dans cette ligne pourquoi tu forces avec !



    for row in try! db.prepare("SELECT * FROM jeux")
  • Dans la mesure du possible on ne force jamais avec ! sauf si on est absolument sûr


  • Et dans cette ligne pourquoi tu forces avec !

    for row in try! db.prepare("SELECT * FROM jeux")



    J'ai forcer par tâtonnement... sinon j'avais une erreur à  la compilation.
  • Il n'est pas nécessaire d'initialiser les variables optionnelles avec la valeur nil. Swift le fait automatiquement.



    var db: Connection?

    Pour le reste, mes connaissances en SQL étant égales au niveau d'empathie de Donald Trump, je ne peux pas t'aider.

  • toolsDevtoolsDev Membre
    janvier 2017 modifié #10

    bonjour,


    je viens de modifié mon code et j'ai encore plus d'erreurs à  la compilation, je ne comprends plus rien en fait  >:(



    import UIKit
    import SQLite

    class ViewController: UIViewController {

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    //var db: Connection? = nil

    let path = NSSearchPathForDirectoriesInDomains(
    .documentDirectory, .userDomainMask, true
    ).first!
    do
    {
    db = try Connection("\(path)/jeux_video.sqlite")

    if let db = db
    {
    try db.run(Table("jeux").drop(ifExists: true))
    NSLog("Connexion \(db) SQLite établie.")
    }

    for row in try? db.prepare("SELECT * FROM jeux")
    {
    // row[1] = nom du jeu.
    print(row[1])
    }
    }

    catch
    {
    NSLog("Impossible de créer une connexion SQLite.")
    }
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }

    }

    Mes erreurs :


    Use of unresolved identifier 'db' donc, il attendrait un affection comme j'avais fait plus haut finalement ?


     


    de plus, j'ai aussi un "soucis", quand j'exécute mon projet depuis "jeux_video.xcodeproj" l'import SQLite n'est plus reconnue !


    et quand je l'exécute depuis "jeux_video.xcworkspace" là  toute la librairie SQLite.swift est bien reconnu. Pas clair...


    Je rappelle que j'ai généré mon projet via cocoapods, je n'ai pas pu faire d'erreur, tout étant automatisé...



  • db = try Connection("\(path)/jeux_video.sqlite")

    C'est la première fois que tu utilises db dans ton code.


    Mais c'est quoi db ? ça manque un var ou un let devant.


  • let db = try Connection("\(path)/jeux_video.sqlite")

    j'avais retiré le "let" ... mais même avec ça, toujours des erreurs de compilations :


     


    1)Initializer for conditional binding must have Optional type, not 'Connection'


    2)Value of optional type 'Statement?' not unwrapped; did you mean to use 'try!' or chain with '?'?


     


    toujours le même soucis d'"optionnel" 

  • Bonjour,


     


    Les bonne pratique lorsqu'on utilise des optionnel et de les tester avant de les utiliser. Tu peu utiliser par exemeple un "if let" pour être sur que ta variable n'est pas nil est ainsi adapter ton code, celà  t'évitera beaucoup de plantage de l'app.


  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu as essayé ?



    do
    {
    let db = try Connection(...)

    try db.run(...)


    }
    catch
    {
    ...
    }
  • salut,


     


    oup's, je suis navré je n'avais pas édité mon post, j'ai décidé d'utiliser GRDB.swift sur les conseils de Céroce et de nombreux autres membres.


     


    Du coup j'ai abandonné SQLite.swift


     


    Mais je pense que tu avais surement raison je n'entourais pas correctement ma connexion de test...


     


    je te remercie :)


Connectez-vous ou Inscrivez-vous pour répondre.