2011-01-27 2 views
1

Je travaille sur un nouveau projet iPhone et je rencontre des problèmes avec sqlite. Je l'ai déjà fait sur un projet différent et ça a très bien fonctionné, donc je ne suis pas sûr de ce qui se passe exactement avec celui-ci. J'utilise le même code que précédemment, mais la situation est un peu différente. Tout d'abord, j'essaye cette fois d'utiliser le test unitaire, j'ai donc créé un ensemble de test d'unité de cacao, et j'ai réussi à faire fonctionner ce test, puis j'ai voulu faire un test d'unité pour ma base de données sqlite.Erreurs SQLite à l'aide du simulateur iPhone/Problème d'autorisation possible

La première chose que courir avec ce test est [auto checkAndCreateDatabase] qui est la suivante:

-(void) checkAndCreateDatabase{ 
     BOOL success; 

     // Create a FileManager object, we will use this to check the status 
     // of the database and to copy it over if required 
     NSFileManager *fileManager = [NSFileManager defaultManager]; 

     // Check if the database has already been created in the users filesystem 
     success = [fileManager fileExistsAtPath:databasePath]; 

     // If the database already exists then return without doing anything 
     if(success) return; 

     // If not then proceed to copy the database from the application to the users filesystem 

     // Get the path to the database in the application package 
     NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; 

     // Copy the database from the package to the users filesystem 
     [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; 

     [fileManager release]; 
    } 

Alors je tente d'ouvrir la base de données avec la ligne suivante:

int result = sqlite3_open([databasePath UTF8String], &database); 

Cela échoue à chaque fois avec le code d'erreur 14 SQLITE_CANTOPEN, et databasePath est "/ Users/labuser/Bibliothèque/Application Support/iPhone Simulator/Documents/projectfusion.db3". Ce qui est étrange, c'est que quand je vais dans ce répertoire, Documents/n'est pas là, donc si je le crée, alors ça n'échoue pas MAIS projectfusion.db3 a alors une taille de 0kb; les tables ne sont pas là. Cela fait échouer sqlite3_prepare_v2(), car les tables ne sont pas là. Si je copie manuellement le fichier projectfusion.db3 dans ce répertoire avant de l'exécuter, cela fonctionne très bien. Est-ce parce que je le fais dans les tests unitaires et que les scripts n'ont pas la permission ou quelque chose comme ça? Ou est-ce parce que je travaille sur un ordinateur scolaire de mon université et que je ne peux pas écrire dans ce répertoire? (J'ai essayé de me connecter en tant qu'administrateur et cela n'a pas fonctionné non plus).

Répondre

0

Essayez le code ci-dessous,

J'ai mis une macro appelé test, donc je ne dois pas garder le code en commentaire.

 
- (NSString *)createEditableCopyOfDatabaseIfNeeded { 
    // First, test for existence. 
    BOOL success; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    #ifdef TEST 
    documentsDirectory = [[NSFileManager defaultManager] currentDirectoryPath]; 
    #endif 


    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:DBNAME]; 
    success = [fileManager fileExistsAtPath:writableDBPath]; 
    if (success) { return writableDBPath;} ; 
    // The writable database does not exist, so copy the default to the appropriate location. 

    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:DBNAME];  
    #ifdef TEST 
    defaultDBPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"YOURDB" ofType:@"sqlite"]; 
    #endif 

    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
    if (!success) { 
     NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
    } 
    return (defaultDBPath); 
} 
0

Essayez d'ajouter la base de données à votre ensemble d'applications dans xcode, puis copiez-la dans le répertoire Documents des applications. Vous pouvez obtenir cette voie en utilisant

- (NSString *)applicationDocumentsDirectory { 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
return basePath; 
} 
+0

Je ne vois pas pourquoi c'est différent de ce que je fais déjà. Je l'ai essayé en remplaçant mon code ci-dessus par NSString * databasePathFromApp = [NSString stringWithFormat: @ "% @ /% @", [self applicationDocumentsDirectory], databaseName]; et le chemin qui a été retourné était "/ Users/labuser/Bibliothèque/Application Support/iPhone Simulator/Documents/projectfusion.db3" qui est le même que ci-dessus. Je suppose que "ajouter la base de données à votre ensemble d'applications" signifie l'ajouter en tant que fichier existant? Je l'ai fait dans mon répertoire "Ressources". – gameburke

+0

Il devrait retourner comme ceci:/Users/max/Bibliothèque/Application Support/iPhone Simulator/4.2/Applications/C5178257-E12C-4088-BA2C-68E472458575/Documents Il est vraiment étrange. Ok, pouvez-vous accéder à votre base de données à partir de l'ensemble d'applications? – Max

+0

J'ai regardé dans le Finder sous build/Debug-iphonesimulator/ProjectFusion, "Afficher le contenu du paquet" sur ProjectFusion et il était là. C'est ce que tu veux dire? – gameburke

Questions connexes