如何使用 Xamarin Forms 中的 sqlite-net-pcl 从 sqlite3 数据库的列中读取 `uuid`

How can I read a `uuid` from a column in a sqlite3 db using sqlite-net-pcl in Xamarin Forms

我有一个我无法控制的数据库架构(它是从我需要与之交互操作的桌面应用程序导出的 sqlite3 文件),其中包含一些列的 UUID。我在 Xamarin.Forms 应用程序中使用 sqlite-net-pcl,但我不知道如何成功阅读这些专栏。这是我尝试过的:

namespace brahms.Model
{
    [Table("mytable")]
    public class MyTable
    {
        [Column("uuidcolumn")]
        public Guid UUIDColumn { get; }

        [PrimaryKey, AutoIncrement, NotNull]
        [Column("recordid")]
        public int RecordID { get; set; }
    }
}

如何使用 sqlite-net-pcl 读取 uuid 类型的列中的值?

我放弃了使用 sqlite-net-pcl 中的 ORM 功能并使用了这个查询:

db.executeScalar<byte[]>('select hex(uuidcolumn) from mytable where recordid=1');

我得到的是 72 个字节,它似乎代表 Guid 的字符串表示形式中的 36 个 ASCII 字符(通常其中一个字符是 2D,即 -在 ASCII 集中)。所以我认为后备存储是一个 blob,但它存储了 Guid 的文本表示,这很奇怪,但我可以从这里重建 Guid。

使用 this answer 并将该 blob 作为字符串,我最终得到了这个实现:

        public Guid GetUUIDColumn()
        {
            string dbRep = _database.ExecuteScalar<string>("select hex(uuidcolumn) from mytable where recordid = ?", RecordID);
            if (dbRep == null || dbRep == string.Empty) return Guid.Empty;
            var bytes = new byte[dbRep.Length / 2];
            // each pair of bytes represents the ASCII code (in hexadecimal) for a character in the string representation of a Guid.
            for (var i = 0; i < bytes.Length; i++)
            {
                bytes[i] = Convert.ToByte(dbRep.Substring(i * 2, 2), 16);
            }

            string asString = Encoding.ASCII.GetString(bytes);
            return new Guid(asString);  
        }