【问题标题】:Is calling 'Create Table' to keep database up to date a good practise?调用“创建表”以使数据库保持最新是一种好习惯吗?
【发布时间】:2020-04-21 21:52:45
【问题描述】:

我是 Xamarin 和 SQLite 的新手,所以我问自己在添加新列时保持数据库结构最新的好做法是什么。要使用 SQLite DB,我使用的是 SQLite-net-pcl。

我已经阅读了一些解决方案,这些解决方案使用存储在某处的版本字段,并用于在版本更改时手动更改数据库结构。

但据我所见,在 SQLiteConnection 上调用 CreateTable 不仅会创建表,还会在底层类更改时更新数据库中的表。

那么,打电话是个好习惯吗

SQLiteConnection db = new SQLiteConnection(dbPath);
db.CreateTable<ClassA>();

每次系统初始化,保持数据库最新?然后,对 ClassA 的每次更改都将应用于数据库表,而不会丢失任何数据。

【问题讨论】:

  • 它是否保留该表中当前的所有数据?
  • 是的。如果表中有记录,则添加列并获取该列的默认值。

标签: c# sqlite xamarin sqlite-net-pcl


【解决方案1】:

我测试了这个操作,我得到了以下结果。

首先,我的模型如下代码。

public class Prijem
{
    [PrimaryKey, AutoIncrement, Unique]
    public int BCode { get; set; }
    public string Name { get; set; }
    public string FirmName { get; set; }
    public string ItemCode { get; set; }
    public string Count { get; set; }
 }

我使用以下代码插入数据。

await App.Pdatabase.SavePrijemAsync(new Prijem() {Name="New",FirmName="55Fame" ,ItemCode="dg",Count="15"});

我的SavePrijemAsync 方法如下代码。

  public Task<int> SavePrijemAsync(Prijem prijem)
    {
        if (IsExisted(prijem))
        {
             return _database.UpdateAsync(prijem);
        }
        else
        {
             return _database.InsertAsync(prijem);

        }
    }

我在 sqlite 数据库中得到了类似以下截图的记录。

然后我只添加一个名为MyImage的属性

   public class Prijem
{
    [PrimaryKey, AutoIncrement, Unique]
    public int BCode { get; set; }
    public string Name { get; set; }
    public string FirmName { get; set; }
    public string ItemCode { get; set; }
    public string Count { get; set; }

    string image = " Image";
    public string MyImage
    {
        set
        {
            if (image != value)
            {
                image = value;

            }
        }
        get
        {
            return image;
        }
    }

}

我使用如下代码的更新操作。

 await App.Pdatabase.SavePrijemAsync(new Prijem() {Name="New",FirmName="55Fame" ,ItemCode="dg",Count="15" });

并像下面的代码那样插入操作。

   await App.Pdatabase.SavePrijemAsync(new Prijem() { Name = "New11", FirmName = "55Fame", ItemCode = "dg", Count = "15" });

我在数据库中得到了如下截图所示的结果。

最后,我们可以得到结果,如果我们给模型添加一个属性。此列将添加到 sqlite 数据库中,但默认值我们必须手动更新它的现有数据,如果我们将新值插入数据库,将添加默认值。

【讨论】:

  • 如何检查,如果条目已经在数据库中,因为主键(唯一的唯一属性)是由数据库创建的?据我所知,给定的示例根本没有使用 CreateTable 函数,而这正是我特别要求的。
  • 我用DDMS导出DB文件,我用DB Browser打开db文件查看sqlite数据库中的collum。
  • 当我用一个属性扩展我的模型时,就像你做的那样,只是在数据库连接上说“插入”,我得到一个异常:SQLite.SQLiteException:'table Prijem has no column named MyImage' .我总是必须为具有新属性的类调用“CreateTable”,否则它不起作用。
  • 你可以通过这个线程测试我的演示:github.com/851265601/Xamarin.Android_ListviewSelect/blob/master/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
相关资源
最近更新 更多