如何使用Xamarin表单附带的SQLite net pcl从SQLite表中删除列?
我有一个用C代码创建的表:如何使用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
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很高兴它有所帮助