2016-12-16 146 views
0

我是新手,编写Xamarin Android大约8个月。如何在Android应用更新上重新创建数据库?

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

我不得不做一个数据库表更改,我添加了几列。

当应用程序确实是自动更新时,我在哪里/如何告诉它放弃数据库并重新创建数据库,还是自动更新?我预计不会。

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

我查看了资产,创建了一个文本文件并从中读取了一条命令,但我无法删除该资产,因此这是一个死路一条。 感谢您的帮助。

回答

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); 
     } 
    } 
} 

用法:

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 /框架/库来创建表和用数据填充它...

+0

我使用的是Frank Krueger的sqlite-net。我创建了自己的数据库处理程序来创建和删除表。如果我使用SQLiteOpenHelper,是否必须将所有代码转移给它? – GaryP

+0

它给了我2个数据库;一个在文件下,另一个在数据库下,因为我使用了我自己的类。 – GaryP

+0

@GaryP完全没有问题,继续使用'sqlite-net',只需在通过sqlite-net连接打开之前使用子类型的SQLiteOpenHelper,然后在那里处理版本控制,然后使用'sqlite-net'到're创建“您的表/数据.... – SushiHangover

0

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

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

您可以通过应用在调试环境下模仿这一行为:

enter image description here

如果你发现自己在一个场景中,你需要更新数据库以将其与新的应用程序更新相关联,那么您需要一些机制来比较数据库版本,并且如果它比应用程序的代码所期望的旧,那么您将应用模式更改并可能为数据库初始化初始值信息。

相关问题