【问题标题】:Using CreateTable<T>(CreateFlags.FullTextSearch4) doesn't auto increment PK使用 CreateTable<T>(CreateFlags.FullTextSearch4) 不会自动增加 P​​K
【发布时间】:2016-10-14 14:12:12
【问题描述】:

我在 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 搜索。

谢谢

【问题讨论】:

    标签: sqlite xamarin fts4


    【解决方案1】:

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

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

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

    select rowid,* from thetable
    

    如果您尝试在常见的 SQLite-net 查询中执行此操作,您将无法获得 rowid

    SQLite 表方案:

    可能的解决方案:

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

    2 - 您只需添加一个新列,并在插入时在其中放置一些标识该行的信息。

    3 - SQLite-net 不允许您使用 IDataReader 进行查询和解析结果。所以你可以使用另一个library(android和ios)来解析查询结果以获取rowid

    4 - 不要使用 FTS 表。使用普通表并查询如下内容:

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

    【讨论】:

    • 成功了。我的解决方案是添加一个自己创建的字符串id并设置为pk。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    相关资源
    最近更新 更多