Стерлинговая проблема сериализации в Windows Phone 7 - PullRequest
0 голосов
/ 19 сентября 2011

У меня проблема с базой данных Sterling для Windows Phone. Я реализовал базу данных шаг за шагом в моем wp7app, но она не сериализует мои данные при сохранении новых объектов. Например: я сериализирую учетные данные, используя базу данных по стерлингу:

        var userCredentials = new UserCredentials(userName, password);
        App.Database.Save(userCredentials);
        App.Database.Flush();

Но когда приложение повторно активируется (или перезапускается), Sterling не возвращает никаких значений из изолированного хранилища:

var firstOrDefault = App.Database.Query<UserCredentials, string>()
            .ToList()
            .FirstOrDefault();

Мой метод ActivateEngine выглядит стандартно, а TableDefinition:

CreateTableDefinition< UserCredentials, string >(t => t.UserName),

Почему база данных стерлингов не сериализует мои данные? Кажется, все реализовано нормально. Пожалуйста, помогите.

1 Ответ

1 голос
/ 19 сентября 2011

Активируете ли вы и регистрируете ли базу данных при запуске и окачиваете по завершении, как описано в Quickstart ?

Мое личное предпочтение - использовать сервис приложений, подобный следующему:

namespace MyApp.Data
{
    using System.Windows;
    using Wintellect.Sterling;
    using Wintellect.Sterling.IsolatedStorage;

    /// 
    /// Defines a an application service that supports the Sterling database.
    /// 
    public class SterlingDatabaseService : IApplicationService, IApplicationLifetimeAware
    {
        public static SterlingDatabaseService Current { get; private set; }

        public ISterlingDatabaseInstance Database { get; private set; }

        private SterlingEngine _engine;

        /// 
        /// Called by an application in order to initialize the application extension service.
        /// 
        /// Provides information about the application state.
        public void StartService(ApplicationServiceContext context)
        {
            Current = this;
            _engine = new SterlingEngine();
        }

        /// 
        /// Called by an application in order to stop the application extension service.
        /// 
        public void StopService()
        {
            _engine = null;
        }

        /// 
        /// Called by an application immediately before the  event occurs.
        /// 
        public void Starting()
        {
            _engine.Activate();
            Database = _engine
                .SterlingDatabase
                .RegisterDatabase(new IsolatedStorageDriver());
        }

        /// 
        /// Called by an application immediately after the  event occurs.
        /// 
        public void Started()
        {
            return;
        }

        /// 
        /// Called by an application immediately before the  event occurs.
        /// 
        public void Exiting()
        {
            _engine.Dispose();
        }

        /// 
        /// Called by an application immediately after the  event occurs.
        /// 
        public void Exited()
        {
            return;
        }
    }
}

Если вы используете этот подход, не забудьте добавить экземпляр в App.xaml:

    <Application.ApplicationLifetimeObjects>
        <!-- Required object that handles lifetime events for the application. -->
        <shell:PhoneApplicationService Activated="Application_Activated"
                                       Closing="Application_Closing"
                                       Deactivated="Application_Deactivated"
                                       Launching="Application_Launching" />
        <data:SterlingDatabaseService />
    </Application.ApplicationLifetimeObjects>
...