2009-09-29 9 views
0

j'ai un problème depuis quelque temps que je ne peux pas résoudre:requête SQLite ne peut pas être appelé à partir d'un contrôleur

Dans le applicationDidFinishLaunching j'ai ce code:

[self checkAndCreateDatabase]; 
[self readCharsFromDatabase];// which stores into an array some objects 
[self readGlyphsFromDatabaseAtId:@"a"];// idem 

Le second tableau i « utilise dans un ViewController secondaire et je reçois le tableau dans le viewDidLoad avec:

AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
self.array = delegate.array2; 

Tout parfait jusqu'à maintenant, juste que je veux lancer une nouvelle requête avant d'obtenir le array2. J'essaye avec ceci:

AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
[delegate readGlyphsFromDatabaseAtId:@"b"];// which is supposed to override my array2 with new values 
self.array = delegate.array2; 

Cela arrête mon application sans erreur. Je reçois ce message que:

GNU gdb 6.3.50-20050815 (version d'Apple gdb-966) (mar 10 mars 02:43:13 UTC 2009) Copyright 2004 Free Software Foundation, Inc. GDB est gratuit logiciel, couvert par la GNU General Public License, et vous êtes le bienvenue pour le changer et/ou distribuer des copies de celui-ci sous certaines conditions. Tapez "show copy" pour voir les conditions. Il n'y a absolument aucune garantie pour GDB. Tapez "show warranty" pour plus de détails. Cette GDB a été configuré comme « i386-apple-darwin » .sharedlibrary apply-charge toutes les règles Fixation pour traiter 4736.

Ma méthode est appelée jusqu'à ce point, après je ne suis pas un NSLog ni dans le si, ni dans le autre:

if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 

quelqu'un peut-il aider? Ou si la logique est fausse de me montrer la bonne façon de le faire? Si ce n'est pas trop grand pour la mémoire, je peux stocker toute la base de données dans certains tableaux, il a 400kb Merci!

EDIT: Voici comment ressemble ma fonction:

-(void) readGlyphsFromDatabaseAtId:(NSString *)charId { 
    NSLog(@"reading glyphs for id %@", charId); 
    // Setup the database object 
    sqlite3 *database; 

    // Init the animals Array 
    glyphs = [[NSMutableArray alloc] init]; 
    NSLog(@"1"); 
    // Open the database from the users filessytem 
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
     NSLog(@"reading row"); 
     // Setup the SQL Statement and compile it for faster access 
     NSString *query = [NSString stringWithFormat:@"SELECT nr,title,description FROM `glyphs` WHERE `id`='%@'", charId]; 
     NSLog(@"%@", query); 
     //const char *sqlStatement = "SELECT nr,title,description FROM `glyphs` WHERE `id`='b'"; 
     sqlite3_stmt *compiledStatement; 
     if(sqlite3_prepare_v2(database, [query UTF8String], -1, &compiledStatement, nil) == SQLITE_OK) { 
      NSLog(@"prepared OK"); 
      while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
       //NSLog(@"reading row"); 
       NSString *aNr = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
       NSString *aTitle = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]; 
       NSString *aDescription = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)]; 
       //NSLog(@"glyph: %@ %@ %@", aNr, aTitle, aDescription); 

       Glyph *g = [[Glyph alloc] initWithCharId:charId glyphNr:aNr glyphTitle:aTitle glyphDescription:aDescription]; 

       [glyphs addObject:g]; 
       [g release]; 
      } 
     } 
     else { 
      NSLog(@"not prepared"); 
     } 
     // Release the compiled statement from memory 
     sqlite3_finalize(compiledStatement); 
    } 
    else{ 
     NSLog(@"sqlite not ok"); 
    } 
    sqlite3_close(database); 
    NSLog(@"fin reading database2"); 
} 
+0

Si elle tombe juste dans GDB sans message d'erreur apparaît, comment savez-vous qu'il est en fait une erreur? Avez-vous essayé d'exécuter «Construire et analyser», et d'utiliser le détecteur de fuites de mémoire et tous les autres outils très utiles pour résoudre ce genre de problèmes? – Jacob

+0

Assurez-vous également que vous ne disposez pas d'un point d'arrêt que vous avez oublié. – nall

+0

Merci pour les conseils, je suis au début avec l'iphone, 2-3 semaines donc il sera difficile pour moi d'utiliser ces outils, mais je vais essayer. Je n'ai pas non plus de points de rupture. Donc, il n'y a rien de mal avec ma méthode? –

Répondre

0

appelez-vous sqlite3_open() dans chaque invocation de readGlyphsFromDatabaseAtId? Si vous faites cela avec la base de données déjà ouverte, cela peut causer des problèmes.

+0

J'ai édité le premier message. Si je l'appelle à partir de l'AppDelegate je peux l'appeler autant de fois que je le veux –

+0

lorsque ce blocage se produit, tapez ctrl-c dans la fenêtre de la console gdb. puis tapez 'where' pour obtenir une trace de pile et l'afficher. – nall

+0

Il semble qu'il y ait un problème avec le chemin de la base de données, je ne peux pas y accéder. Donc, cette ligne n'est pas exécutée si je l'y introduis: NSLog (@ "DATABASE PATH% @", databasePath); Des idées maintenant? –

1

Ok, semble que le chemin de la base de données n'était pas accessible, donc je l'ai ré-initié et fonctionne maintenant. Si quelqu'un peut éclairer un peu pourquoi ....

databasePath a été inited dans applicationDidFinishLaunching

+0

Trouver tous les endroits où databasePath est initialisé. N'oubliez pas de vérifier le XIB si vous utilisez des liaisons IB. – nall

Questions connexes