2009-09-23 6 views
0

Je prépare la déclaration sqlite et en préparant cette déclaration mon code est breaking.I am utilise la ligne de code suivanteerreur comme erreur Comment s'y rendre de sigabart sur iPhone avec la déclaration compilé

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 bien sur simulateur, mais casse sur l'iPhone.

Ma base de données db.sql était le dossier de ressources que j'ai déplacé vers le dossier d'autres ressources. Quelle est la raison pour laquelle je reçois une erreur SIGABRT? Comme je sais que c'est NSOssert1 que je mets là mais pourquoi ma demande ne parvient pas à préparer la déclaration.

Quand je vois dans le débogueur son dire non une telle table, Mais je suis confus depuis Ma base de données est là et a la table. Y a-t-il quelque chose que je fasse de mal? Comment résoudre ceci.

Je fais 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)); 
    } 

S'il vous plaît laissez-moi savoir si ce n'est pas la bonne façon de le faire.

+0

Vérifiez-vous que la copie du fichier a bien été effectuée à partir des ressources? Parce qu'il pourrait y avoir un problème et que vous vous retrouvez avec la même nouvelle base de données vide sur [openDatabase]. –

Répondre

0

J'ai rencontré un problème similaire, car l'ouverture par défaut d'une base de données sqlite3 en crée une si elle n'existe pas, ce qui pourrait être dû à une mauvaise détermination du chemin entre le simulateur et votre iPhone.

Comment déterminez-vous le chemin du fichier de base de données (db.sql)?

+0

Hey Nic j'ai mis à jour la question de la façon dont je le fais, je fais la même chose pour d'autres applications qui fonctionnent parfaitement bien. – rkb

Questions connexes