Ajout de la persistence SQL Compact dans un projet Windows Phone 7
Par Thierry THOUA le jeudi, novembre 17 2011, 21:49 - WP7 - Lien permanent
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 { 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.

