Problème de récupération de données SQLite3

Bonjour,



Je débute en développement ios, et je suis actuellement entrain de travailler sur un petit projet.



Mon problème est le suivant :



J'ai créé une petite base de données en se servant du module sqliteManager de firefox et dans mon code j'ai une méthode qui permet de récupérer les données d'une table.


<br />
-(NSMutableArray *)getAllCountryOf:(NSString *)continent{<br />
    NSMutableArray *tempCountryArray = [[NSMutableArray alloc]init];<br />
    @try {<br />
	    NSFileManager *fileMgr = [NSFileManager defaultManager];<br />
	    NSString *dbPath = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@&quot;MyCountryDataBase.sqlite&quot;];<br />
	    BOOL success = [fileMgr fileExistsAtPath:dbPath];<br />
	    if(&#33;success){<br />
		    NSLog(@&quot;Cannot locate dataBase File %@.&quot;,dbPath);<br />
	    }<br />
	    if(&#33;(sqlite3_open([dbPath UTF8String],&amp;db) == SQLITE_OK)){<br />
		    NSLog(@&quot;An error has Occured&#33;&#33;&quot;);<br />
	    }<br />
	    //La requete<br />
        NSString *sql = @&quot;SELECT Country_Name,Country_Flag FROM CountryTable&quot;;<br />
	    sqlite3_stmt *sqlStatement;			   <br />
	    if(sqlite3_prepare_v2(db,[sql UTF8String], -1, &amp;sqlStatement, NULL) &#33;= SQLITE_OK){<br />
		    printf(&quot;could not prepare statemnt: %s&#092;n&quot;, sqlite3_errmsg(db));<br />
	    }<br />
//Pour le moment j&#39;ai pas testé la boucle, vu qu&#39;il n&#39;arrive pas à  récupérer les données<br />
	    while (sqlite3_step(sqlStatement) == SQLITE_ROW) {<br />
		    CountryListDec *country = [[CountryListDec alloc]init];<br />
		    country.countryName = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,1)];<br />
		    //Pour la photo<br />
		    const char *raw = sqlite3_column_blob(sqlStatement, 2);<br />
		    int rawLen = sqlite3_column_bytes(sqlStatement, 2);<br />
		    NSData *data = [NSData dataWithBytes:raw length:rawLen];<br />
		   <br />
		    country.countryFlag = [[UIImage alloc] initWithData:data];<br />
		    [tempCountryArray  addObject:country];<br />
	    }<br />
    }//try<br />
    @catch (NSException *exception) {<br />
	    NSLog(@&quot;An exception occured: %@&quot;, [exception reason]);<br />
    }<br />
    @finally {<br />
	    return tempCountryArray;<br />
    }<br />




Par contre, j'ai toujours un message d'erreur comme quoi la table n'existe pas !.



Pouvez-vous m'aider à  résoudre ce problème ?
Mots clés:

Réponses

  • sam-7sam-7 Membre
    J'ai déjà  eu un soucis du genre mais mon initialisation est différente, voici le code :


    <br />
    - (id) initDatabase {<br />
    	if(self = [super init]) {<br />
    	  <br />
    		databaseName = @&quot;nom_de_la_bdd.sql&quot;;<br />
    	  <br />
    		NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);<br />
    	  <br />
    		NSString *documentsDir = [documentPaths objectAtIndex:0];<br />
    		databasePath = [documentsDir stringByAppendingPathComponent:databaseName];<br />
    	  <br />
    		BOOL success;<br />
    	  <br />
    		NSFileManager *fileManager = [NSFileManager defaultManager];<br />
    	  <br />
    		success = [fileManager fileExistsAtPath:databasePath];<br />
    		if(&#33;success){<br />
    		  <br />
    			NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];<br />
    			[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];<br />
    			[fileManager release];<br />
    		}<br />
    	  <br />
    		[databasePath retain];<br />
    	}<br />
    	return self;<br />
    }<br />
    




    Ce qu'il se passe c'est que il va importer la bdd de ton projet dans le simulateur seulement si elle n'existe pas.



    Donc quand je mettais à  jour mes tables et que je runnais mon projet, forcément il ne trouvait pas les modifications ! (ajout d'une table ou d'un enregistrement)

    La solution était donc de supprimer l'appli du simulateur pour qu'il l'a réimporte à  nouveau.



    Je ne sais plus où j'ai trouvé ce bout de code, je ne sais pas si cela peut t'aider, mais en tout cas ce que je peux te conseiller c'est de séparer l'initialisation des requêtes sur ta bdd.



    Au passage ceci m'a bien aidé : http://www.iphonesdk...category/sqlite





    Sam.
  • Bonjour sam et surtout merci pour ta réponse.



    J'ai réussi à  regler le problème en mettant le code ci-dessous (j'ai modifié une seule ligne), et ça à  l'air de fonctionner image/smile.png' class='bbc_emoticon' alt=':)' />


    <br />
    -(NSMutableArray *)getAllCountryOf:(NSString *)continent{<br />
        NSMutableArray *tempCountryArray = [[NSMutableArray alloc]init];<br />
        @try {<br />
    	    NSFileManager *fileMgr = [NSFileManager defaultManager];<br />
    //-----Modification <br />
    	    NSString *dbPath = [[NSBundle mainBundle]pathForResource:@&quot;CountryBase&quot;ofType:@&quot;sqlite&quot;];<br />
    //------Fin modification<br />
    	    BOOL success = [fileMgr fileExistsAtPath:dbPath];<br />
    	    if(&#33;success){<br />
    		    NSLog(@&quot;Cannot locate dataBase File %@.&quot;,dbPath);<br />
    	    }<br />
    	    if(&#33;(sqlite3_open([dbPath UTF8String],&amp;db) == SQLITE_OK)){<br />
    		    NSLog(@&quot;An error has Occured&#33;&#33;&quot;);<br />
    	    }<br />
    	    //La requête<br />
    	    NSString *sql = [NSString stringWithFormat:@&quot;SELECT * FROM CountryTable WHERE CountryContinent = &#39;%@&#39;&quot;,continent];<br />
    	   <br />
    	    sqlite3_stmt *sqlStatement;			   <br />
    	    if(sqlite3_prepare_v2(db,[sql UTF8String], -1, &amp;sqlStatement, NULL) &#33;= SQLITE_OK){<br />
    		    printf(&quot;could not prepare statemnt: %s\n&quot;, sqlite3_errmsg(db));<br />
    	    }<br />
    	    while (sqlite3_step(sqlStatement) == SQLITE_ROW) {<br />
    		    CountryListDec *country = [[CountryListDec alloc]init];<br />
    		    country.countryName = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,1)];<br />
    		    //Pour la photo<br />
    		    country.countryFlag = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,1)];<br />
    		    [tempCountryArray  addObject:country];<br />
    	    }<br />
        }//try<br />
        @catch (NSException *exception) {<br />
    	    NSLog(@&quot;An exception occured: %@&quot;, [exception reason]);<br />
        }<br />
        @finally {<br />
    	    return tempCountryArray;<br />
        }<br />
    }<br />
    
Connectez-vous ou Inscrivez-vous pour répondre.