Pour de grosses bases de données, l'outil SQL est nécessaire. Ce n'est pas notre cas pour mon application CDClassic, la taille des données est faible, et la quantité moyenne. J'ai moins de 300 CD, pas de quoi écrouler un fichier Mac. Nous allons, donc, utiliser les outils proposés dans Cocoa.
Apple dans Cocoa, (donc AppleScript Studio en profite, pour faciliter la vie des développeurs) a créé une sorte de mini base de données associée à une table, appelée "Data Source". Elle est associée en mémoire centrale, et en dynamique à la table. Toutes les fonctions d'ajout de données, modification de l'ordre de tri, scrolling, sont automatiquement gérées.
En complément, pour le stockage sur disque des données, Cocoa offre les "p-list", un format de type html. J'en ai frémi d'horreur devant la non-lisibilité du fichier par TextEdit ou autre. Mais bonheur, "Property List Editor", lit les balises, et vous présente les données de manière tout à fait lisibles. Notez que, toutes les préférences de toutes les applications Mac sont dans ce format. Et, cela semble très rapide en temps d'accés.
Donc, nous allons apprendre successivement :
Ci-dessous, le script complet à placer dans "awake from nib" pour être exécuté à l'ouverture de l'application.
Pas d'affolement, c'est assez facile. Nous allons voir phrase par phrase.
De plus vous avez l'exemple complet dans Data Source.zip
Toutes mes excuses pour les commentaires en anglais. Ils proviennent des exemples, que j'ai récupérés chez Apple. De plus, je mets moi aussi souvent mes commentaires en anglais.
on awake from nib theObject
if the name of theObject is "authorTableView" then
----------------------------- Initial list for demo --------------------------
set List_de_demo to {"BARTOK Bela (1881-1945)", "BELLINI Vincenzo (1801-1835)", "CANTELOUBE DE MALARET Marie-Joseph (1879-1957)", "VERDI Giuseppe (1813-1901)"}
------------------------------------------------------------------------------
--------- Now we define the data source associate to the table -----------
set AuthorDataSource to make new data source at end of data sources with properties {name:"AuthorDS"}
-- Create the data columns, including the sort information for each column
make new data column at end of data columns of AuthorDataSource with properties {name:"Author", sort order:ascending, sort type:alphabetical, sort case sensitivity:case sensitive}
set sorted of AuthorDataSource to true -- Les données devront être triées
-- Set the "priority" data column as the sort column
set sort column of AuthorDataSource to data column "Author" of AuthorDataSource
-- Finally, assign the data source of the table view to your data source
set data source of theObject to AuthorDataSource -- table view "authorTableView"
-- Add the data, associated to the table
append AuthorDataSource with List_de_demo -- les noms en minuscule vont après
end if
----------------------------------------------------------------------------------
end awake from nib
La première phrase est un IF permettant de savoir à quel objet s'adresse le script.
if the name of theObject is "authorTableView" then
Vous devez faire un bloc IF pour chaque objet à traiter.
Rappel en AppleScript la syntax est : "set nom to {"a", "b"}
Soit pour une liste de quatre auteurs :
set List_de_demo to {"BARTOK Bela (1881-1945)", "BELLINI Vincenzo (1801-1835)", "CANTELOUBE DE MALARET Marie-Joseph (1879-1957)", "VERDI Giuseppe (1813-1901)"}
PS : Comme on me le demande souvent, Canteloube de Malaret a répertorié les chants d'Auvergne. Je l'ai pris, car c'est le plus long pour la largeur de la fenêtre.
set AuthorDataSource to make new data source at end of data sources with properties {name:"AuthorDS"}
"AuthorDataSource" est le nom de la variable qui pointe sur la Data Source. C'est ce nom de variable que nous utiliserons à chaque fois que nous nous adresserons à la Data Source.
"AuthorDS" est le nom de la Data Source. Je ne l'ai jamais vu dans un script.
make new data column at end of data columns of AuthorDataSource with properties {name:"Author", sort order:ascending, sort type:alphabetical, sort case sensitivity:case sensitive}
Une commande "make" pour chaque colonne. Dans mon application il n'y a qu'une colonne.
"Author" est le nom de la colonne dans la Data Source. Le nom de la colonne en "Attributes" et "Applescript" peuvent être différent. Il faut juste respecter l'ordre si vous avez plusieurs colonnes.
set sorted of AuthorDataSource to true -- Les données devront être triées
Puis, indiquez quelle est la colonne prioritaire pour le tri. Important s'il y a plusieurs colonnes.
set sort column of AuthorDataSource to data column "Author" of AuthorDataSource
Le nom de la table, c'est l'objet appelé "theObject" et sélectionné par le IF
set data source of theObject to AuthorDataSource -- table view "authorTableView"
Le stockage des données se fait par la commande "append". Les données seront stockées à la fin du fichier Data Source.
Vous pouvez avoir autant de commandes "append" dans votre code. A chaque fois, la liste de données sera ajoutée à la fin du fichier de la Data Source et, par bonheur, automatiquement dans la Scrolling view, le tri et l'affichage sera fait, par la gestion du scrolling.
Attention au piege : C'est la Scrolling view qui est triée, pas les données elles-mêmes. Exemple : vous avez les données B,C,D initialement. Vous stocké A. La liste devient B,C,D,A, mais comme vous avez spécifié que la Data Source est triée, la scrolling view affiche bien A,B,C,D. Cela fait un peu bizarre, de spécifier une Data Source triée, et les données ne le sont pas, c'est sa visibilité qui l'est. Encore pire, si vous demandez la rangée 2 à la scrolling view vous obtenez bien B, mais si vous demandez la rangée 2 à la "Data Source", là vous parlez à la liste non triée, et vous obtenez C. Nous y revenons dans le chapitre suivant, à l'étude des commandes pour la sélection des rangées./p>
Etudiez cette exemple. Vous verez il n'y a pas de définition de colonne dans Interface Builder, ni de connexion au script pour la colonne. Le nom est aussi différent. La Data Sourse est autarcique, et pointe uniquement sur le nom de la table "NSTableView".