2012-07-23 2 views
0

Je suis un développeur iPhone débutant qui essaie de prendre des informations sur une base de données sqlite dans Xcode 4.3. J'ai ma base de données (qui s'appelle DB_Info.sqlite) dans le même répertoire que mes fichiers .h et .m, et j'ai également fait glisser la base de données dans la section des dossiers sur la barre de gauche dans Xcode. Pourriez-vous jeter un coup d'œil à mon code et me dire où est mon erreur? J'ai utilisé NSLogs pour identifier où le problème se produit, à la toute dernière instruction if, et il est écrit dans les commentaires. Merci d'avance!SQLite ne prépare pas de requête lors de l'accès à la base de données dans Xcode

#import <sqlite3.h> 
@implementation Player 
{ 
    sqlite3 *DB_Info; 
    NSString *databasePath; 
    NSString *docsDir; 
    NSArray *dirPaths; 
} 

-(Player*)createPlayer:(NSString*)playerName 
{   

    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    docsDir = [dirPaths objectAtIndex:0]; 
    databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"DB_Info.sqlite"]]; 
    const char *dbpath = [databasePath UTF8String]; 
    sqlite3_stmt *statement; 

    if (sqlite3_open(dbpath, &DB_Info) == SQLITE_OK) { //works fine 

     NSString *querySQL = [NSString stringWithFormat: @"SELECT * FROM playerlist WHERE fullName=\"%@\"", playerName]; 

     const char *query_stmt = [querySQL UTF8String]; 

     if (sqlite3_prepare_v2(DB_Info, query_stmt, -1, &statement, NULL) == SQLITE_OK) { //PROBLEM: This is where the problem is, and the if statement never goes through 
     //....rest of code here 
     } else { 
     NSLog(@"Error"); 
     } 
} 
+0

NSLog (@"% @ ", querySQL), et vérifiez soigneusement que querySQL est la bonne requête –

+0

Vous êtes Si vous n'en avez pas, sqlite3_open créera une base de données vide pour vous. Vous devez probablement (a) vouloir copier la base de données de bundle vers des documents (en supposant que vous l'ayez inclus dans votre bundle).) et (b) utilisez sqlite3_open_v2 au lieu de sqlite_open – Rob

Répondre

3

D'abord, au lieu de dire "erreur", connectez-vous le message d'erreur SQL

NSLog(@"%s SQL error '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));` 

Il vous dira exactement ce qui se passe mal. Une erreur courante sur les projets SQL des utilisateurs pour la première fois est que la table n'est pas trouvée. Si oui, continuez à lire. (Sinon, n'hésitez pas à ignorer le reste.)

Deuxièmement, vous recherchez votre base de données dans votre dossier Documents. L'avez-vous explicitement copié de votre bundle dans votre dossier Documents à un moment donné? Ou l'avez-vous créé par programme? Mais si vous l'avez préparé à l'avance, il ne figurera pas dans le dossier Documents tant que vous ne l'aurez pas copié. Troisièmement, je suggère également que vous envisagez d'utiliser sqlite3_open_v2 au lieu de sqlite3_open. Vous vérifiez si c'est SQLITE_OK, mais cela peut donner un faux sentiment de sécurité. Le sqlite3_open va créer une base de données si elle n'est pas là, ce qui n'est clairement pas votre intention. Votre application doit vraisemblablement être en train de copier la base de données de l'ensemble ou de créer la base de données et les tables avant d'utiliser cette méthode (et vous ne montrez pas cela, donc je ne suis pas sûr si vous le faites). De toute façon, la fonction sqlite3_open_v2 ne créera pas la base de données si elle n'est pas là sauf si vous le demandez explicitement en incluant SQLITE_OPEN_CREATE. Donc, quelque chose comme ce qui suit ne va pas créer la base de données si elle est introuvable:

if (sqlite3_open_v2(dbpath, &DB_Info, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK) { 

Au hasard qu'une base de données vide a été créé pour vous, je vous suggère de réinitialiser votre simulateur via « Reset contenu et Paramètres "dans le menu du simulateur, ou supprimer explicitement l'application, de sorte que les bases de données vierges qui ont pu être créées peuvent être supprimées. Si vous l'utilisez sur un appareil, supprimez l'application et réinstallez-la.

Quatrièmement, si la base de données a été créée à l'avance, avez-vous confirmé que la base de données a été inclus dans le paramètre « Ressources Bundle Copy »? .: par exemple

copy bundle resources

cinquième, si vous utilisez l'application sur le simulateur, vous pouvez toujours parcourir la structure de fichiers du simulateur et assurez-vous que vos fichiers sont là où vous pensez qu'ils sont. Vous pouvez également exécuter le programme Mac OS sqlite pour inspecter la base de données utilisée par le simulateur pour vérifier que tout fonctionne correctement. Vous pouvez même tester votre SQL directement dans la base de données que le simulateur utilise, ce qui peut être utile à des fins de diagnostic. (Ou, si vous n'aimez pas le texte Mac basé sqlite programme, vous pouvez également acheter/télécharger des outils graphiques, tels que Base.) Avant de pouvoir le faire, vous pouvez d'abord vouloir configurer votre Mac afin que vous puissiez facilement naviguer sur le les fichiers de simulation exige que vous lancez le programme Terminal et exécutez la commande suivante:

chflags nohidden ~/Library 

vous pouvez ensuite parcourir à « ~/Library/application \ support/iPhone \ Simulator/5.1/Applications/"et ensuite parcourir les différentes applications que vous avez et assurez-vous que le fichier db est là

+1

merci, on dirait que ça marche maintenant! –

Questions connexes