Pb d'insertion dans une base SQLite

Marroucha

Membre enregistré
30 Juin 2011
7
0
35
Bonjour tt le monde,
Voilà je suis arrivée à parser mon fichier xml et je veux enregistrer son contenu dans une base de donnée SQLite
Pour cela j'ai créé une nouvelle base dans SQLite Manager que j'ai appelé essai, ainsi qu'une classe SQLManager dont le code est le suivant:
Bloc de code:
@implementation SQLManager
@synthesize aliments;

-(id) initDatabase{
    
    if (self = [super init]) {
        //Nom de la base de données
        databaseName = @"Essai3.sqlite";
        
        // Obtenir le chemins complet de la base de donées
        NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDir = [documentPaths objectAtIndex:0];
        databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
    }
    
    return self;
}

-(void) checkAndCreateDatabase{
       // On vérifie si la BDD a déjà été sauvegardée dans l'iPhone de l'utilisateur
      BOOL success;
         
       // Crée un objet FileManagerCreate qui va servir à vérifer le status
        // de la base de données et de la copier si nécessaire
        NSFileManager *fileManager = [NSFileManager defaultManager];
       
       // Vérifie si la BDD a déjà été créée  dans les fichiers system de l'utilisateur
       success = [fileManager fileExistsAtPath:databasePath];
      
        // Si la BDD existe déjà "return" sans faire la suite
    if(success) {return;}
         
            // Si ce n'est pas le cas alors on copie la BDD de l'application vers les fichiers système de l'utilisateur
        
            // On récupère le chemin vers la BDD dans l'application
            NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
            
            // On copie la BDD de l'application vers le fichier systeme de l'application
            [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
            
            [fileManager release];
        }
- (void)insertIntoDatabase:(aliment*)newAliment {
         
         sqlite3_stmt *compiledStatement=nil;
        sqlite3 *database;
        
    
        // On ouvre la BDD à partir des fichiers système
        if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
               
            // Préparation de la requête SQL qui va permettre d'ajouter un score à la BDD       
            if(compiledStatement == nil) {
            const char *sqlStatement = "insert into aliment2 (name,quantity_unit,energy_unit) Values(?,?,?)";    
            //NSString *sqlStat = [[[NSString alloc] initWithFormat:@"INSERT INTO aliment2 (name,quantity_unit,energy_unit) VALUES ('%@','%@', '%@');" ,newAliment.name,newAliment.quantity_unit,newAliment.energy_unit ] autorelease];
               
             //const char *sqlStatement = [sqlStat cStringUsingEncoding : [NSString defaultCStringEncoding]];
            if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) != SQLITE_OK) {
                
                NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
                
            }
                sqlite3_bind_text(compiledStatement, 1, [@"Bonjour" UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(compiledStatement, 2, [@"gr" UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(compiledStatement, 3, [@"cal" UTF8String], -1, SQLITE_TRANSIENT);
                
                //Evaluation du succes de la requete
                if(SQLITE_DONE != sqlite3_step(compiledStatement)) {
                    //Envois une exception en cas de probleme de requete
                    NSAssert1(0, @"Erreur :. '%s'", sqlite3_errmsg(database));
                    NSLog(@"Erreur1:'%s'", sqlite3_errmsg(database));
                }
                
                
                // Finalisation de la requete pour liberer la memoire
            
            }
            else {
                //Envois une exception en cas de probleme de requete
                NSAssert1(0, @"Erreur :. '%s'", sqlite3_errmsg(database));
                NSLog(@"Erreur2:'%s'", sqlite3_errmsg(database));

            }
            
            
        }
        else {
            //Envois une exception en cas de probleme d'ouverture
            NSAssert(0, @"Erreur d'ouverture de la base de donnees");
            NSLog(@"Erreur d'ouverture de la base de donnees");

        }
    sqlite3_reset(compiledStatement);
    sqlite3_finalize(compiledStatement);
    
    //Fermer la base de donnees
    sqlite3_close(database);
    
}
            //Creation d'une liste des noms de colonnes pour obtenir son ID


@end
et dans RootViewController j'ai cette méthode
Bloc de code:
- (void)viewDidLoad {
    
    // initialisation de la BDD
    sqlManager = [[SQLManager alloc] initDatabase];
    //Vérification et création de la BDD
    [sqlManager checkAndCreateDatabase];
    tableau = [[NSMutableArray alloc] init];
    NSURL *url = [NSURL URLWithString: @"http://www.inov-tech.fr/YourFit/frenshFoodDB.xml"];
    XMLToObjectParser *myParser = [[XMLToObjectParser alloc] parseXMLAtURL:url toObject:@"aliment" parseError:nil];
    int arrayCount = [[myParser items] count]; 
    //NSLog(@"%d",arrayCount);
    for(int i = 0; i<=arrayCount-1 ; i++) {
        
        aliment *new = [[aliment alloc] init];
        new = (aliment *)[[myParser items] objectAtIndex:i];
        [tableau addObject:new];
        [sqlManager insertIntoDatabase:new];
        [new release];
    }
    
        
    [super viewDidLoad];
}
avec aliment l'instance représentant un élément du document xml et voici son header
Bloc de code:
#import <Foundation/Foundation.h>
#import <sqlite3.h>

@interface aliment : NSObject {
    
    NSString *name;
    int quantity;
    int energy;
    NSString *quantity_unit;
    NSString *energy_unit;
    NSString *type;

}

@property(nonatomic,retain) NSString *name;
@property(nonatomic,retain) NSString *quantity_unit;
@property(nonatomic,retain) NSString *energy_unit;
@property(nonatomic,retain) NSString *type;
@property(nonatomic,assign) int quantity;
@property(nonatomic,assign) int energy;




@end
En éxécutant l'application je n'ai aucune erreur les éléments du fichier apparissent dans le TableView mais elles ne sont pas stockés dans la base (En consultant SQLite Manager la base est vide)
Je suis complétement plantée depuis hier sans arrivée à trouver la solution :confused:
Prière aidez moi à résoudre ce problème
Merci

j'ai commi une erreur , ces lignes
Bloc de code:
sqlite3_bind_text(compiledStatement, 1, [@"Bonjour" UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(compiledStatement, 2, [@"gr" UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(compiledStatement, 3, [@"cal" UTF8String], -1, SQLITE_TRANSIENT);

sont remplacés par
Bloc de code:
sqlite3_bind_text(compiledStatement, 1, [newAliment.name UTF8String], -1, SQLITE_TRANSIENT);
				sqlite3_bind_text(compiledStatement, 2, [newAliment.quantity_unit UTF8String], -1, SQLITE_TRANSIENT);
				sqlite3_bind_text(compiledStatement, 3, [newAliment.energy_unit UTF8String], -1, SQLITE_TRANSIENT);

Bonjour tt le monde,
Voilà je suis arrivée à parser mon fichier xml et je veux enregistrer son contenu dans une base de donnée SQLite
Pour cela j'ai créé une nouvelle base dans SQLite Manager que j'ai appelé essai, ainsi qu'une classe SQLManager dont le code est le suivant:
Bloc de code:
@implementation SQLManager
@synthesize aliments;

-(id) initDatabase{
    
    if (self = [super init]) {
        //Nom de la base de données
        databaseName = @"Essai3.sqlite";
        
        // Obtenir le chemins complet de la base de donées
        NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDir = [documentPaths objectAtIndex:0];
        databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
    }
    
    return self;
}

-(void) checkAndCreateDatabase{
       // On vérifie si la BDD a déjà été sauvegardée dans l'iPhone de l'utilisateur
      BOOL success;
         
       // Crée un objet FileManagerCreate qui va servir à vérifer le status
        // de la base de données et de la copier si nécessaire
        NSFileManager *fileManager = [NSFileManager defaultManager];
       
       // Vérifie si la BDD a déjà été créée  dans les fichiers system de l'utilisateur
       success = [fileManager fileExistsAtPath:databasePath];
      
        // Si la BDD existe déjà "return" sans faire la suite
    if(success) {return;}
         
            // Si ce n'est pas le cas alors on copie la BDD de l'application vers les fichiers système de l'utilisateur
        
            // On récupère le chemin vers la BDD dans l'application
            NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
            
            // On copie la BDD de l'application vers le fichier systeme de l'application
            [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
            
            [fileManager release];
        }
- (void)insertIntoDatabase:(aliment*)newAliment {
         
         sqlite3_stmt *compiledStatement=nil;
        sqlite3 *database;
        
    
        // On ouvre la BDD à partir des fichiers système
        if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
               
            // Préparation de la requête SQL qui va permettre d'ajouter un score à la BDD       
            if(compiledStatement == nil) {
            const char *sqlStatement = "insert into aliment2 (name,quantity_unit,energy_unit) Values(?,?,?)";    
            //NSString *sqlStat = [[[NSString alloc] initWithFormat:@"INSERT INTO aliment2 (name,quantity_unit,energy_unit) VALUES ('%@','%@', '%@');" ,newAliment.name,newAliment.quantity_unit,newAliment.energy_unit ] autorelease];
               
             //const char *sqlStatement = [sqlStat cStringUsingEncoding : [NSString defaultCStringEncoding]];
            if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) != SQLITE_OK) {
                
                NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
                
            }
             sqlite3_bind_text(compiledStatement, 1, [newAliment.name UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(compiledStatement, 2, [newAliment.quantity_unit UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(compiledStatement, 3, [newAliment.energy_unit UTF8String], -1, SQLITE_TRANSIENT);

                
                //Evaluation du succes de la requete
                if(SQLITE_DONE != sqlite3_step(compiledStatement)) {
                    //Envois une exception en cas de probleme de requete
                    NSAssert1(0, @"Erreur :. '%s'", sqlite3_errmsg(database));
                    NSLog(@"Erreur1:'%s'", sqlite3_errmsg(database));
                }
                
                
                // Finalisation de la requete pour liberer la memoire
            
            }
            else {
                //Envois une exception en cas de probleme de requete
                NSAssert1(0, @"Erreur :. '%s'", sqlite3_errmsg(database));
                NSLog(@"Erreur2:'%s'", sqlite3_errmsg(database));

            }
            
            
        }
        else {
            //Envois une exception en cas de probleme d'ouverture
            NSAssert(0, @"Erreur d'ouverture de la base de donnees");
            NSLog(@"Erreur d'ouverture de la base de donnees");

        }
    sqlite3_reset(compiledStatement);
    sqlite3_finalize(compiledStatement);
    
    //Fermer la base de donnees
    sqlite3_close(database);
    
}
            //Creation d'une liste des noms de colonnes pour obtenir son ID


@end
et dans RootViewController j'ai cette méthode
Bloc de code:
- (void)viewDidLoad {
    
    // initialisation de la BDD
    sqlManager = [[SQLManager alloc] initDatabase];
    //Vérification et création de la BDD
    [sqlManager checkAndCreateDatabase];
    tableau = [[NSMutableArray alloc] init];
    NSURL *url = [NSURL URLWithString: @"http://www.inov-tech.fr/YourFit/frenshFoodDB.xml"];
    XMLToObjectParser *myParser = [[XMLToObjectParser alloc] parseXMLAtURL:url toObject:@"aliment" parseError:nil];
    int arrayCount = [[myParser items] count]; 
    //NSLog(@"%d",arrayCount);
    for(int i = 0; i<=arrayCount-1 ; i++) {
        
        aliment *new = [[aliment alloc] init];
        new = (aliment *)[[myParser items] objectAtIndex:i];
        [tableau addObject:new];
        [sqlManager insertIntoDatabase:new];
        [new release];
    }
    
        
    [super viewDidLoad];
}
avec aliment l'instance représentant un élément du document xml et voici son header
Bloc de code:
#import <Foundation/Foundation.h>
#import <sqlite3.h>

@interface aliment : NSObject {
    
    NSString *name;
    int quantity;
    int energy;
    NSString *quantity_unit;
    NSString *energy_unit;
    NSString *type;

}

@property(nonatomic,retain) NSString *name;
@property(nonatomic,retain) NSString *quantity_unit;
@property(nonatomic,retain) NSString *energy_unit;
@property(nonatomic,retain) NSString *type;
@property(nonatomic,assign) int quantity;
@property(nonatomic,assign) int energy;




@end
En éxécutant l'application je n'ai aucune erreur les éléments du fichier apparissent dans le TableView mais elles ne sont pas stockés dans la base (En consultant SQLite Manager la base est vide)
Je suis complétement plantée depuis hier sans arrivée à trouver la solution:confused:
Prière aidez moi à résoudre ce problème
Merci
 
Dernière édition par un modérateur: