La boîte à Tutoriels de Christopher PECAUD

Top

Accéder aux données du carnet d'adresse de Mac OS X à partir de Real Studio

Laisser un commentaire

SOMMAIRE

I.Introduction
II Création du projet
III Création de la base de données Real SQL contacts
IV Création des différentes classes du projet
V Code de l'application
VI Conclusion

I Introduction

Dans ce tutoriel, je vais vous montrer comment accéder à votre carnet d'adresse Mac OS X, en utilisant les classes fournies avec RealBasic. En effet il n'est pas nécessaire d'installer de nouveaux plugins pour réaliser cette opération. Nous utiliserons les données reçues pour les stocker dans une base de données REAL Database SQL. Nous verrons donc comment créer une base simple de contacts dans RealStudio, et comment l'alimenter...

II Création du projet

Nous allons dans premier temps, créer un nouveau projet de type "Application graphique", que vous nommerez comme bon vous semble, pour quoi pas "Contacts_Manager.rbp". Une fois votre projet créer voici à quoi doit correspondre l'interface utilisateur de la fenêtre principale du projet
Stacks Image 23
Vous aurez donc besoin des éléments graphiques suivants :

  • un composant de type textArea qui va nous servir de fenêtre d'extraction des données issues du carnet d'adresses de Mac OS X.

  • un PushButton qui nous servira à récupérer les données issues du carnet.

  • un autre PushButton qui nous servira à stocker les données reçues dans la base de données.

III Création de la base de données Real SQL contacts

Nous allons maintenant créer une nouvelle base de données Real DataBase SQL (de type SQLite) dans l'environnement intégré de Real Studio. Pour ce faire il suffit de créer, suivez la commande de menu Projet > Ajouter > Base de données > Nouvelle base de données Real SQL. Une boîte de dialogue vous demande de nommer la nouvelle base, vous pouvez lui donner comme nom "contacts" par exemple…
L'étape suivante va nous permettre de créer deux tables : contacts et adresse_contacts. ceci se fait le plus simplement possible grâce à l'interface utilisateur de Real Studio en cliquant sur le bouton "Ajouter Table dans la barre d'outils de la fenêtre d'édition de la base de données. Intéressons nous dans un premier temps à la table contacts. Voici les champs dont nous aurons besoin pour ce tutoriel. N'oubliez pas de mettre une clé primaire sur la colonne id.
Stacks Image 21
Comme le montre cet aperçu nous avons besoin de quatres champs
  • Le champ nom pour récupérer le nom du contact de type varchar(50);
  • Le champ id qui permettra de garantir lunicité du contact. Cet id sera incrémenté lors de l'ajout des données ;
  • Le champ prénom et le champ email qui permettent de stocker le prénom et l'email du contact.

Venons en maintenant à la table adresse_contacts. Voici un aperçu de sa structure :

Stacks Image 35

Ctte table comporte 4 champs qui vont nous permettre de stocker les données concernant l'adresse du contact :

  • Nous avons un champ contactid qui sert de clé étrangère vers la première table. Nous devons mettre un index sur celui-ci ;
  • Nous avons besoin ensuite d'un champ "rue" pour stocker cette information en base ;
  • Nous avons besoin ensuite d'un champ "code_postal" ;
  • Nous avons besoin pour finir d'un champ "ville".

Nos deux tables sont à présents créer mais sont vides, elles seront remplies lors de l'extraction des données. Nous allons maintenant créer deux classes nous permmettant de créer des objets d'xtraction des données des contacts et des adresses associées.

IV Création des différentes classes du projet

Nous allons maintenant créer les deux classes qui vont nous permettre de stocker les données extraites du carnet d'adresse, c'est à dire DBContact et DBContact_address. Pour cela rien de plus simple il suffit de cliquer sur le bouton "Ajouter une classe" dans l'onglet "Projet". Faites le deux fois pour créer les deux classes. Nommez les comme vu précédemment.

Nous allons maintenant créer les propriétés qui vont nous permettre de stocker les informations utiles comme le nom, le prénom et l'adresse email concernant la classe DBContact. Pour ce faire éditer la classe DBContact et cliquer sur le bouton "Ajouter une Propriété". Faites le quatre fois et rentrer pour chacune d'elle les noms de propriété suivante :

Stacks Image 47

Nous allons maintenant créer les propriétés liées à la classe DBContact_address

Il suffit de rééditer les mêmes actions que pour les créations de propriétés que nous avons effectué pour la classe DBContact.

Stacks Image 9

Pour ce qui concerne la classe rattachée à la fenêtre principale Window1 rajoutez les propriétés suivantes :

Stacks Image 13
  • Il nous faut créer un tableau d'objet DBContact qui nous permettra de staocker en mémoire les différents contacts extraits de notre canet d'adresse
  • Il nous faut ensuite un deuximème tableau d'objet nous permettant de stocker les différentes adresses liées au contacts.
  • une variable de type integer stockant le nombre de contacts extraits.

Mainteannt que toutes les étapes préliminaires sont mises en place, il nous reste plus qu'à voir le code de l'application.

V Code de l'application

Dans cette partie nous allons voir plus en détails, les deux foctions qui vont nous permettre d'extraire les données issues du carnet d'adresse, et ensuite de les stocker dans la base de données REAL SQL

Dans un premier temps éditons le code de la fonction permettant de réagir au click de la souris sur le bouton d'extraction des données. Il suffit de double-cliquer sur le bouton dans l'interface de conception de notre fenêtre pour faire apparaître cette fonction dans l'éditeur de texte. Alors maintenant il va nous falloir interagir avec le carnet d'adresse, pour ce faire nous devons déclarer quelques variables comme ceci :

  Dim book As New System.AddressBook
  
  Dim contacts() As AddressBookContact
  contacts = book.Contacts
  Dim data As AddressBookData
  Dim Address As AddressBookAddress

Comme on peut le constater on crée d'abord un objet AddressBook qui va nous permettre de pointer sur l'intégralité des données du carnet d'adresse. Après on fait appel aux sous classes AddressBookContact, AddressBookData, et AddressBookAddress pour récupérer des données plus spécifiques.

Comme vous pouvez le constater on crée un tableau d'objets contacts qui va nous permettre de stocker temporairement nos données.

Une fois que nous avons notre liste de contacts on peut travailler dessus pour récupérer les informations voulues. Nous créons une première boucle nous permettant de récupérer les données comme le nom, le prénom, et l'adresse email de chaque contact. Pour ce faire une simple boucle For…TO…DO…NEXT suffit :
    For numContact As Integer = 0 to UBound(contacts) 
    //On effectue un saut de ligne dans notre zone de texte
	
    ContactsArea.AppendText (EndOfLine)
    //On remplit notre composant TextArea avec les données fraîchement extraites

    ContactsArea.AppendText ("Information sur " + contacts(numContact).FirstName + " " + 
                                        contacts(numContact).LastName + EndOfLine)
    ContactsArea.AppendText ("----------------------------------------------" + EndOfLine)
    
    //On crée un objet de type DBContact qui va nous permettre de stocker les données 
    //temporairement
    Dim DBContact As new DBContact
    
    
    DBContact.Id = numContact
    DBContact.Prenom = contacts(numContact).FirstName
    DBContact.Nom = contacts(numContact).LastName
    DBContacts.Append(DBContact)
    Try
      If (contacts(numContact).EmailAddresses <> "") Then
        
        ContactsArea.AppendText ("Email Adress : " + contacts(numContact).EmailAddresses + 
          EndOfLine)
        DBContacts(numContact).Email = contacts(numContact).EmailAddresses
      end if
    Catch
      ContactsArea.AppendText ("Email Adress : None" + EndOfLine)
    End

Comme vous pouvez le constater nous accédons aux informations concernant le prénom, le nom et l'adresse mail de notre contact par l'intermédaire de notre tableau de contacts que nous avons créer auparavant et en appelant les propriétés respectives. Nous avons créé un objet de type DBContact auquel nous associons toutes les informations reccueillies. Cet objet est ensuite ajouter (méthode Append) à notre "collections" d'objet DBContacts. Celle-ci sera utilisée pour alimenter notre base de données si vous appuyer sur le bouton "Record in Database".

J'ai mis la partie d'extraction des adresses email dans un bloc Try…Catch…End pour éviter que l'application ne plante sur une exception, au cas où une adresse email ne soit pas présente dane le carnet. On ajoute ensuite l'adresse mail à notre collections de contacts par l'indice d'extraction. A noter que cet indice nous permet de créer l'id autoincrémenté qui servira de clé primaire dans notre base de données.

Voilà nous en avons fini avec la première boucle d'extraction nous permettant de récupérer les données générales des contacts, passons maintenant à l'extraction des données concernant les adresses associées, à noter que cette partie de code se trouve imbriquer dans la boucle d'extraction de chaque contact :

        data = contacts(numContact).Addresses
    If (data.count > 0) then
      ContactsArea.AppendText("This Contact has " + Str(data.Count) + " Addresses" + EndOfLine)
      for numAddress As integer = 0 to data.Count -1
        Try
          
          Address = data.value(numAddress)
          ContactsArea.AppendText("Address : " + Address.StreetAddress + EndOfLine)
          ContactsArea.AppendText("Address : " + Address.Zip + " " + Address.City + EndOfLine)
          
          Dim DBContact_address As new DBContact_address
          
          
          DBContact_address.Contactid = numContact
          DBContact_address.Rue = Address.StreetAddress
          DBContact_address.Code_postal = Address.Zip
          DBContact_address.Ville = Address.City
          DBContacts_address.Append(DBContact_address)
        Catch
        End
        
      Next
      
    end if

Dans un premier temps on regarde combien d'adresses associées au contact se trouve dans le carnet d'adresse. C'est ce que réalise les deux premières lignes de ce morceau de code. Ensuite pour chaque adresse on va récupérer la rue, le code postal et la ville du contact. Pour ce faire on utilise les données de l'adresse associées à l'objet contatcts par l'intermédiaire de la propriété Addresses. Nous créons notre objet de type DB_ContactAddress qui va nous permettre de stocker temporairement les données extraites. Nous ajoutons ensuite notre objet créé à notre "collection" d'adresse par l'intermédiaire de la fonction Append. Celle-ci nous permettra d'alimenter notre base de donées si l'on veut les stocker…

Voici la totalité de la fonction :

  Dim contacts() As AddressBookContact
  contacts = book.Contacts
  Dim data As AddressBookData
  Dim Address As AddressBookAddress
  //Dim DBContacts() As DBContacts
  //Dim DBContacts_address() As DBContacts_address
  
  
  
  nbRecords = UBound(contacts)
  For numContact As Integer = 0 to UBound(contacts)
    ContactsArea.AppendText (EndOfLine)
    
    ContactsArea.AppendText ("Information sur " + contacts(numContact).FirstName + " " + 
                                             contacts(numContact).LastName + EndOfLine)
    ContactsArea.AppendText ("----------------------------------------------" + EndOfLine)
    Dim DBContact As new DBContact
    
    
    DBContact.Id = numContact
    DBContact.Prenom = contacts(numContact).FirstName
    DBContact.Nom = contacts(numContact).LastName
    DBContacts.Append(DBContact)
    Try
      If (contacts(numContact).EmailAddresses <> "") Then
        
        ContactsArea.AppendText ("Email Adress : " + contacts(numContact).EmailAddresses + EndOfLine)
        DBContacts(numContact).Email = contacts(numContact).EmailAddresses
      end if
    Catch
      ContactsArea.AppendText ("Email Adress : None" + EndOfLine)
    End
    
    data = contacts(numContact).Addresses
    If (data.count > 0) then
      ContactsArea.AppendText("This Contact has " + Str(data.Count) + " Addresses" + EndOfLine)
      for numAddress As integer = 0 to data.Count -1
        Try
          
          Address = data.value(numAddress)
          ContactsArea.AppendText("Address : " + Address.StreetAddress + EndOfLine)
          ContactsArea.AppendText("Address : " + Address.Zip + " " + Address.City + EndOfLine)
          
          Dim DBContact_address As new DBContact_address
          
          
          DBContact_address.Contactid = numContact
          DBContact_address.Rue = Address.StreetAddress
          DBContact_address.Code_postal = Address.Zip
          DBContact_address.Ville = Address.City
          DBContacts_address.Append(DBContact_address)
        Catch
        End
        
      Next
      
    end if
    

Voyons maintenant le code permettant de réaliser le stockage des données recceuillies dans la base de données REAL SQL.

Cette action se réalise lorsque l'on clique sur le bouton "Record in Database". Il suffit de double-cliquer sur ce bouton comme vu précédemment pour accéder à l'éditeur de code de la fonction relative à l'événement du click.

Tout d'abord il va nous falloir accéder à la base de données qui se trouve sur le disque dur, et qui porte une extension .rsd.

Voici les lignes de codes permettant de réaliser cette opération :

  Dim dbFile as FolderItem
  Dim db as REALSQLdatabase
  db=New REALSQLdatabase
  Dim record As DatabaseRecord
  Dim id As String  
  dbFile=GetFolderItem("contacts.rsd")
  db.databaseFile=dbFile
    

Comme on peut le constater le lien se fait par l'intermédiaire d'un objet de type dbFile. Nous avons créer un lien avec la source de données physique grâce à la propriété databaseFile de l'objet REALSQLdatabase que nous avons créé auparavant…

Il va nous falloire ouvrir une connexion à celle-ci pour que l'on puisse y stocker des données. Voici ce que réalise cette opération :

  if db.connect() then
    
    
    ….
  Else
    Beep
    MsgBox "The database couldn't be opened."
  End if
      

Comme on peut le constater on fait un test simple pour savoir si la connexion est bien réalisée. Sinon une ereeur s'est produite et la poursuite des opérations ne peut être effectuée.

Si la connexion est opérationnelle nous pouvons créer nos enregistrements pour pouvoir ensuite les intégrer dans la base de données REAL SQL. Il suffit de créer pour chaque ligne d'enregistrement un objet de type databaseRecord. Comme le montre la boucle de création des enregistrements suivante (à intégrer à la suite du if db.connect() then)…

      for i As integer = 0 to nbRecords 
     
      
      Dim contact As new DBContact 
      contact = DBContacts(i)
      record = new DatabaseRecord
      
      record.Column("id") = Str(contact.id)
      record.Column("nom") = contact.Nom
      record.Column("prenom") = contact.Prenom
      record.Column("email") = contact.email
      db.InsertRecord("contacts", record)
      
      
          

Voyons maintenant comment réaliser l'opération permettant de stocker les adresses respectives de chaque contact si elles existent. Nous utilisons un bloc try…Catch…End pour éviter que l'application ne plante…

   try 
        Dim contact_address As new DBContact_address
        contact_address = DBContacts_address(i)
        record = new DatabaseRecord
        
        record.Column("contactid") = Str(contact.id)
        record.Column("rue") = contact_address.Rue
        record.Column("ville") = contact_address.Ville
        record.Column("code_postal") = contact_address.Code_postal
        db.InsertRecord("adresse_contacts", record)
      Catch
      End
  Next
      
      
          

Chaque engistrement est créé par l'intermédiaire de notre liste de contacts créée précédemment. L'insertion des nouveaux enregistrements dans la base de données se fait par l'intermédaire de la fonction InsertRecord qui prend en argument le nom de base de données et l'enregistrement que l'on vient de créé…

L'enregistrement ne peut être effectif que si on appelle la fonction Commit de l'objet Database.

Voici le code complet de la fonction :

    Dim dbFile as FolderItem
  Dim db as REALSQLdatabase
  db=New REALSQLdatabase
  Dim record As DatabaseRecord
  Dim id As String  
  dbFile=GetFolderItem("contacts.rsd")
  db.databaseFile=dbFile
  
  if db.connect() then
    
    
    for i As integer = 0 to nbRecords 
           
      Dim contact As new DBContact 
      contact = DBContacts(i)
      record = new DatabaseRecord
      
      record.Column("id") = Str(contact.id)
      record.Column("nom") = contact.Nom
      record.Column("prenom") = contact.Prenom
      record.Column("email") = contact.email
      db.InsertRecord("contacts", record)
      try 
        Dim contact_address As new DBContact_address
        contact_address = DBContacts_address(i)
        record = new DatabaseRecord
        
        record.Column("contactid") = Str(contact.id)
        record.Column("rue") = contact_address.Rue
        record.Column("ville") = contact_address.Ville
        record.Column("code_postal") = contact_address.Code_postal
        db.InsertRecord("adresse_contacts", record)
      Catch
      End
      
    Next
    
    
    If db.error then
      MsgBox db.errormessage
    Else
      db.Commit //save new records to database
      MsgBox "Records added successfully."
    End if
    
  Else
    Beep
    MsgBox "The database couldn't be opened."
  End if   
          

V CONCLUSION

Nous avons vu au cours de ce petit tutoriel comment réaliser une petite application permettant d'extraire des données issues de carnet d'adresse Mac OS X. Nous avons pu utiliser ces données pour alimenter une base de données REAL SQL. Nous avons pu entrevoir de nombreux concepts de programmation, et Real Studio nous facilite vraiment la tâche…