如何在Android应用更新上重新创建数据库?
问题描述:
我是新手,编写Xamarin Android大约8个月。如何在Android应用更新上重新创建数据库?
我在Google Play Store上有一个应用程序,当应用程序第一次安装时,它会从代码创建sqlite数据库。
我不得不做一个数据库表更改,我添加了几列。
当应用程序确实是自动更新时,我在哪里/如何告诉它放弃数据库并重新创建数据库,还是自动更新?我预计不会。
我不担心数据,它会重新下载。
我查看了资产,创建了一个文本文件并从中读取了一条命令,但我无法删除该资产,因此这是一个死路一条。 感谢您的帮助。
答
我喜欢使用内置的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);
}
}
}
用法:
const int DatabaseVersion = 1;
:
与在SQLiteOpenHelper的子类版本的启动执行此代码:
var sqliteHelper = new SqliteOnVersionChangeCreateBlankDB(this);
var db = sqliteHelper.ReadableDatabase;
db.Close();
你现在有一个空白的数据库,分配版本1.它是空的,没有表/数据,所以用你最喜欢的Sqlite ORM /框架/库来创建表和填充数据...
除非数据库版本改变,每次你的应用程序启动不会删除现有的数据库执行此代码:
var sqliteHelper = new SqliteOnVersionChangeCreateBlankDB(this);
var db = sqliteHelper.ReadableDatabase;
db.Close();
后来,应用程序的更新,您还需要更改数据库,所以在这种情况下,将高于最后的新版本号()分配给数据库。
const int DatabaseVersion = 2;
执行相同的代码之前:
var sqliteHelper = new SqliteOnVersionChangeCreateBlankDB(this);
var db = sqliteHelper.ReadableDatabase;
db.Close();
现在再有一个空数据库,但它被分配版本2.同样你最喜欢的sqlite的ORM /框架/库来创建表和用数据填充它...
我使用的是Frank Krueger的sqlite-net。我创建了自己的数据库处理程序来创建和删除表。如果我使用SQLiteOpenHelper,是否必须将所有代码转移给它? – GaryP
它给了我2个数据库;一个在文件下,另一个在数据库下,因为我使用了我自己的类。 – GaryP
@GaryP完全没有问题,继续使用'sqlite-net',只需在通过sqlite-net连接打开之前使用子类型的SQLiteOpenHelper,然后在那里处理版本控制,然后使用'sqlite-net'到're创建“您的表/数据.... – SushiHangover