Accès de base de données distantes depuis l'iPhone

Bonjour,

Je suis entrain de développer une application sur iPhone qui permettra de récupérer des données (texte et images) depuis une base de données distantes, je crois que j'utiliserais SQLite 3.

Le problème c'est que c'est la première fois ou je touche à  ces outils.

est ce que quelqu'un peut me donner des conseils à  ce sujet, je serais très reconnaissant



merci d'avance

Réponses

  • Je n'ai jamais utiliser ce genre d'outil avec Objective-C, mais il doit y avoir des outils : il me semble que la base de donnée de l'application message soit en SQLite3.

    Concernant SQLite3, fait attention aux types, ils sont plus génériques que ceux de MySQL par exemple.
  • SQLite est une bibliothèque qui permet à  une application de gérer un fichier de données comme une base de données. En d'autres termes, SQLite permet de structurer un fichier de données.

    Tu veux "récupérer des données depuis une base de données distante". SQLite dans ton application iPhone ne te permettra pas d'accéder à  une base de données distante. Elle pourrait permettre à  la rigueur d'accéder à  un fichier distant mais je pense que ça poserait des problèmes de performance (je n'ai jamais essayé en fait).

    Mais peut-être veux tu dire que tu veux créer un serveur de base de données à  partir de SQLite ; ça peut marcher bien que ça s'apparente à  la réinvention de l'eau chaude.



    Sinon, lorsque je dois gérer des données structurées dans une application iOS, je préfère utiliser Core Data (qui s'appuie sur SQLite) que je trouve plus facile à  utiliser conjointement aux TableView par exemple, que SQLite tout seul. Mais je n'ai jamais essayé avec un fichier distant.
  • merci pour vos réponse,

    d'après ce que j'ai lu sur la toile, il faut exporter le contenu de la bd en fichier xml, puis la parser de l'iphone directement, apparemment c'est la meilleur solution
  • AliGatorAliGator Membre, Modérateur
    Alors :
    • SQLite3 est un système de base de données basé sur des fichiers, et surtout, surtout, pensé pour être mono-utilisateur. L'usage type est pour embarquer une base de donnée locale dans ton application. Pour un accès multi-utilisateur, comme ça sera le cas typiquement pour une base de données distance, à  laquelle plusieurs iPhones vont pouvoir demander ou modifier des données en même temps, ce n'est pas adapté, il faut plutôt se tourner vers des SGDB comme MySQL.
    • Du coup, pour communiquer entre ton serveur qui héberge la base de données MySQL et chacun de tes clients, les clients ne vont pas directement faire des requêtes SQL sur ta base distante, pour plusieurs raisons (l'une d'entre elle étant la sécurité, l'autre étant le principe d'abstraction, mais pas que). Tu vas plutôt te prévoir une API qui va te permettre d'interroger ta base à  distance.


    Cette API en question peut être de la forme que tu veux : tu peux pour requêter ton appli choisir de communiquer en REST, en JSON, en XML... et choisir que ton appli te réponde en XML, en JSON (plus simple et adapté à  l'univers mobile, pour la facilité de parsing et pour l'aspect léger, important dans le cadre d'un environnement mobile où le réseau n'est pas forcément au top)... ça dépend un peu de tes besoins.

    Mais l'important est que ton client iPhone va envoyer une requête HTTP à  ton serveur, qui va lui répondre avec des données formattées (en XML, ou en JSON, ou autre), et le client ne va pas directement communiquer avec la base. C'est le serveur qui, sur la réception de la requête, va faire la requête SQL correspondante à  ta base MySQL, récupérer les résultats, les formatter en XML ou JSON ou autre, et les renvoyer à  ton client.



    Il y a déjà  eu plusieurs questions sur le sujet dans ces forums comme sur le net donc tu ne devrais pas avoir de mal à  trouver plus d'informations sur ce sujet très commun.
  • Merci Ali pour la clarté de votre réponse, maintenant, au moins, je sais de quels points je pars.

    Merci encore
  • Salut encore,

    Connaissez vous un sample code montrant comment parser un fichier JSON qui se trouve sur mon serveur distant.

    J'ai réussi de creer un web service qui permet d'extraire le contenu de ma BD dans un fichier JSON.
  • AliGatorAliGator Membre, Modérateur
    Si tu cibles iOS5 minimum, tu peux utiliser NSJSONSerializer fourni par Apple.

    Si tu cibles à  partir de iOS4 où NSJSONSerializer n'était pas encore dispo, je te conseille JSONKit. Une petite recherche google te montrera plein d'exemples et comment intégrer les fichiers JSONKit dans ton projet.
  • OK, je vais récupérer les données à  l'aide de NSJSONSerialization.

    En fait je suis bloqué pour le moment, en fait ce que j'ai fait pour l'instant c'est d'extraire les données de ma base dans un fichier .json (sous la bonne format) qui se trouve dans mon serveur (utilisateur@serveur.com) à  l'emplacement /home/utilisateur.

    J'ai trouvé plusieurs exemples, mais comme je débute, je n'est pas su comment m'en sortir image/crybaby.gif' class='bbc_emoticon' alt=' :'( ' />



    Vos idées, suggestions, solutions sont les bienvenues.

    Merci d'avance
  • MistifiouMistifiou Membre
    septembre 2012 modifié #10
    'cheriaa' a écrit:


    Vos idées, suggestions, solutions sont les bienvenues.

    Merci d'avance




    Salut ! Je vais t'expliquer comment j'ai fait de mon côté sa pourra ptet t'aider.



    Bon pour pouvoir communiquer avec un serveur t'a pas besoin de grand chose en sois. Personnellement j'utilise http://stig.github.com/json-framework/.



    Après il faut savoir que si tu veux faire de l'asynchrone il te faut un NSUrlConnectionDelegate.



    Dans ton delegate, ou depuis un autre endroit (comme tu préfère), tu dois initialiser un NSUrlConnection. Pour ça, tu peu te baser sur ce bout de code.



    requête synchrone :
    <br />
    // tu créé une url et une requête<br />
    	NSURL *url = [NSURL URLWithString:@&quot;http://www.monsitedistant/monfichier.xx&quot;];<br />
    <br />
    	NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];<br />
    	[request setHTTPMethod:@&quot;POST&quot;];<br />
    <br />
    //le dictionnary sert à  créer le JSON<br />
    	NSMutableDictionary* datas = [[NSMutableDictionary alloc]init];<br />
    	[datas setValue:[Config sharedConfig].deviceToken forKey:@&quot;deviceToken&quot;];<br />
    	[datas setValue:args forKey:@&quot;ARGS&quot;];<br />
    <br />
    	//transformation du dictionnary en JSON<br />
    	NSString *jsonPost =  [NSString stringWithFormat:@&quot;params=%@&quot;,[datas JSONRepresentation]];<br />
      <br />
    //insertion du json comme élément de la requête<br />
    	[request setHTTPBody:[jsonPost dataUsingEncoding: NSUTF8StringEncoding]];<br />
      <br />
    //envois de la requête en synchrone<br />
    NSData* reponse = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];<br />
    <br />
    return reponse;<br />
    




    Asynchrone :

    <br />
    //cf code plus haut, on récupère la requête<br />
    	NSURLRequest* request = [self getRequestWithDatas:datas];<br />
    <br />
    	//initialisation de ton NSUrlConnectionDelegate<br />
    	RequeteAsynchroneDelegate *asynchronousRequestDelegate = [[RequeteAsynchroneDelegate alloc]init];<br />
    	asynchronousRequestDelegate.parent = self;<br />
      <br />
    //création de la connexion<br />
    	NSUrlConnexion *connexion = [[NSUrlConnexion alloc]initWithRequest:request delegate:asynchronousRequestDelegate];<br />
    <br />
    //et lancement<br />
    	[connexion start];<br />
    




    De manière générale, il te retourne un NSDictionnary ou un NSArray (une fois que tu a utilisé la fonction decode de SBJson), que tu peu donc utiliser facilement.



    Ce petit site peu t'aider à  valider ton json, ou a le lire plus facilement aussi http://jsonlint.com/



    Si tu a des questions, n'hésite pas.
  • <br />
    en fait ce que j&#39;ai fait pour l&#39;instant c&#39;est d&#39;extraire les données de ma base dans un fichier .json (sous la bonne format) qui se trouve dans mon serveur (utilisateur@serveur.com) à  l&#39;emplacement /home/utilisateur.<br />
    




    J'ai l'impression que tu n'as pas fait un webservice, mais juste un export de ta base en json. Du coup si il y des modifications dans ta bases de données tu devras toi même regénérer le fichier...



    Le but c'est que tu génères automatiquement le json lorsque l'utilisateur le demande, de manière à  ce que l'utilisateur récupère les dernières données en date.



    Après j'ai peut être mal saisie ce que tu as expliqué...
  • [font=helvetica, arial, sans-serif]Le but c'est que tu génères automatiquement le json lorsque l'utilisateur le demande, de manière à  ce que l'utilisateur récupère les dernières données en date.[/font]




    Peut-être qu'il fait cela juste pour tester la récupération.

    Après, effectivement un petit serveur LAMP est plus que nécessaire pour faire une application de ce type côté serveur.
  • AliAli Membre
    septembre 2012 modifié #13
    J'ai l'impression que tu n'as pas fait un webservice, mais juste un export de ta base en json. Du coup si il y des modifications dans ta bases de données tu devras toi même regénérer le fichier...



    Oui, exacte, pour le moment ça ce que j'ai fait
  • 'Mistifiou' a écrit:


    Salut ! Je vais t'expliquer comment j'ai fait de mon côté sa pourra ptet t'aider.



    Bon pour pouvoir communiquer avec un serveur t'a pas besoin de grand chose en sois. Personnellement j'utilise http://stig.github.com/json-framework/.



    Après il faut savoir que si tu veux faire de l'asynchrone il te faut un NSUrlConnectionDelegate.



    Dans ton delegate, ou depuis un autre endroit (comme tu préfère), tu dois initialiser un NSUrlConnection. Pour ça, tu peu te baser sur ce bout de code.



    requête synchrone :
    <br />
    // tu créé une url et une requête<br />
    	NSURL *url = [NSURL URLWithString:@&quot;http://www.monsitedistant/monfichier.xx&quot;];<br />
    <br />
    	NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];<br />
    	[request setHTTPMethod:@&quot;POST&quot;];<br />
    <br />
    //le dictionnary sert à  créer le JSON<br />
    	NSMutableDictionary* datas = [[NSMutableDictionary alloc]init];<br />
    	[datas setValue:[Config sharedConfig].deviceToken forKey:@&quot;deviceToken&quot;];<br />
    	[datas setValue:args forKey:@&quot;ARGS&quot;];<br />
    <br />
    	//transformation du dictionnary en JSON<br />
    	NSString *jsonPost =  [NSString stringWithFormat:@&quot;params=%@&quot;,[datas JSONRepresentation]];<br />
      <br />
    //insertion du json comme élément de la requête<br />
    	[request setHTTPBody:[jsonPost dataUsingEncoding: NSUTF8StringEncoding]];<br />
      <br />
    //envois de la requête en synchrone<br />
    NSData* reponse = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];<br />
    <br />
    return reponse;<br />
    




    Asynchrone :

    <br />
    //cf code plus haut, on récupère la requête<br />
    	NSURLRequest* request = [self getRequestWithDatas:datas];<br />
    <br />
    	//initialisation de ton NSUrlConnectionDelegate<br />
    	RequeteAsynchroneDelegate *asynchronousRequestDelegate = [[RequeteAsynchroneDelegate alloc]init];<br />
    	asynchronousRequestDelegate.parent = self;<br />
      <br />
    //création de la connexion<br />
    	NSUrlConnexion *connexion = [[NSUrlConnexion alloc]initWithRequest:request delegate:asynchronousRequestDelegate];<br />
    <br />
    //et lancement<br />
    	[connexion start];<br />
    




    De manière générale, il te retourne un NSDictionnary ou un NSArray (une fois que tu a utilisé la fonction decode de SBJson), que tu peu donc utiliser facilement.



    Ce petit site peu t'aider à  valider ton json, ou a le lire plus facilement aussi http://jsonlint.com/



    Si tu a des questions, n'hésite pas.




    Ton code permet, si je me trompe pas, de créer un JSON depuis un fichier de données qui se trouve sur un serveur distant.

    Moi j'essaie de faire le contraire en fait. Récupérer les résultat depuis un fichier JSON qui se trouve sur le serveur.
Connectez-vous ou Inscrivez-vous pour répondre.