Je suis en train de préparer une déclaration sqlite et en préparant cette déclaration, mon code est cassé.
if (sqlite3_prepare_v2(database,getCC , -1, &getConsumptionCount, NULL) != SQLITE_OK)
{
NSAssert1(0, @"Error: failed to prepare for getConsumptionCount statement with message '%s'.", sqlite3_errmsg(database));
}
qui fonctionne parfaitement sur le simulateur mais se casse la figure sur l'iPhone.
Ma base de données db.sql se trouvait dans un dossier de ressources que j'ai déplacé dans un autre dossier de ressources. Quelle est la raison pour laquelle j'obtiens l'erreur SIGABRT ? Je sais que c'est à cause de NSAssert1 que j'ai mis là mais pourquoi mon application n'arrive pas à se préparer pour la déclaration.
Quand je vois dans le débogueur, il dit qu'il n'y a pas de telle table, mais je suis confus parce que ma base de données est là et a la table. Y a-t-il quelque chose que je fais mal ? Comment résoudre ce problème ?
Je procède de la manière suivante
databaseName = @"CaloriePacerDatabase.sql";
// Setup some globals
// Get the path to the documents directory and append the databaseName
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
inFormat = [[NSDateFormatter alloc] init];
[inFormat setDateFormat:@"yyyy-MM-dd"];
databasePath = [[NSString alloc] initWithString: [documentsDir stringByAppendingPathComponent:databaseName]];
[self checkAndCreateDatabase];
[self openDatabase];
[self compileStatements];
return self;
}
- (void) checkAndCreateDatabase
{
// Check if the SQL database has already been saved to the users phone, if not then copy it over
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];
}
- (void) openDatabase
{
if(sqlite3_open([databasePath UTF8String], &database) != SQLITE_OK)
{
NSAssert1(0, @"Error: failed to open Database '%s'.", sqlite3_errmsg(database));
}
}
- (void) compileStatements
{
//int i = sqlite3_prepare_v2(database,getCC , -1, &getConsumptionCount, NULL);
NSLog(databasePath);
if ( sqlite3_prepare_v2(database,getCC , -1, &getConsumptionCount, NULL)!= SQLITE_OK) {
NSAssert1(0, @"Error: failed to prepare for getConsumptionCount statement with message '%s'.", sqlite3_errmsg(database));
}
Veuillez me faire savoir si ce n'est pas la bonne façon de procéder.