使用 CreateTable<T>(CreateFlags.FullTextSearch4) 不会自动递增 PK
Using CreateTable<T>(CreateFlags.FullTextSearch4) doesn't auto increment PK
我在 Visual Studio 2015 上使用 Xamarin 和这个 SQLite 插件:https://github.com/praeclarum/sqlite-net
这是我的算法和问题的解释:
public class MyModel
{
[PrimaryKey, AutoIncrement]
public int _id { get; set; }
public string bla { get; set; }
public string ble { get; set; }
public MyModel()
{
}
}
然后:
conn.CreateTable<MyModel>(CreateFlags.FullTextSearch4);
var item = new MyModel();
var insertCount = conn.Insert(item);
上面 returns 1 的代码用于 insertCount 和 item._id 总是按应有的方式更新。
但是当我稍后查询 table 时,所有行的 _id 始终为 0。例如:
var tokens = mySearchBar.Text;
string query = "SELECT * FROM MyModel WHERE MyModel MATCH '" + tokens + "'";
List<MyModel> result = conn.Query<MyModel>(query);
这似乎有效但感觉不对,它似乎没有返回所有可能的结果。但主要问题是它为每个 _id 返回 0。我可以通过以下方式查看:
var bli = conn.Query<MyModel>("SELECT * FROM MyModel");
所有行 _id 都是 0。知道为什么以及如何解决它吗?
如果我在没有 fts4 标志的情况下创建 table,我没有问题。但是我无法进行 MATCH 搜索。
谢谢
Full Text Search Table,主要称为虚拟 Table,是允许用户创建具有内置全文索引的特殊 table 的扩展模块。
它忽略除列名以外的所有内容(例如自动递增、主键、唯一性,甚至整数)。 FTS table 的所有内容都只是文本。
这个 table 有一个名为 rowid
的私有行。它的行为方式与普通 SQLite table 的 rowid
列相同,只是 FTS table 的 rowid 列中存储的值保持不变。
从选定行获取 ID 的唯一方法是:
select rowid,* from thetable
如果您尝试在常见的 SQLite-net 查询中执行此操作,您将不会获得 rowid。
SQLite table 方案:
可能的解决方案:
1 - 在你的情况下,我不知道你是否真的需要这个 Id。但是你可以删除它,如果它对查询无关紧要(是的,我知道你在问题中发帖)。
2 - 您可以添加一个新列,并在插入时放置一些标识该行的信息。
3 - SQLite-net 不允许您使用 IDataReader 进行查询和解析结果。因此,您可以使用另一个 library(android 和 ios)来解析查询结果以获得 rowid
.
4 - 不要使用 FTS table。使用正常的 table 并查询如下内容:
var query = conn.Table<MyModel>().Where(v => v.bla.Contains("mystring"));
我在 Visual Studio 2015 上使用 Xamarin 和这个 SQLite 插件:https://github.com/praeclarum/sqlite-net
这是我的算法和问题的解释:
public class MyModel
{
[PrimaryKey, AutoIncrement]
public int _id { get; set; }
public string bla { get; set; }
public string ble { get; set; }
public MyModel()
{
}
}
然后:
conn.CreateTable<MyModel>(CreateFlags.FullTextSearch4);
var item = new MyModel();
var insertCount = conn.Insert(item);
上面 returns 1 的代码用于 insertCount 和 item._id 总是按应有的方式更新。 但是当我稍后查询 table 时,所有行的 _id 始终为 0。例如:
var tokens = mySearchBar.Text;
string query = "SELECT * FROM MyModel WHERE MyModel MATCH '" + tokens + "'";
List<MyModel> result = conn.Query<MyModel>(query);
这似乎有效但感觉不对,它似乎没有返回所有可能的结果。但主要问题是它为每个 _id 返回 0。我可以通过以下方式查看:
var bli = conn.Query<MyModel>("SELECT * FROM MyModel");
所有行 _id 都是 0。知道为什么以及如何解决它吗?
如果我在没有 fts4 标志的情况下创建 table,我没有问题。但是我无法进行 MATCH 搜索。
谢谢
Full Text Search Table,主要称为虚拟 Table,是允许用户创建具有内置全文索引的特殊 table 的扩展模块。
它忽略除列名以外的所有内容(例如自动递增、主键、唯一性,甚至整数)。 FTS table 的所有内容都只是文本。
这个 table 有一个名为 rowid
的私有行。它的行为方式与普通 SQLite table 的 rowid
列相同,只是 FTS table 的 rowid 列中存储的值保持不变。
从选定行获取 ID 的唯一方法是:
select rowid,* from thetable
如果您尝试在常见的 SQLite-net 查询中执行此操作,您将不会获得 rowid。
SQLite table 方案:
可能的解决方案:
1 - 在你的情况下,我不知道你是否真的需要这个 Id。但是你可以删除它,如果它对查询无关紧要(是的,我知道你在问题中发帖)。
2 - 您可以添加一个新列,并在插入时放置一些标识该行的信息。
3 - SQLite-net 不允许您使用 IDataReader 进行查询和解析结果。因此,您可以使用另一个 library(android 和 ios)来解析查询结果以获得 rowid
.
4 - 不要使用 FTS table。使用正常的 table 并查询如下内容:
var query = conn.Table<MyModel>().Where(v => v.bla.Contains("mystring"));