Xamarin sqlite 不能使用 struct 作为表数据类型

Posted

技术标签:

【中文标题】Xamarin sqlite 不能使用 struct 作为表数据类型【英文标题】:Xamarin sqlite cannot use struct as table data type 【发布时间】:2021-12-11 01:17:13 【问题描述】:

使用 sqlite-net-pcl 1.8.116 如果我定义一个结构并从中创建一个表在数据库中,如果没有得到 System.ArgumentException: 'method arguments are incompatible',我就无法从中读取值。我可以制作表格并添加行。只有回读失败。

如果我把我的结构变成一个类,它就可以正常工作。我已经查看并查看了是否根本不支持结构,但我没有看到任何表明这一点的东西,甚至没有看到其他人有同样的问题。

我这样创建和使用数据库,失败了

var db = new SQLiteAsyncConnection(path);
db.CreateTableAsync<Flight>().Wait();
var affected = await db.InsertAsync(new Flight());
var get = await db.Table<Flight>().ToListAsync(); //exception

我可以做同样的事情,但同样的例外,使用类似的 sqlQuery

var flights = await db.QueryAsync<Flight>("select * from Flight where FlightID==?",id);

这篇文章的精简结构是

public struct Flight

  [PrimaryKey, AutoIncrement]
  public int Id  get; set; 
    
  public long Start  get; set; 
  public long End  get; set; 
  public string Description  get; set;     

     

如果我将结构更改为类,则没有问题。结构是不是像这样不被支持?

【问题讨论】:

【参考方案1】:

是的,正如你所说,当我们使用 nuget sqlite-net-pcl 1.8.116 时就是这种情况。但是你可以尝试使用 nuget sqlite-net-pcl 的 1.7.335 版本。当我使用 1.7.335 版本创建表格并插入一些项目时,没有这样的错误。

我发布了一个关于这个问题的新问题,你可以在这里跟进:https://github.com/praeclarum/sqlite-net/issues/1075。

感谢您对 xamarin 的反馈。

最好的问候!

【讨论】:

感谢您确认。只要我知道不只是我做错了,我就可以继续前进。幸运的是,就我而言,现在让它成为一个类并不是一个真正的问题。 我也可以确认这一点,回滚到 1.7.335 “解决”了这个问题。 struct 真的不再受支持了吗?现在是我做出改变的好时机。

以上是关于Xamarin sqlite 不能使用 struct 作为表数据类型的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin SQLite教程Xamarin.iOS项目添加引用

Xamarin/SQLite/C# - 如何使用菜单项删除从列表视图和 SQLite 表中删除一行

我应该在 Xamarin.Forms 上使用哪些 SQLite (sqlite-net-pcl) 标志?

如何在Xamarin Forms中使用SqLite?

使用 SQL/SQLite 工具箱 Visual Studio 2019 在 SQLite 数据库和 Xamarin.Android 项目之间建立连接

Xamarin Forms Sqlite 创建任务