Ajout de la persistence SQL Compact dans un projet Windows Phone 7

Je continue ma série d'articles sur la création d'une application Windows Phone en parlant de la persistence .. Une application moderne demande souvent de pouvoir garder des informations en mémoire. Une base de données SQL est très souvent utilisée pour obtenir des résultats correspondant à notre recherche ... Nous voulons ici enregistrer tous nos pointages afin de pouvoir effectuer des recherches dans le futur ainsi que des décomptes.

1) Création de la couche Manager de persistence

La première étape est de créer une classe: public static class DataPersistenceManager { }
Nous pouvons ensuite créer notre code définissant notre table:

    [Table(Name = "Items")]
    private class Item
    {
        [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity",
                CanBeNull = false, AutoSync = AutoSync.OnInsert)]
        public int ID { getset; }
        [Column(CanBeNull = false)]
        public DateTime StartTime { getset; }
        [Column]
        public DateTime? StopTime { getset; }
    }
Il faut ensuite pouvoir enregistrer nos données de notre table "Items" dans notre base de données sur notre Windows Phone 7 Mango. Cela passe par deux étapes:

La première est la création de notre classe DataContext (a noter qu'ici on enregistre cette base dans notre IsolatedStorage):

    private class TimerDataContext : DataContext
    {
        private const string DBConnectionString = "Data Source=isostore:/MyTimerDb.sdf";
        public TimerDataContext() : base(DBConnectionString) { }
        public Table<Item> TimerItems;
    }
La seconde est l'utilisation de celle-ci pour créer ou récupérer une instance de la base de données:

    private static TimerDataContext GetTimerDataContext()
    {
        TimerDataContext context = new TimerDataContext();
        if (!context.DatabaseExists())
            context.CreateDatabase();
        return context;
    }
Nous pouvons ensuite créer deux méthodes utilisées dans l'application. En effet, nous avons besoin d'un Get et d'un InsertOrUpdate.

public static class DataPersistenceManager
{
    public static IEnumerable<TimerItem> GetItems()
    {
        List<TimerItem> items = new List<TimerItem>();
        using (TimerDataContext db = GetTimerDataContext())
        {
            items.AddRange(db.TimerItems.Select(elt =>
              new
 TimerItem { ID = elt.ID, StartTime = elt.StartTime, StopTime = elt.StopTime }));
        }
        return items;
    }
    public static void SaveOrUpdate(TimerItem item)
    {
        using (TimerDataContext db = GetTimerDataContext())
        {
            if (!item.ID.HasValue)
            {
                var newItem = new Item() { StartTime = item.StartTime, StopTime = item.StopTime };
                db.TimerItems.InsertOnSubmit(newItem);    
                db.SubmitChanges();
                item.ID = newItem.ID;
            }
            else
            {
                var itemSaved = db.TimerItems.First(elt => elt.ID == item.ID);
                itemSaved.StartTime = item.StartTime;
                itemSaved.StopTime = item.StopTime;
                db.SubmitChanges();
            }
        }
    }
}

2) Utilisation de notre DB Manager dans notre application

Il faut donc modifier notre classe ViewModel. Celle-ci au chargera à son instanciation les items existants ... Lorsque l'on exécutera notre action, nous enregistrerons notre item dans la DB (le code original se trouve dans l'article lié a MVVM sous Windows Phone 7)

public class MainViewModel : ViewModelBase
{
    private ObservableCollection<TimerItem> items = new ObservableCollection<TimerItem>();
    public ObservableCollection<TimerItem> Items { get { return this.items; } }
    public MainViewModel()
    {
        this.Execute = new RelayCommand(ExecuteAction);
        foreach (var elt in DataPersistenceManager.GetItems())
            this.items.Add(elt);
        if (this.items.Count > 0)
            this.currentItem = this.items[this.items.Count - 1];
    }
    public ICommand Execute { getprivate set; }
    private void ExecuteAction()
    {
        if (this.currentItem == null)
        {
            // no value
            this.currentItem = new TimerItem { StartTime = DateTime.Now };
            this.items.Add(this.currentItem);
        }
        else if (!this.currentItem.StopTime.HasValue)
        {
            this.currentItem.StopTime = DateTime.Now;
        }
        else
        {
            this.currentItem = new TimerItem { StartTime = DateTime.Now };
            this.items.Add(this.currentItem);
        }
        DataPersistenceManager.SaveOrUpdate(this.currentItem);
    }
    private TimerItem currentItem;
}

Ces quelques ajustements nous permettent d'avoir une application qui gardera en mémoire tous nos pointages. Nous pouvons maintenant passer à la phase d'avertissement lorsque nous avons dépassé notre nombre d'heures. Nous verrons ce point dans un de mes prochains articles.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.