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.