WP8本地数据库覆盖

时间:2014-05-30 12:49:46

标签: windows-phone-8

我正在构建一个预装了大量信息的本地数据库的应用程序。该数据库存储在应用程序的Assets文件夹中,并在首次启动应用程序时将其复制到隔离存储中。

class DatabaseHelper : DataContext
{

    private const int DATABASE_VERSION = 16;

    ...

    private void Initialize()
    {

        DatabaseSchemaUpdater dbUpdater;

        if (!DatabaseExists())
        { 

            // Copy over the preloaded database
            CopyDatabase();

            dbUpdater = this.CreateDatabaseSchemaUpdater();
            dbUpdater.DatabaseSchemaVersion = DATABASE_VERSION;
            dbUpdater.Execute();

        }
        else
        {
            CheckDabaseVersion();
        }

    }

    private void CheckDabaseVersion()
    {

        DatabaseSchemaUpdater dbUpdater;

        dbUpdater = this.CreateDatabaseSchemaUpdater();

        if (dbUpdater.DatabaseSchemaVersion < DATABASE_VERSION)
        {

            //Save User Data
            //SaveUserData();

            DeleteDatabase();

            //Copy over the new version of the preloaded database
            CopyDatabase();

            //Update the database version
            dbUpdater.DatabaseSchemaVersion = DATABASE_VERSION;
            dbUpdater.Execute();

            this.SubmitChanges();


            //Copy User Data
            //CopyUserData();


        }

    }

    ... 
}

当我想更新数据库中的数据时,我使用新数据更新预加载的数据库,然后增加DATABASE_VERSION。应该做的是在下次启动时应用程序检查并确定隔离存储中的数据库不是最新的,并从资产存储中复制新数据库。请参阅上面的CheckDabaseVersion()

上面代码的问题是,在我尝试访问任何数据后发生以下错误:

Operation not allowed after DeleteDatabase call.

有什么想法吗?如何在隔离存储中覆盖数据库?

1 个答案:

答案 0 :(得分:1)

在关闭(Dispose调用)所有DataContext访问该数据库的实例后,您应该能够在隔离存储中覆盖您的数据库。

以下是您案例的代码(未经测试):

class DatabaseHelper: DataContext
{
    internal bool shouldUpgradeDatabase()
    {
        var dbUpdater = this.CreateDatabaseSchemaUpdater();
        return dbUpdater.DatabaseSchemaVersion < DATABASE_VERSION;
    }

    internal void writeLastVersion()
    {
        var dbUpdater = res.CreateDatabaseSchemaUpdater();
        dbUpdater.DatabaseSchemaVersion = DATABASE_VERSION;
        dbUpdater.Execute();
    }

    static DatabaseHelper initialize()
    {
        DatabaseHelper res = new DatabaseHelper();

        if( !res.DatabaseExists() )
        {
            CopyDatabase();
            res.writeLastVersion();
            return res;
        }

        if( !res.shouldUpgradeDatabase() )
            return res;

        // Should upgrade.
        res.DeleteDatabase();
        res.Dispose();
        res = null;

        CopyDatabase(); //< This should overwrite your files OK, because we've shut down the data context
        res = new DatabaseHelper();
        res.writeLastVersion();
        return res;
    }
}