如何使用Xamarin表单附带的SQLite net pcl从SQLite表中删除列?

如何使用Xamarin表单附带的SQLite net pcl从SQLite表中删除列?,xamarin,xamarin.forms,sqlite-net,Xamarin,Xamarin.forms,Sqlite Net,我有一个用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; } publ

我有一个用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>();
我想检查分配列是否存在,然后删除分配列(如果存在)。到目前为止,我所看到的建议要么是非常旧的,要么是建议创建一个新表,而且没有包括任何检查是否存在的内容

现在有了最新版本的sqlite net pcl 1.5.2,有什么方法可以删除一个列吗?如果没有,有人能推荐一种方法来做到这一点,那就是使用PCL或SQL中的C特性,我可以执行这些特性

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

SQLite不支持ALTER TABLE x DROP COLUMN x,因此您需要创建一个新表并复制数据

您可以通过一条多行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;
    }
}
注意:通常我只使用SQLite的DB Browser,对数据库进行所有表/列更改,并复制包含所有SQL语句的DB日志输出,并将其粘贴到单个SQLCONNECTION.Exceute语句中…

@Alan2很高兴它有所帮助