如何使用 Xamarin Forms 附带的 sqlite-net-pcl 从我的 SQLite table 中删除列?

How can I remove a column from my SQLite table with sqlite-net-pcl that comes with Xamarin Forms?

我有一个 table 是用这个 C# 代码创建的:

public class ViewHistory
{
    [PrimaryKey]
    public string YYMMDD { get; set; }
    public int UtcNow { get; set; }
    public int Assign { get; set; }
    public int Learn { get; set; }
    public int Practice { get; set; }
    public int Quiz { get; set; }

}

然后

db2.CreateTable<ViewHistory>();

我想检查 Assign 列是否存在,如果存在则删除 Assign 列。到目前为止,我所看到的建议要么都很陈旧,要么建议创建一个新的 table,并且也不包括任何检查以查看它是否存在。

现在有了最新版本的 sqlite-net-pcl (1.5.2) 有什么办法可以删除专栏吗?如果不能,有人可以推荐一种方法来执行此操作,即使用我可以执行的 PCL 或 SQL 提供的 C# 功能。

我在 SO 上看到了这个,但它并没有真正帮助我:

Delete column from SQLite table

SQL站点不支持ALTER TABLE x DROP COLUMN x所以你需要新建一个table并复制数据。

您可以通过一个多行 SQL 语句完成所有这些并执行它,但这将引导您完成尽可能多的使用 ORM 的步骤:

注意:这假设您的模型已经更新并且不再包含该列并且您当前的数据库可能会也可能不会有了...

var conn = new SQLiteConnection(.....
conn.CreateTable<ViewHistory>();
~~~

if (0 < conn.ExecuteScalar<int>("SELECT COUNT(*) AS colcount FROM pragma_table_info('ViewHistory') WHERE name='Assign'"))
{
    try
    {
        conn.BeginTransaction();
        conn.Execute("ALTER TABLE ViewHistory RENAME TO backup;");
        conn.CreateTable<ViewHistory>();

        // Column map and copy data 
        var columns = conn.GetMapping<ViewHistory>(CreateFlags.None).Columns;
        var columnNames = string.Join(",", columns.Select(p => p.Name));
        conn.Execute($"INSERT INTO ViewHistory ({columnNames}) SELECT {columnNames} FROM backup;");

        conn.Execute("DROP TABLE backup;");
        conn.Commit();
        conn.Execute("VACUUM");
    }
    catch (Exception ex)
    {
        conn.Rollback();
        throw ex;
    }
}

注意:通常我只使用 "DB Browser for SQLite",对数据库进行所有 table/column 更改,然后复制包含所有 SQL 语句的 "DB Log output" 并粘贴进入单个 SQLConnnection.Exceute 语句...