Sqlite 使用CreateTable(CreateFlags.FullTextSearch4)不会自动递增PK
我正在Visual Studio 2015上使用Xamarin和此SQLite插件: 以下是我的算法和对问题的解释:Sqlite 使用CreateTable(CreateFlags.FullTextSearch4)不会自动递增PK,sqlite,xamarin,fts4,Sqlite,Xamarin,Fts4,我正在Visual Studio 2015上使用Xamarin和此SQLite插件: 以下是我的算法和对问题的解释: public class MyModel { [PrimaryKey, AutoIncrement] public int _id { get; set; } public string bla { get; set; } public string ble { get; set; } public MyModel() {
public class MyModel
{
[PrimaryKey, AutoIncrement]
public int _id { get; set; }
public string bla { get; set; }
public string ble { get; set; }
public MyModel()
{
}
}
然后:
上面的代码为insertCount和item返回1。\u id总是按其应该的方式更新。
但是当我稍后查询表时,所有行的_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标志的表,则没有问题。但是我不能做匹配搜索
感谢,主要称为虚拟表,是一种扩展模块,允许用户使用内置全文索引创建特殊表
它忽略除列名以外的所有内容,例如自动递增、主键、唯一、甚至整数。FTS表的所有内容都是文本。
此表有一个名为rowid的privaterow。它的行为方式与普通SQLite表的rowid列相同,只是FTS表的rowid列中存储的值保持不变
从选定行获取和标识的唯一方法是执行以下操作:
select rowid,* from thetable
如果尝试在公共SQLite net查询中执行此操作,则不会获得rowid
SQLite表方案:
可能的解决办法:
1-在你的情况下,我不知道你是否真的需要这个Id。但是你可以删除它,如果它与查询无关的话。是的,我知道你在问题中发布了
2-插入行时,只需添加一个新列并在其中放置一些标识行的信息
3-SQLite net不允许您使用IDataReader进行查询和解析结果。因此,您可以使用另一个允许解析查询结果以获取rowid的android和ios
4-不要使用FTS表。使用普通表并进行如下查询:
var query = conn.Table<MyModel>().Where(v => v.bla.Contains("mystring"));
搞定了。我的解决方案是添加一个由我自己创建的字符串id,并将其设置为pk。
var query = conn.Table<MyModel>().Where(v => v.bla.Contains("mystring"));