SQLite 网络 PCL; C# Int64/long 到 SQLite INTEGER

SQLite-net PCL; C# Int64/long to SQLite INTEGER

我在 Visual Studio 2013 使用 Xamarin,SQLite-net PCL 版本 1.0.11 (https://www.nuget.org/packages/sqlite-net-pcl/).

基本上我有兴趣在 SQLite table 中存储一个大于 2,147,483,647 的数值,其中 field/column 通过 ORM 具有 class 的 [PrimaryKey, AutoIncrement] 修饰。

下面的 class 确实创建了 table,并且插入值(行)工作正常:

public class Patient
{
    [PrimaryKey, AutoIncrement, Column("PATIENT_NBR")]
    public int PatientNumber { get; set; }
    ...
}

下面的两个 class 在将 "long" 或 "Int64" 与 PrimaryKey 和 AutoIncrement 结合使用时不会创建 table:

public class Patient
{
    [PrimaryKey, AutoIncrement, Column("PATIENT_NBR")]
    public long PatientNumber { get; set; }
    ...
}

public class Patient
{
    [PrimaryKey, AutoIncrement, Column("PATIENT_NBR")]
    public Int64 PatientNumber { get; set; }
    ...
}

在上面的最后两个示例中 - 当 运行创建 CreateTable 时:

public class CreateDatabase
{
    private readonly SQLiteConnection conn;
    public CreateDatabase()
    {
        try
        {
            conn = DependencyService.Get<ISQLite>().GetConnection(Constants.DatabaseName);
            conn.CreateTable<Patient>();

            if (conn.Table<Patient>().Count() == 0)
            {
                conn.Insert(new Patient { PatientCreateDate = DateTime.UtcNow, PatientFirstName = "John", PatientLastName = "Doe" });
                conn.Insert(new Patient { PatientCreateDate = DateTime.UtcNow, PatientFirstName = "Jane", PatientLastName = "Doe" });
            }
        }
        catch (Exception ex)
        {
            throw new Exception(string.Format("Create SQLite Connection. Error: {0}.", ex.Message));
        }
    }
}

我收到异常: ex.Message: "AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY"

如果我从 PatientNumber 的修饰中删除 AutoIncrement,它会创建 table 正常,但随后我 运行 进入约束错误,因为插入 PatientNumber 的值始终为 0(因为未使用 AutoIncrement),并且该字段被定义为 PrimaryKey 并且必须是唯一的。

基于为 SQLite-net 打开的问题:

https://github.com/praeclarum/sqlite-net/issues/227

参考以下内容被撤销:

https://github.com/praeclarum/sqlite-net/pull/345

(抱歉上面的两个 link - 它不会让我 post 他们)

在上面的最后一个 link 中,它提到了一个解决方法:

conn.ExtraTypeMappings.Add(typeof(int64), "integer")

但我不确定在哪里添加它。我尝试在分配 "conn" 的位置下方添加它,但出现编译器错误: "SQLite.SQLiteConnection does not contain a definition for "ExtraTypeMapping".

我的理解是,尽管 SQLite 可以存储最大为 9223372036854775807 的数值,但我会受到类型为 "Int" 或 [=58= 的 C# class 字段修饰的限制],因为它的最大值是 2,147,483,647。

我是不是遗漏了什么,或者我误解了什么??

如有任何帮助,我们将不胜感激。

您是否混淆了您想要的 PCL? SQLite-net 对比 SQLite.net 对比?那里有大量的 sqlite 变体。 ;-)

您正在拉取 SQLite-net PC nuget,因此获得了 2015 年 1 月 22 日发布的 SQLite-net PCL 1.0.11

您引用的补丁已于 2015 年 3 月 4 日合并:

praeclarum merged commit 1638293 into praeclarum:master on Mar 4

如果那是你想要的库,拉主分支(头或刚刚提交)和 build/use 而不是 Nuget。

或使用 SqLiteConnection.ExtraTypeMappings,也许您正在寻找 oysteinkrog/SQLite.Net-PCL 版本?:

Line 94 of SqLiteConnection.cs