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

时间:2019-05-04 05:24:18

标签: 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; }
    public int Quiz { get; set; }

}

然后

db2.CreateTable<ViewHistory>();

我想检查“分配”列是否存在,然后删除“分配”列(如果存在)。到目前为止,我所看到的建议要么已经过时,要么已经建议创建一个新表,并且也不包含任何检查表是否存在的建议。

现在,使用最新版本的sqlite-net-pcl(1.5.2),我可以删除列吗?如果不能,那么有人可以推荐一种方法来做到这一点,即仅使用PCL或我可以执行的SQL可用的C#功能。

我在SO上看到了这一点,但这并没有真正帮助我

Delete column from SQLite table

2 个答案:

答案 0 :(得分:1)

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的数据库浏览器”,对表/列进行所有更改,然后复制包含所有SQL语句的“数据库日志输出”,并将其粘贴到单个{{1}中}声明...

答案 1 :(得分:-1)

您可以创建具有动态属性的类

您可以参考以下链接
How do I create dynamic properties in C#?