0 votes

Obtenir une erreur comme l'erreur sigabart sur l'iPhone avec la déclaration compilée

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.

0voto

Nick Bedford Points 3009

J'ai eu un problème similaire, puisque l'ouverture d'une base de données sqlite3 en crée une par défaut si elle n'existe pas, ce qui peut être causé par une mauvaise détermination du chemin d'accès entre le Simulateur et votre iPhone.

Comment déterminez-vous le chemin d'accès au fichier de la base de données (db.sql) ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X