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 { get; set; }
[Column(CanBeNull = false)]
public DateTime StartTime { get; set; }
[Column]
public DateTime? StopTime { get; set; }
}
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 { get; private 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.