如何使用 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
,但我不知道如何成功阅读这些专栏。这是我尝试过的:
- 使用 sqlite3 命令行,我已经确认架构的相关列类型为
uuid
,并且使用 select count(distinct uuidcolumn) from mytable;
我已经确认每一行都有值。 (该列可以为空,这与下面的代码片段相关,但实际上所有行都具有非空值)
- 我有这个模型对象:
namespace brahms.Model
{
[Table("mytable")]
public class MyTable
{
[Column("uuidcolumn")]
public Guid UUIDColumn { get; }
[PrimaryKey, AutoIncrement, NotNull]
[Column("recordid")]
public int RecordID { get; set; }
}
}
- 如果我使用
database.Query<MyTable>()
查询获取对象,UUIDColumn
总是 等于 Guid.Empty
.
- 我尝试将 class 定义中的类型切换为
Byte[]
;总是 null
.
- 我尝试将 class 定义中的类型切换为
string
;总是 null
.
- 同样适用于
UInt16[]
类型(GUID 可能存储为 16 位字的 blob,因此我也尝试了该类型)
如何使用 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);
}
我有一个我无法控制的数据库架构(它是从我需要与之交互操作的桌面应用程序导出的 sqlite3 文件),其中包含一些列的 UUID。我在 Xamarin.Forms 应用程序中使用 sqlite-net-pcl
,但我不知道如何成功阅读这些专栏。这是我尝试过的:
- 使用 sqlite3 命令行,我已经确认架构的相关列类型为
uuid
,并且使用select count(distinct uuidcolumn) from mytable;
我已经确认每一行都有值。 (该列可以为空,这与下面的代码片段相关,但实际上所有行都具有非空值) - 我有这个模型对象:
namespace brahms.Model
{
[Table("mytable")]
public class MyTable
{
[Column("uuidcolumn")]
public Guid UUIDColumn { get; }
[PrimaryKey, AutoIncrement, NotNull]
[Column("recordid")]
public int RecordID { get; set; }
}
}
- 如果我使用
database.Query<MyTable>()
查询获取对象,UUIDColumn
总是 等于Guid.Empty
. - 我尝试将 class 定义中的类型切换为
Byte[]
;总是null
. - 我尝试将 class 定义中的类型切换为
string
;总是null
. - 同样适用于
UInt16[]
类型(GUID 可能存储为 16 位字的 blob,因此我也尝试了该类型)
如何使用 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);
}