2016-06-14 34 views
2

我使用Xamarin上的Visual Studio 2015年本SQLite的插件:https://github.com/praeclarum/sqlite-net使用CREATETABLE <T>(CreateFlags.FullTextSearch4)不会自动增量PK

这里是我的问题的算法,并解释:

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); 

以上代码为insertCount返回1和item._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标志的表,我没有任何问题。但是,我不能做MATCH搜索。

感谢

回答

3

Full Text Search Table,主要是被称为虚拟表,是扩展模块,允许用户创建特殊表与一个内置的全文索引。

它会忽略除列名(例如自动增量,主键,唯一性,甚至整数)以外的所有内容。 FTS表的所有内容都只是文本。 此表有一个名为rowid的私有服务器。除了存储在FTS表的rowid列中的值保持不变之外,其行为与普通SQLite表的rowid列相同。

获得的唯一方法和id从选定的行是这样做的:

select rowid,* from thetable 

如果试图这样做在一个共同的SQLite网查询,你不会得到ROWID

SQLite表方案:

enter image description here

可能的解决方案:

1 - 你的情况我不知道,如果你真的需要的ID。但是你可以删除它,如果这对查询无关紧要(是的,我知道你在问题中发布了)。

2 - 您可以添加一个新列,并在其中插入一些标识行的信息。

3 - SQLite-net不允许您使用IDataReader执行查询并解析结果。所以你可以使用另一个library(android和ios),它允许解析查询结果来得到rowid

4 - 不要使用FTS表。使用正常的表格,并像这样查询:

var query = conn.Table<MyModel>().Where(v => v.bla.Contains("mystring")); 
+2

钉住它。我的解决方案是添加一个由我自己创建的字符串ID并将其设置为pk。 – Dpedrinha