我在SQLite
中有一个包含大约1600行的表格,每行包含HTML
页面以显示在WebView
中。我必须实现这样的搜索,搜索时应忽略HTML
个标记。为此,我导入了sqlite3
库并创建了我自己的用户定义函数strip_text
,它使用regex
忽略了标记。
static void strip_text(sqlite3_context *context, int argc, sqlite3_value **argv) {
if(argc == 1) {
//__android_log_print(ANDROID_LOG_VERBOSE, "TAG", "inside strip_text");
char *result = (char *) sqlite3_value_text(argv[0]);
std::string text(result);
std::regex my_regex("REGEX");
if (!text.empty()) {
text = std::regex_replace(text, my_regex, "");
sqlite3_result_text(context, text.c_str(), -1, SQLITE_TRANSIENT);
return;
}
}
sqlite3_result_null(context);
}
我的查询功能如下。
std::list<int> get_page_list(std:: string q) {
std::string query = "SELECT page_no FROM bahar_e_shariat WHERE LIKE('%" + q + "%', strip_text(page_text))=1";
__android_log_print(ANDROID_LOG_VERBOSE, "TAG", "%s", query.c_str());
std::list<int> pages_list;
sqlite3 *db;
//Open database
__android_log_print(ANDROID_LOG_VERBOSE, "TAG", "Opening database");
int rc = sqlite3_open("/data/data/com.dawateislami.bahareshariat/databases/Books.db", &db);
//It'll be good to check 'rc' for error(s).
rc = sqlite3_create_function(db, "strip_text", 1, SQLITE_ANY, NULL, &strip_text, NULL, NULL);
sqlite3_stmt * stmt;
rc = sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, NULL);
while(1) {
int s = sqlite3_step(stmt);
if(s == SQLITE_ROW) {
pages_list.push_front(sqlite3_column_int(stmt, 0));
__android_log_print(ANDROID_LOG_VERBOSE, "TAG", "Found in %d", sqlite3_column_int(stmt, 0));
} else if(s == SQLITE_DONE) break;
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return pages_list;
}
问题
现在的问题是它开始搜索并在搜索大约8到9条记录后,应用程序崩溃并出现错误
A/libc: Fatal signal 11 (SIGSEGV), code 2, fault addr 0x7f84630ff0 in tid 28988 (Thread-6559)
参考一些答案,我添加了android:hardwareAccelerated="false"
,但它没有用。
我无法弄清楚问题。谁能告诉我这里发生了什么?
更新
当我在Infininx Note 3 Pro上进行测试时,它无法正常工作,但它正在使用三星Galaxy S4。