Requêtes sur base SQLite via SQLite.swift impossible[réglé]
Bonjour à toutes et tous,
Suite à mon récent post
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
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/
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
Et dans le do{ je remplacerai :
par
Et dans cette ligne pourquoi tu forces avec !
Dans la mesure du possible on ne force jamais avec ! sauf si on est absolument sûr
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.
Pour le reste, mes connaissances en SQL étant égales au niveau d'empathie de Donald Trump, je ne peux pas t'aider.
bonjour,
je viens de modifié mon code et j'ai encore plus d'erreurs à la compilation, je ne comprends plus rien en fait >:(
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é...
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.
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.
Tu as essayé ?
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