Compléter une BDD

HorusHorus Membre

Bonjour, 


 


J'aimerais savoir s'il est possible de remplir une table de ma base de données avec un NSDictionary.


 


Car je souhaite pouvoir modifier les données des personnages de mon application directement en ligne (grâce à  la BDD), mais pour ne pas devoir remplir la BDD à  la main ( copier coller ...) j'aimerais savoir si je peux envoyer mon NSDictionnary contenant toutes les informations des personnages directement dans la base. 


 


Merci,


Horus.


«1

Réponses

  • AliGatorAliGator Membre, Modérateur
    Hello

    Ca manque de données ta question : quand tu parles de BDD, tu parles d'une Base de Données CoreData ? Ou d'une base en ligne sur un serveur (genre MySQL) ? Si oui comment communiques-tu avec ? Un WebService de ton cru ?

    Dans tous les cas "envoyer ton NSDictionary directement dans la base" ça n'a pas trop de sens... j'ai du mal à  voir ce que tu imagines par cette phrase. Et d'ailleurs j'ai du mal à  comprendre pourquoi tu utilises des NSDictionary pour manipuler les données detes personnages, plutôt que des objets (voire même mieux, si tu utilises CoreData tu as directement les NSManagedObject correspondant, donc y'a rien à  faire)
  • HorusHorus Membre

    Salut Ali, 


     


    Alors j'ai une BDD MySQL hébergé chez OVH (donc oui distant).


     


    Je sais que j'aurais du utiliser des objets plutôt que des NSDictionary mais pour le moment j'ai des NSDictionnary composé des informations de chaque champion (Nom, fort contre ... faible contre .... etc) et je souhaite donc remplir ma base de données MySQL avec toutes ces informations, car je souhaite améliorer l'application pour que celle-ci récupérer les données de chaque champion  sans pour autant devoir effectuer une MaJ de l'application.


     


    Mais pour ne pas devoir remplir la BDD à  la main depuis PhpMyAdmin je souhaite envoyer toute les informations qui compose l'application actuellement sur la BDD. 


     


    J'aimerais donc savoir comment faire ? je sais comment faire en lecture avec une page php renvoyant un fichier JSON, mais pas en écriture.


  • AliGatorAliGator Membre, Modérateur
    Faut que tu te codes un petit WebService en PHP. Sujet déjà  abordé maintes fois sur le forum.
  • HorusHorus Membre

    Ok je suis obligé ? il n'y a pas de FrameWork même non officiel c'est juste pour ne pas devoir tout recopier.


     


    Et l'envoi des données depuis l'iPhone vers le WebService se fait comment JSON ?


    Il faut convertir le NSDictionary ? 


     


    Merci de ton aide ali.


  • AliGatorAliGator Membre, Modérateur
    Je sais pas je connais pas trop les fmk PHP. Mais bon c'est pas sorcier à  faire soi-même ce genre de truc. Vu que t'as déjà  le code pour le faire en lecture, y'a pas gd chose à  faire pour faire l'écriture aussi.

    Y'a d'autres membres du forum qui sauront mieux te répondre que moi de ce côté, et puis ça dépend de ton niveau en PHP, de l'architecture de ta BDD et de ton MDD, si tu auras besoin de plusieurs points d'entrée et donc de penser ton WS proprement avec une architecture type REST ou autre, ou si c'est un truc très simple à  un seul point d'entrée et un seul type de données à  modifier, avec juste finalement un ".php" qui fait le boulot.

    Bien sûr il y a à  prendre en compte les aspects sécurité d'accès (pour l'accès à  ton WS que n'importe qui ne puisse pas modifier ta BDD et foutre le boxon dedans), sécurité de code (pour éviter les failles SQL ou autre), les cas d'accès synchrones (2 clients iPhone qui modifient ta base en même temps)... mais bon, là  encore y'a plein de sujets sur les forums qui parlent de ça et pour lesquels on a déjà  expliqué ces sujets plusieurs fois.

    Et oui les échanges de données se font en JSON (enfin c'est pas obligé mais c'est le plus répandu et le plus adapté). Convertir un NSDict en JSON se fait en une LoC, de la même manière que la conversion inverse que tu fais déjà  pour la lecture.
  • HorusHorus Membre

    Niveau sécurité ce n'est pas le plus important le code va être utilisé une seule fois pour remplir la BDD après je supprime tout une fois celle-ci remplie.


     


    Je vais donc regarder comment faire pour le WebService merci ^^ et niveau php je débute tout juste le code de lecture je ne l'ai pas vraiment j'ai juste déjà  travaillé dessus donc j'ai déjà  fait quelque recherche à  ce sujet.


  • Pour le remplissage initial de ta base, ce n'est pas la peine de t'embeter à  coder un web service, tu peux charger un fichier texte contenant les requetes de creation de personnage. Une requete INSERT par ligne.

    Tu peux creer ce fichier .sql à  partir de tes NSDictinary en faisant un petit bout de code dans un coin à  base de NString stringWithFormat:.
  • Ah merci beaucoup FKDEV ! je vais regarder comment ça fonctionne si tu as un exemple de fonctionnement je veux bien, car je ne connais pas vraiment à  quoi ressemble le format des .sql


     


    Je pense :


     


    -> Enregistrer toutes les lignes dans un tableau puis afficher le tableau pour faire un copier de la console et coller dans un fichier texte ? 


    -> Les ligne vont ressembler à  ça que je génére avec le stringWithFormat et une boucle for : 


     


    mysql_query ("INSERT INTO Champion (nom, image) VALUES ('Ahri', 'Ahri.png')");


    mysql_query ("INSERT INTO Champion (nom, image) VALUES ('Akali', 'Akali.png')");


     


    etc etc.


     


    C'est bien ça ?



  • -> Enregistrer toutes les lignes dans un tableau puis afficher le tableau pour faire un copier de la console et coller dans un fichier texte ? 

    -> Les ligne vont ressembler à  ça que je génére avec le stringWithFormat et une boucle for : 

     
    mysql_query ("INSERT INTO Champion (nom, image) VALUES ('Ahri', 'Ahri.png')");
    mysql_query ("INSERT INTO Champion (nom, image) VALUES ('Akali', 'Akali.png')");




    Oui c'est bien ça, dans la console ou dans un fichier texte via le message writeToFile: de NSString.

    Avec la console, il faut faire attention aux caractères spéciaux.


    Tu n'as pas besoin de mettre les "mysql_query".Juste tes requêtes SQL, sans guillemets, terminées par un point-virgule.


    Si tu utilises phpMyAdmin, il y a un bouton SQL à  gauche qui ouvre une fenêtre contenant un onglet pour l'import des fichiers.




  • Tu n'as pas besoin de mettre les "mysql_query".Juste tes requêtes SQL, sans guillemets, terminées par un point-virgule.




     


    D'accord comme ceci alors: INSERT INTO Champion (nom, image) VALUES ('Ahri', 'Ahri.png');


     


    Et Champion correspond à  la table c'est bien ça ? 


     


     


     




    Si tu utilises phpMyAdmin, il y a un bouton SQL à  gauche qui ouvre une fenêtre contenant un onglet pour l'import des fichiers.




     


    Oui j'ai trouvé merci beaucoup de ton aide !

  • D'accord comme ceci alors: INSERT INTO Champion (nom, image) VALUES ('Ahri', 'Ahri.png');


    Yep.

     


    Et Champion correspond à  la table c'est bien ça ? 




    Je te laisse chercher sur google : mysql +"INSERT INTO"


  • Je te laisse chercher sur google : mysql +"INSERT INTO"




     


    Merci beaucoup de ton aide :) je bosse dessus de suite ^^



  • Ah merci beaucoup FKDEV ! je vais regarder comment ça fonctionne si tu as un exemple de fonctionnement je veux bien, car je ne connais pas vraiment à  quoi ressemble le format des .sql


     


    Je pense :


     


    -> Enregistrer toutes les lignes dans un tableau puis afficher le tableau pour faire un copier de la console et coller dans un fichier texte ? 


    -> Les ligne vont ressembler à  ça que je génére avec le stringWithFormat et une boucle for : 


     


    mysql_query ("INSERT INTO Champion (nom, image) VALUES ('Ahri', 'Ahri.png')");


    mysql_query ("INSERT INTO Champion (nom, image) VALUES ('Akali', 'Akali.png')");


     


    etc etc.


     


    C'est bien ça ?




     


    Je suis la pour donner un avis niveau SQL mon prof  m'a fait hair une chose : Les nom des tables c'est en majuscules CHAMPION


    Apres je sais pas pour vous ...



  • Je suis la pour donner un avis niveau SQL mon prof  m'a fait hair une chose : Les nom des tables c'est en majuscules CHAMPION


    Apres je sais pas pour vous ...




     


    Ok ok je n'ai pas les réflexes de SQL je m'en sert très peux et j'apprend au soir par loisir ^^.

  • Apres la c'est pas grave tu as une lettre en maj et puis tu vas pas t'amuser à  renommer toutes les tables


  • Je ne suis pas un spécialiste de la base de donnée mais, à  priori, je n'aime pas l'idée de mettre les noms de table en majuscules.

    Les majuscules sont plutôt réservées aux mots clés en SQL, non ?


    Mes conventions de nommages perso sont :

    table : tblChampion

    clé primaire : id

    clé étrangère : champion_id

    champ : nom


    Les pros de la BDD ont des règles plus strictes. Un fil intéressant.


  • Am_MeAm_Me Membre
    juillet 2013 modifié #18

    Ah bon bah je fait fausse route je suis d'accord avec tout sauf pour le nom des tables.


    Mais c'est un très bon lien


  • Par contre je galère bien sur l'écriture ... 


     


    J'utilise : 



    [ligneSQL writeToFile:@codeSQL.txt atomically:NO encoding:NSUTF8StringEncoding error:nil];

    et ça ne fonctionne pas :/ quelqu'un à  déjà  utiliser writeToFile svp ? 


  • Am_MeAm_Me Membre
    juillet 2013 modifié #20


    Par contre je galère bien sur l'écriture ... 


     


    J'utilise : 



    [ligneSQL writeToFile:@codeSQL.txt atomically:NO encoding:NSUTF8StringEncoding error:nil];

    et ça ne fonctionne pas :/ quelqu'un à  déjà  utiliser writeToFile svp ? 




     


    Oui : 


     


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *directory = [paths objectAtIndex:0];


    NSString *path = [[NSString alloc] initWithFormat:@%@/%@", directory, @codeSQL.txt];
    [ligne writeToFile:path atomically:YES]; //tu peux laisser encoding et error


     


    Si c'est un fichier temporaire pas besoins de paths tu met directory = NSTemporaryDirectory();


     


    Cf http://forum.cocoacafe.fr/topic/11226-résolu-envoyer-un-fichier-txt-au-serveur/


  • AliGatorAliGator Membre, Modérateur
    +1 j'ai fait pas mal de SQL et on réservé les majuscules pour les mots clés, les tables c'est plutôt tblXXX ou tXXX ou même directement le nom de l'entité.

    Quand on fait un MDD on utilise en général directement le nom de l'entité sans préfixe, encore + quand on fait du ActiveRecord derrière (comme en Ruby avec Rails... ou même en ObjC avec MagicalRecord et CoreData) pour pouvoir écrire NSArray* liste = [Champion findAll] si on a bien nommé notre entité Champion et pas tblChampion. Du coup en général avec une BDD (qui bien souvent est liée à  un MDD similaite dans 95% des cas) on a les mêmes conventions.


  • +1 j'ai fait pas mal de SQL et on réservé les majuscules pour les mots clés, les tables c'est plutôt tblXXX ou tXXX 




     


    Ce que j'avais en tete c'est que les XXX était en maj, j'avais oublier qu'il fallait mettre tbl ou t devant mais ca reste en maj le nom de la table : tCUISINE

  • AliGatorAliGator Membre, Modérateur
    juillet 2013 modifié #23
    Nope, une entité d'un MDD ou une table d'une BDD s'apparente à  une classe d'un modèle. Donc mêmes règles de nommage pour moi pour ces 3 trucs : du CamelCase. Jamais vu de tables MySQL en majuscule (et ça m'aurait choqué)
  • Ah bon ok bah si tu le dis :D mois je suis plutot SQL Developer apres bon peut etre que je me trompe 


  • HorusHorus Membre
    juillet 2013 modifié #25

    J'ai sortie le texte par copier coller de la console car l'enregistrement dans un fichier texte ne fonctionne pas ... j'ai essayé de mettre un booléen pour vérifier et il fonctionne sauf que je n'est aucun fichier ... j'ai fait sa pour gagner du temps mais c'est encore plus long que prévue xd quelqu'un sait pourquoi le fichier texte n'existe pas ? je l'ai créé et ajouté à  xCode.


    et SQL me constate une erreur de syntaxe ?



    INSERT INTO Champion(idChampion,nom,image,titleView,runeRtext,runeBtext,runeJtext,runeQtext,zone,sort1,sort2,fort1,fort2,fort3,faible1,faible2,faible3) VALUES (, 'Aatrox', 'Aatrox.png', 'Aatrox, Solo Top', 'Grande Marque de Dégâts d'Attaque x9
    +0,95 dégâts d'attaque', 'Grand Glyphe de Résistance Magique x9
    +1,34 résistance à  la magie', 'Grand Sceau d'Armure x9
    +1,41 armure', 'Grande Quintessence de Vol de Vie x3
    +2% vol de vie', 'top.png', 'flash.png', 'ignite.png', 'Darius.png', 'Khazix.png', 'Garen.png', 'Jax.png', 'Teemo.png', 'Riven.png');

    Message d'erreur : 


     


    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Attaque x9 +0,95 dàƒÂ©gàƒÂ¢ts d'attaque', 'Grand Glyphe de RàƒÂ©sistance Magique x9 ' at line 1


     


    J'ai testé en UTF 8 et 16 même problème 


  • FKDEVFKDEV Membre
    juillet 2013 modifié #26
    Allez un petit effort, tu as tout ce qu'il faut devant les yeux (dans ton post) pour trouver ce qui ne va pas.

    Je ne suis pas sadique mais c'est un problème classique dans tous les langages donc c'est mieux si tu le trouves tout seul, ça va te faire gagner des points d'experience, voir un niveau supplementaire, si tu le trouves.
  • Am_MeAm_Me Membre
    juillet 2013 modifié #27

    Allez je t'aide aussi ca saute aux yeux surtout les couleurs vertes :P


     


    +0,95 dégâts d'attaque', 'Grand Glyphe de Résistance Magique x9

    +1,34 résistance à  la magie', 'Grand Sceau d'Armure x9 


     


    MAJ : EN plus gros c'est mieux :D


  • Oui j'ai bien compris que c'était à  cause des caractères spéciaux (à ,é,è ...) donc je me suis dit si j'arrive à  enregistrer le .txt avec l'encodage UTF8 peut être que le problème disparaà®trait mais je n'arrive pas à  utiliser le writeToFile pourtant il ne me retourne aucune erreur (utilisation d'une variable bool pour vérifier).


  • AliGatorAliGator Membre, Modérateur
    juillet 2013 modifié #29
    'degats d'attaque'...
  • HorusHorus Membre
    juillet 2013 modifié #30


    'degats d'attaque'...




     


    Oui je me doute bien... mais à  l'affichage il n'y aura plus les accents, je cherche je vous tien au courant dés que j'ai trouvé mais je ne comprend vraiment pas pourquoi je n'arrive pas à  utiliser le writeToFile ...


     


     


    Edit: le bug ne viens pas des é,à  etc le problème viens de : d'attaque etc c'est l'apostrophe qui pose problème.


     


    Edit 2: Résolu :



    INSERT INTO Champion VALUES ('6' ,'Aatrox','Aatrox.png','Aatrox Solo Top','Grande Marque de Dégâts d\'Attaque x9 +0,95 degats d\'attaque','Grand Glyphe de Resistance Magique x9 +1.34 resistance a la magie','Grand Sceau d\'Armure x9 +1.41 armure','Grande Quintessence de Vol de Vie x3 +2% vol de vie','top.png','flash.png','ignite.png','Darius.png','Khazix.png','Garen.png','Jax.png','Teemo.png','Riven.png')

    si ça peux aider. ^^


  • Super ! Tu as trouvé 'tout seul' !


Connectez-vous ou Inscrivez-vous pour répondre.