IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement iOS Discussion :

SQLite qui marche sur l’émulateur et non sur le device


Sujet :

Développement iOS

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 86
    Points : 67
    Points
    67
    Par défaut SQLite qui marche sur l’émulateur et non sur le device
    Bonjour je fais un projet IOS qui utilise une base de données SQLite,

    quand j'utilise l’émulateur la base de données se crée bien et j'arrive à faire mes manipulation, cependant quand run mon appli sur un device la base la bdd n'arrive pas à ce créé.. y'aurait-il des permissions à ajouter ou d'autres configurations à faire pour résoudre ce problème?

    Merci par avance pour vos idées

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 674
    Points : 10 686
    Points
    10 686
    Par défaut
    Quelle est ta façon d'intégrer ta base de données?

    0) Il faut ajouter dans ton projet le framework SQLite.
    Doute: il y en a 2. Il faut regarder sur Internet.

    1) tu mets ton fichier .sqlite [ici database.sqlite] dans tes ressources. Évidement avec des tables remplies: SQLite Database Browser

    2) Tu appelles une méthode d'installation dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    - (BOOL) application:(UIApplication*) application didFinishLaunchingWithOptions:(NSDictionary*) launchOptions {
    	_window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
    	BOOL can_init  = [self install_database];
    
    // XXX TODO: manage can_init
    
    	controller = [[AppController alloc] init_controller];
    
    	_window.rootViewController = controller;
    	[_window makeKeyAndVisible];
    
    	return YES;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    - (BOOL) install_database {
    	NSFileManager* fileManager = [NSFileManager defaultManager];
    	NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    	NSString* documentDirectory = [paths objectAtIndex:0];
    	NSString* targetPath = [documentDirectory stringByAppendingPathComponent:@"database.sqlite"];
    
    	if ( [fileManager fileExistsAtPath:targetPath] ) {
    		return YES;
    	}
    
    	NSString* resourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database.sqlite"];
    	NSError* error = nil;
    
    	if (![fileManager copyItemAtPath:resourcePath toPath:targetPath error:&error]) {
    		return NO;
    	}
    
    	return YES;
    }
    3) Tu initialises, ouvres, utilises et fermes ta base comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    //
    //  Database.h
    
    #import <Foundation/Foundation.h>
    #import <sqlite3.h>
    
    
    
    @interface Database: NSObject
    {
    @private
    
    	// Database
    	sqlite3* database;
    
    	// Boolean
    	BOOL is_opened;
    }
    
    // Database Init
    - (id) init;
    
    // Close & Open Database
    - (void) close;
    
    - (void) open;
    
    // Example Request
    - (void) clean_user_datas;
    
    @end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    //
    //  Database.m
    
    #import "Database.h"
    
    
    //  Static Statement
    static sqlite3_stmt* statement = nil;
    
    
    @implementation Database
    
    - (id) init {
    	self = [super init];
    
    	if (self != nil) {
    		is_opened = NO;
    		[self open];
    	}
    
    	return self;
    }
    
    
    - (void) dealloc {
    	[self close];
    
    	[super dealloc];
    }
    
    
    #pragma mark - Close & Open Database
    
    - (void) close {
    	if (sqlite3_close(database) == SQLITE_OK) {
    		DLOG( (@"Database::close: No problem") );
    		database = nil;
    	} else {
    		DLOG( (@"Database::close: Error: %s", sqlite3_errmsg(database)) );
    
    		// Force
    		sqlite3_finalize(statement);
    		statement = nil;
    
    		if (sqlite3_close(database) == SQLITE_OK) {
    			DLOG( (@"Database::close (Second try): No problem") );
    			database = nil;
    		} else {
    			DLOG( (@"Database::close (Second try): Error: %s", sqlite3_errmsg(database)) );
    		}
    	}
    
    	is_opened = NO;
    }
    
    
    - (void) open {
    //	if (is_opened)
    //		return;
    
    	is_opened = YES;
    
    	NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    	NSString* documentDirectory = [paths objectAtIndex:0];
    	NSString* path = [documentDirectory stringByAppendingPathComponent:@"database.sqlite"];
    
    	if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
    		DLOG( (@"Database::open: No problem") );
    	} else {
    		DLOG( (@"Database::open: Error: %s", sqlite3_errmsg(database)) );
    	}
    }
    
    
    #pragma mark - Example Request
    
    - (void) clean_user_datas {
    	NSString* request = nil;
    	SET_STRING(request, @"UPDATE User_Informations SET screenshot=?, message_screenshot=?, message=?, url=?, latitude=?, longitude=?, heading=?, pitch=? WHERE id=1")
    
    	if (sqlite3_prepare_v2(database, [request UTF8String], -1, &statement, NULL) == SQLITE_OK) {
    		char c = '\0';
    
    		sqlite3_bind_blob(statement, 1, &c, 1, SQLITE_STATIC);
    		sqlite3_bind_blob(statement, 2, &c, 1, SQLITE_STATIC);
    		sqlite3_bind_text(statement, 3, &c, 1, SQLITE_STATIC);
    		sqlite3_bind_text(statement, 4, &c, 1, SQLITE_STATIC);
    		sqlite3_bind_double(statement, 5, 0.0f);
    		sqlite3_bind_double(statement, 6, 0.0f);
    		sqlite3_bind_double(statement, 7, 0.0f);
    		sqlite3_bind_double(statement, 8, 0.0f);
    
    		if (sqlite3_step(statement) != SQLITE_DONE) {
    			DLOG( (@"Database::clean_database - error %s", sqlite3_errmsg(database)) );
    		} else {
    			DLOG( (@"Database::clean_database - ok") );
    		}
    	} else {
    		DLOG( (@"Database::clean_database - error %s", sqlite3_errmsg(database)) );
    	}
    
    	sqlite3_finalize(statement);
    	statement = nil;
    }
    
    @end
    Évidemment c'est un cas d'utilisation et quelque part dans ton code il faut faire cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Database my_database = [[Database alloc] init];
    [my_database XXX];
    [my_database release];

    PS: Si tu te poses la question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifdef DEBUG
    #define DLOG( X ) NSLog X;
    #else
    #define DLOG( X )
    #endif
    
    
    #if __IPHONE_6_0
    	#define SET_STRING(to, new_string) to = new_string;
    #else
    	#define SET_STRING(to, new_string) to = [NSString stringWithString:new_string];
    #endif

Discussions similaires

  1. JavaScript qui marche sous IE6 et non sur FireFox
    Par ScReeeN dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 12/08/2010, 13h29
  2. Réponses: 4
    Dernier message: 22/02/2009, 16h24
  3. script qui marche en locale mais pas sur le web
    Par koKoTis dans le forum Langage
    Réponses: 7
    Dernier message: 08/09/2008, 16h07
  4. Flash uniquement sur IE et non sur Firefox
    Par m.k dans le forum Flash
    Réponses: 3
    Dernier message: 07/03/2007, 06h16
  5. control de formulaire qui marche avec IE et non mozilla
    Par epeichette dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/03/2005, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo