二、把Sterling集成到WP7项目中
现在,我们已经定义了一个Sterling数据库、两个表及相应的索引。那么,接下来我们来分析如何把Sterling数据库集成到我们的示例应用程序WP7SterlingLearning中。请注意,WP7SterlingLearning仅是一个普通的Windows Phone7应用程序,没有什么特别之处。从总体上看,关键的问题主要发生在文件App.xaml.cs中。
1.添加所需的组件
若要使用Sterling数据库,首先要添加使用Sterling引擎所需的组件。下面给出关键代码部分:
列表2:添加使用Sterling引擎所需的组件的关键代码
- //省略其他引用…
- using Wintellect.Sterling;
- using WP7SterlingLearning.Database;
- namespace WP7SterlingLearning
- {
- public partial class App : Application
- {
- private static MainViewModel viewModel = null;
- private static ISterlingDatabaseInstance _database = null;
- private static SterlingEngine _engine = null;
- private static SterlingDefaultLogger _logger = null;
- //The MainViewModel object
- public static MainViewModel ViewModel
- {
- get
- {
- if (viewModel == null)
- viewModel = new MainViewModel();
- return viewModel;
- }
- }
- public static ISterlingDatabaseInstance Database
- {
- get
- {
- return _database;
- }
- }
- //…
注意,上面的全局静态属性Database的定义有助于在应用程序的各处引用这一数据库。此外,另一个全局静态属性ViewModel也起着类似的作用。
其次,我们定义了两个辅助方法。第一个方法_ActivateEngine旨在当程序首次启动时或者当程序从墓碑(tombstone)事件中唤醒时激活数据库ContactsDatabase。第二个方法_DeactivateEngine用于当应用程序退出或进入到墓碑(tombstone)事件中时停用Sterling引擎。
列表3:方法_ActivateEngine的关键代码部分
- private void _ActivateEngine()
- {
- _engine = new SterlingEngine();
- _logger = new SterlingDefaultLogger(SterlingLogLevel.Information);
- _engine.Activate();
- _database = _engine.SterlingDatabase.RegisterDatabase();
- //register triggers
- var maxIdx1 =
- _database.Query().Any() ?
- (from id in _database.Query()
- select id.Key).Max() + 1 : 1;
- _database.RegisterTrigger(new ContactsDatabase.GroupTrigger(maxIdx1));
- var maxIdx2 =
- _database.Query().Any() ?
- (from id in _database.Query()
- select id.Key).Max() + 1 : 1;
- _database.RegisterTrigger(new ContactsDatabase.ContactTrigger(maxIdx2));
- }
- private void _DeactivateEngine()
- {
- _logger.Detach();
- _engine.Dispose();
- _database = null;
- _engine = null;
- }
这里有几点值得注意。首先,我们使用内置的Sterling日志记录器简单地把执行结果输出到调试窗口。事实上,Sterling也支持编写自定义日志记录器并注册到Sterling引擎。然而,有关编写自定义日志记录器的问题已经超出了本文的范围。其次,通过调用方法RegisterDatabase我们把数据库注册到Sterling引擎中。第三,我们把两个先前定义的触发器通过数据库的RegisterTrigger方法注册到Sterling引擎。
2.在WP7生命周期事件中控制Sterling引擎
现在,我们可以使用Windows Phone 7应用程序的四个典型的生命周期事件的编程来调用上面的两个辅助方法。
列表4:在WP7应用程序生命周期事件中控制Sterling引擎
- private void Application_Launching(object sender, LaunchingEventArgs e)
- {
- _ActivateEngine();
- }
- private void Application_Activated(object sender, ActivatedEventArgs e)
- {
- _ActivateEngine();
- if (!App.ViewModel.IsDataLoaded)
- {
- App.ViewModel.LoadData();
- }
- }
- private void Application_Deactivated(object sender, DeactivatedEventArgs e)
- {
- _DeactivateEngine();
- }
- private void Application_Closing(object sender, ClosingEventArgs e)
- {
- _DeactivateEngine();
- }
有关Windows Phone 7应用程序的上述四个生命周期事件的解释,请参考其他的Windows Phone 7入门性文章,在此不再赘述。
截至目前,Sterling数据库大部分的相关工作已经完成。随后的任务是把Sterling数据库结合进WP7视图页面的编程中。