【问题标题】:How can I remove a column from my SQLite table with sqlite-net-pcl that comes with Xamarin Forms?如何使用 Xamarin Forms 附带的 sqlite-net-pcl 从我的 SQLite 表中删除列?
【发布时间】:2019-05-04 05:24:18
【问题描述】:

我有一个用这个 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

【问题讨论】:

    标签: xamarin xamarin.forms sqlite-net


    【解决方案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 语句的“数据库日志输出”并将其粘贴到单个 SQLConnnection.Exceute 语句中...

    【讨论】:

    • @Alan2 很高兴它有帮助 ?
    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多