使用CreateTable <t>(CreateFlags.FullTextSearch4)不会自动增加PK

时间:2016-06-14 02:15:54

标签: sqlite xamarin fts4

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

上面的代码为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搜索。

由于

1 个答案:

答案 0 :(得分:3)

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

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

从选定行获取和id的唯一方法是:

select rowid,* from thetable

如果您尝试在常见的SQLite-net查询中执行此操作,您将无法获得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"));