Créer et utiliser sqlite3
Fred20
Membre
Bonjour à tous
Je débute sous cocoa et j'aimerais utiliser sqlite pour la gestion de base de données. J'ai trouvé un tuto qui me semblait très intéressant : TUTO – Comment utiliser SQLite avec Objective-C " " Bad Monkey Bad Monkey mais j'ai quelques problèmes malgré tout, et ce, dès le début.
Je cherche donc à créer une base et donc la créer sur mon disque. Voici le code proposé :
Ceci étant, rien ne s'inscrit sur mon disque.
En suivant les NSLog, j'ai bien le nom de ma base, l'endroit où je veux la stocker mais elle n'est pas enregistrée.
Quelqu'un peut il m'aider sur ce sujet ?
Merci d'avance
Je débute sous cocoa et j'aimerais utiliser sqlite pour la gestion de base de données. J'ai trouvé un tuto qui me semblait très intéressant : TUTO – Comment utiliser SQLite avec Objective-C " " Bad Monkey Bad Monkey mais j'ai quelques problèmes malgré tout, et ce, dès le début.
Je cherche donc à créer une base et donc la créer sur mon disque. Voici le code proposé :
<br />
//<br />
// SQLmanager.m<br />
// SQlite_Tuto<br />
<br />
//<br />
#import "SQLmanager.h"<br />
#import <sqlite3.h><br />
<br />
@implementation SQLmanager<br />
-(id) initDataBase<br />
{<br />
if(self = [super init])<br />
{<br />
//DataBse name<br />
databaseName = @"abdname.sqlite";<br />
<br />
//Getting DB path<br />
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask , YES);<br />
NSLog(@" documentPaths = %@",documentPaths);<br />
NSString * documentDir = [documentPaths objectAtIndex:0];<br />
NSLog(@" documentDir = %@",documentDir);<br />
databasePath = [documentDir stringByAppendingPathComponent:databaseName];<br />
NSLog(@" databasePath = %@",databasePath);<br />
<br />
[self checkAndCreateDatabaseWithOverwrite:YES];<br />
}<br />
return self;<br />
}<br />
//Validation et creation de la base de donnees<br />
-(void) checkAndCreateDatabaseWithOverwrite:(BOOL)overwriteDB<br />
{<br />
NSLog(@" passé ");<br />
// BOOL qui servira de verification de l'existance de la BD<br />
BOOL success;<br />
<br />
// Objet pour faire des operations sur le systeme de fichiers<br />
NSFileManager *fileManager = [NSFileManager defaultManager];<br />
<br />
// Verifier de la BD dans databasePath<br />
success = [fileManager fileExistsAtPath:databasePath];<br />
<br />
// Retourner si la BD existe et que le BOOL overwriteDB n'est pas à oui<br />
if (success && !overwriteDB)<br />
{<br />
NSLog(@" success = %i et overwriteDB : %i",success, overwriteDB);<br />
return;<br />
}<br />
<br />
// Chaines de caracteres avec le chemin de la BD dans l'app Bundle<br />
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];<br />
NSLog(@" databasePathFromApp = %@ ",databasePathFromApp);<br />
// Copier la BD de l'app Bundle vers le repertoire de documents<br />
id error = [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];<br />
NSLog(@" error = %@ ",error);<br />
}<br />
@end<br />
Ceci étant, rien ne s'inscrit sur mon disque.
En suivant les NSLog, j'ai bien le nom de ma base, l'endroit où je veux la stocker mais elle n'est pas enregistrée.
Quelqu'un peut il m'aider sur ce sujet ?
Merci d'avance
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bon, je vois aucune instruction de création d'une BD dans ton code !
Tu essayes de copier un fichier du bundle de ton app dans le dossier document, mais ce fichier il sort d'où ?
Voici mon code pour la création d'un BD:
Le shema est un fichier de description des différents champs de la base, par ex:
Ce fichier n'est pas indispensable, tu peux créer ces champs par code dans ton prog.
(si mes souvenirs sont bons, car ça fait un moment que je n'ai pas touché à sqlite ...)
Bon je n'ai pas compris grand à ton code. Cependant, ta 2e citation me parle plus car cela ressemble plus à Qt.
Ceci étant, n'y aurait-il pas l'équivalent de Qt justement pour le code suivant, avec ce principe de requète :
merci d'avance
Je viens de tester ta proposition mais dans ton code :
j'ai le warning suivant : Local declaration of 'sql' hides instance variable
Qu'est ce que ça veut dire ?
Merci d'avance
Exactement ce qui est dit: tu as une variable d'instance nommée sql !
Tu remarqueras que ma méthode createDBAtPath: est une méthode de classe (signe +) ...
Nan, c'est du c++.
Pour simplifier on va supposer que tu inities la base en UTF8.
Le problème est qu'il faut convertir les chaines NSString en UTF8 et vice versa.
NSString -> char* utiliser :
- (const char *)UTF8String
char* -> NSString utiliser :
+ (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc
avec encoding= NSUTF8StringEncoding
Dans mon code je récupère la dernière erreur (setLastError) ce n'est pas une obligation, à toi de l'implémenter si tu le désires.
Plusieurs questions même si j'ai compris la globalité (j'ai réussit à l'adapter à mon projet !) :
- pourquoi tu dois passer par une méthode de classe (+) pour que ça marche sans warning ?
- dans ton 2e exemple, d'où viens pSQL ?
Merci d'avance
err=sqlite3_open([filePath fileSystemRepresentation],&pSQL);
Les variables d'instance sont inaccessibles dans une méthode de classe.
justement, dans ton 2e exemple, tu n'ouvres pas de BD. Je suppose donc qu'il faille l'inscrire au début de ton exemple dans la méthode execute ?
Mais t'as lu un peu la doc ?
C'est tout marqué dedans ...
http://www.sqlite.org/quickstart.html
Force toi (moi aussi j'en suis passé par là ) c'est l'affaire de quelque mois.
En ce qui concerne sqlite, ça se programme en C, donc tout exemple en C fonctionnera, la seule différence c'est qu'il faut convertir les chaines char* -> NSString et NSString -> char*.
http://www.iphonedev...-databases.html
Fais une recherche sur ce forum, ya plein de sujets sur sqlite.