gpt4 book ai didi

sqlite - 使用 CreateTable(CreateFlags.FullTextSearch4) 不会自动增加 P​​K

转载 作者:行者123 更新时间:2023-12-03 15:45:49 26 4
gpt4 key购买 nike

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

谢谢

最佳答案

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

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

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

select rowid,* from thetable

如果您尝试在普通 SQLite-net 查询中执行此操作, 你不会得到 rowid .

SQLite 表方案:

enter image description here

可能的解决方案:

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

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

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

4 - 不要使用 FTS 表。使用普通表并查询如下内容:
var query = conn.Table<MyModel>().Where(v => v.bla.Contains("mystring"));

关于sqlite - 使用 CreateTable<T>(CreateFlags.FullTextSearch4) 不会自动增加 P​​K,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com