由于 Android 7.0 SQlite 问题,我最近从 SQLite.NET 迁移到 SQLite-net-pcl。
在此过程中,我更新了所有库,并且在插入/删除等方面一切正常。
我遇到的唯一问题是,每次从数据库检索项目时,它的 ID 始终为 0。这会导致更新项目时出现问题。有人遇到过这个问题吗?
[SQLite.PrimaryKey, SQLite.AutoIncrement]
public int ID { get; set; }
public string objectId { get; set; }
public DateTime createdAt { get; set; }
public DateTime updatedAt { get; set; }
public string Title { get; set; }
提前致谢。
请尝试使用这个,这对我有用
使用 SQLite.Net.Attributes;
[PrimaryKey, AutoIncrement]
public int? Id { get; set; }
几乎有同样的情况。 所有行返回 id 为 0
class ToDo : Java.Lang.Object
{
[PrimaryKey, AutoIncrement]
public int ID { get; }
除了我只是忘了打字设置;在属性中。
可以帮助解决此类问题的人的一件事是使用 GetMapping() 方法获取有关使用 CreateTable() 创建表时使用的映射的一些信息。 例如:
Toast.MakeText(this, db.GetMapping<ToDo>().TableName.ToString(), ToastLength.Long).Show();
Toast.MakeText(this, db.GetMapping<ToDo>().HasAutoIncPK.ToString(), ToastLength.Long).Show();
使用这个我发现我的桌子上没有设置自动增量(HasAutoIncPK = false)。
查看您是否使用方法
CreateComand(query)
和 ExecuteNonQuery()
创建了表。如果是这种情况,请使用 CreateTable<Type>()
方法创建表。通过上述方法在建表时初始化主键和自增属性
我一直在这里遇到同样的问题。
我手动创建表以保证更顺利的更新过程,而不是使用可用的
CreateTable
方法。
我最终偶然发现的修复是我的主键列使用了错误的数据类型。
定义错误
[RecordIndexId] int PRIMARY KEY NOT NULL
正确定义
[RecordIndexId] integer PRIMARY KEY NOT NULL
添加一点上下文,
int
和 integer
数据类型之间存在很大差异。 在此答案中进行了解释
确保您没有将 InsertOrReplace 与 AutoIncrement 主键一起使用。它总是会覆盖 id 为 0 的项目,并且永远不会插入新的项目。 -redent84
所有数据库条目都需要使用
await _database.InsertAsync(myClass);
添加
这是一条评论,而不是一个答案,所以我想把它作为一个评论,以防它在评论中被遗漏。它节省了我很多时间和压力。谢谢redent84。
我的问题是我的 ID 属性设置器有一个内部集。这必须公开才能正常工作。
我会将其添加为评论,但可惜...我没有足够的代表。