为了账号安全,请及时绑定邮箱和手机立即绑定

带有致命信号 11 (SIGSEGV) 错误的正则表达式查询

带有致命信号 11 (SIGSEGV) 错误的正则表达式查询

莫回无 2022-05-25 16:13:23
我正在使用 couchbase lite 版本android-ee:2.1.2。我将一些数据存储在本地 couchbase lite 数据库中。现在,我正在尝试借助正则表达式查询从本地 couchbase lite 数据库中查询数据,例如,Query query = QueryBuilder                .select(SelectResult.property("info"))                .from(DataSource.database(localDatabase))                .where(Expression.property("info").regex(Expression.string("^v" + "_" + "(4.6.2|1.7.7)" + "_" + "[123]" + "_" + "[12345678]")));我的数据库看起来像,v_1.7.7_1_3v_1.7.5_1_3v_4.7.1_2_8v_4.7.1_1_8v_4.7.2_2_8v_4.7.2_2_8v_4.7.1_1_8v_4.7.1_2_8v_4.7.5_1_8v_4.9.3_1_1.........and so on many entries为了理解数据库结构,让我们举个例子,v_1.7.7_1_3这里v可以定义为一个 just 值,1.7.7是标签然后1是父类(这可以是 1,2 和 3 类型)然后3是子类(这可以是 1,2 类型,3,4,5,6,7 和 8)。现在用户可以选择多个标签、父类和子类作为选择。然后我必须根据分别选择的参数从本地 couchbase lite 查询数据。目前,正如我上面所说,我正在尝试在正则表达式的帮助下查询数据,例如,让用户选择标签4.6.2和1.7.7,那么父类是 1,2 和 3,然后是子类 1-8。所以我的查询会像,"^v" + "_" + "(4.6.2|1.7.7)" + "_" + "[123]" + "_" + "[12345678]"我已经在https://regex101.com上尝试过这个查询,它运行良好,但不适用于 couchbase lite。尽管应用程序只是因致命错误而崩溃,A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 25543 (.mains.activity)这里有一些日志,V/Query: Query encoded as {"WHAT":[[".info"]],"WHERE":["regexp_like()",[".info"],"^v_(4.6.2|1.7.7)_[123]_[12345678]"]}I/LiteCore [Query]: {Query#3}==> N8litecore11SQLiteQueryE 0x7f5a2d9098I/LiteCore [Query]: {Query#3} Compiling JSON query: {"WHAT":[[".info"]],"WHERE":["regexp_like()",[".info"],"^v_(4.6.2|1.7.7)_[123]_[12345678]"]}I/LiteCore [Query]: {Query#3} Compiled as SELECT fl_result(fl_value(body, 'info')) FROM kv_default WHERE (regexp_like(fl_value(body, 'info'), '^v_(4.6.2|1.7.7)_[123]_[12345678]')) AND (flags & 1) = 0A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 28308 (.mains.activity)
查看完整描述

2 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

在 couchbase lite 上工作和研究了几个小时后,我得到了这个。首先,正则表达式查询没有任何问题,它工作正常。

第二个是在检查我的数据库时,我意识到我正在查询数据的信息字段在某些数据库条目中是 EMPTY 或 NULL。所以我在查询中添加了一个条件,例如,

Expression.property("info").notNullOrMissing()

因此,当信息可用时,我正在执行我的正则表达式查询,

.where(Expression.property("info").notNullOrMissing().and(Expression.property("info").regex(Expression.string("^v" + "_" + "(4.6.2|1.7.7)" + "_" + "[123]" + "_" + "[12345678]"))))

它运行良好,没有任何致命的信号错误或任何东西。

注意: -另一件事是我的数据库中的信息字段被定义为索引,所以也许我正在查询索引字段上的数据并且它变得空或为空,这就是我收到致命信号错误的原因(我仍在搜索,是这个逻辑正确与否。)


查看完整回答
反对 回复 2022-05-25
?
跃然一笑

TA贡献1826条经验 获得超6个赞

我认为,您的正则表达式查询似乎很好。您可以使用以下单元测试用例进行验证。


@Test

public void testRegex() throws Exception {

    MutableDocument doc1 = new MutableDocument("doc1");

    doc1.setValue("version", "v_1.7.7_1_3");

    db.save(doc1);


    MutableDocument doc2 = new MutableDocument("doc2");

    doc2.setValue("version", "v_1.7.5_1_3");

    db.save(doc2);


    MutableDocument doc3 = new MutableDocument("doc3");

    doc3.setValue("version", "v_4.7.1_2_8");

    db.save(doc3);


    MutableDocument doc4 = new MutableDocument("doc4");

    doc4.setValue("version", "v_4.7.1_1_8");

    db.save(doc4);


    MutableDocument doc5 = new MutableDocument("doc5");

    doc5.setValue("version", "v_4.7.2_2_8");

    db.save(doc5);


    MutableDocument doc6 = new MutableDocument("doc6");

    doc6.setValue("version", "v_4.6.2_2_8");

    db.save(doc6);


    Query q = QueryBuilder

            .select(SelectResult.property("version"))

            .from(DataSource.database(db))

            .where(Expression.property("version").regex(Expression.string("^v" + "_" + "(4.6.2|1.7.7)" + "_" + "[123]" + "_" + "[12345678]")));


    List<Result> results = q.execute().allResults();

    // since the doc1 and doc6 passes the regex. 

    assertEquals(results.size(), 2);

}


查看完整回答
反对 回复 2022-05-25
  • 2 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信