如何在Android应用程序更新上重新创建数据库?

时间:2016-12-16 15:54:34

标签: android sqlite xamarin

我刚刚写了大约8个月的Xamarin Android。

我在Google Play商店中有一个应用程序,当应用程序首次安装时,它会从代码创建sqlite数据库。

我必须更改数据库表,我添加了几列。

当应用程序执行自动更新时,我在哪里/如何告诉它删除数据库并重新创建它,或者它是自动的?我不期待。

我不担心数据,会重新下载。

我查看了Assets,创建了一个文本文件并从中读取了一个命令,但是我无法删除该资产,所以这是一个死胡同。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

首先,您可能需要确认自己的预期行为。我会跟踪您的.sqlite文件,看看在您的工作流程中会发生什么。

大多数情况下,从Google Play商店更新应用程序时,您的所有应用程序数据都将保留。 (因为它只是更新而不是卸载 - >再次安装)

您可以通过在调试环境中应用以下内容来模仿此行为:

enter image description here

如果您发现自己处于需要更新数据库以将其与新应用程序更新相关联的场景中,那么您需要一些机制来比较数据库版本,如果它比应用程序代码期望的旧,那么然后应用模式更改并可能使用初始信息为数据库设定种子。

答案 1 :(得分:0)

我喜欢使用内置 SQLiteOpenHelper类来维护Sqlite版本号并提供升级数据库的过程。

使用内置 Android.Database.Sqlite.SQLiteOpenHelper,您可以轻松地使用它来维护您的数据库版本,如果版本发生更改,请删除数据库并从空白处开始(没有表/没有数据) )。

记住:这是破坏性的“升级”...

public class SqliteOnVersionChangeCreateBlankDB : SQLiteOpenHelper
{
    new const string DatabaseName = "myDBName";
    const int DatabaseVersion = 1;

    public SqliteOnVersionChangeCreateBlankDB(Context context)  : base(context, DatabaseName, null, DatabaseVersion)
    {
    }

    public override SQLiteDatabase ReadableDatabase
    {
        get
        {
            try
            {
                return base.ReadableDatabase;
            }
            catch
            {
                File.Delete(DatabaseName);
                return base.WritableDatabase;
            }
        }
    }

    public override void OnCreate(SQLiteDatabase db)
    {
        Console.WriteLine($"{db}");
        // You can create the DB tables/data here if needed...
        // or use your favorite SQLite framework/library later...
    }

    public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        Console.WriteLine($"{db}:{oldVersion}:{newVersion}");
        if (oldVersion < newVersion)
        {
            // Normally this is where you would alter the existing schema to the new version
            // but this is a destructive upgrade.
            db.Close();
            File.Delete(db.Path);
        }
    }
}

用法:

从SQLiteOpenHelper子类中的 1 版本开始:

const int DatabaseVersion = 1;

执行此代码:

var sqliteHelper = new SqliteOnVersionChangeCreateBlankDB(this);
var db = sqliteHelper.ReadableDatabase;
db.Close();

现在你有一个空白的数据库,它被分配了版本1.它是空的,没有表/数据所以使用你最喜欢的Sqlite ORM / framework /库来创建表并用数据填充它......

除非数据库版本更改,否则每次启动应用程序时执行此代码都不会删除现有数据库:

var sqliteHelper = new SqliteOnVersionChangeCreateBlankDB(this);
var db = sqliteHelper.ReadableDatabase;
db.Close();

稍后,应用程序已更新,您还需要更改数据库,因此请将最新版本号(在本例中为 2 )分配给数据库。

const int DatabaseVersion = 2;

执行与以前相同的代码:

var sqliteHelper = new SqliteOnVersionChangeCreateBlankDB(this);
var db = sqliteHelper.ReadableDatabase;
db.Close();

您现在又有了一个空白数据库,但它被分配了版本2.再次使用您最喜欢的Sqlite ORM /框架/库来创建表并用数据填充它...