Исключить HTML-теги и некоторые символы UNICODE во время поиска в SQLite

ОБНОВЛЕНИЕ # 4

Я успешно выполнил пример firstchar, но теперь проблема заключается в использовании regex. Даже после включения файла заголовка он не распознает оператор regex. Любая подсказка, как это можно разрешить?

ОБНОВЛЕНИЕ # 2

Я собрал библиотеку sqlite3 в моем проекте. Теперь я ищу кого-нибудь, кто поможет мне написать функцию для моего regex, прикрепить ее к базе данных и вызвать ее из запроса.

ОБНОВЛЕНИЕ # 3

Я написал код из этого примера. Здесь

extern "C"
void
Java_com_kfmwa916_testapp_DatabaseHandler_createFunction() {
    sqlite3 *db;
    //Open database
    sqlite3_open("MyDBName.db", &db);

    //Attach function to database
    sqlite3_create_function(db, "firstchar", 1, SQLITE_UTF8, NULL, &firstchar, NULL, NULL);
}

И firstchar функция есть,

static void firstchar(sqlite3_context *context, int argc, sqlite3_value **argv) {
    if (argc == 1) {
        char *text = (char *) sqlite3_value_text(argv[0]);
        if (text && text[0]) {
            char result[2];
            result[0] = text[0]; result[1] = '\0';
            sqlite3_result_text(context, result, -1, SQLITE_TRANSIENT);
            return;
        }
    }
    sqlite3_result_null(context);
}

И использовал его в моем запросе, например

SELECT firstchar(text) FROM dummy

Но он дает ошибку

no such function firstchar()

Любая помощь приветствуется.

Оригинальный вопрос

Я работаю с арабским языком, сохраненным в формате UNICODE в SQLite. Я хочу выполнить поиск. Но есть проблема.

Скажем, текст

<html>
  <head>
    <style>
      @font-face {
        font-family: "Al_Mushaf";
        src: url('fonts/al_mushaf.ttf');
      }
      @font-face {
        font-family: "Jameel Noori Nastaleeq";
        src: url('fonts/jameel_noori.ttf');
      }
    </style>
  </head>
  
  <body>
    <h3 style='font-family:"Al_Mushaf"'>
            صحابہ کرام کا انبیائے کرام کی سنّت پر عمل
            میٹھے میٹھے اسلامی بھائیو!صدائے مدینہ لگانا انبیائے کِرام عَلَیْہِمُ السَّلَام کی اس قَدْر پیاری سنّت ہے کہ صحابۂ کِرام عَلَیْہِمُ الرِّضْوَان نے بھی اسے خُوب اپنایا اور وہ بھی حضرت سَیِّدُنا داؤد عَلَیْہِ السَّلَام کی طرح اپنے گھر والوں کو جگایا کرتے جیسا کہ حضرت سَیِّدُنا عبد اللہ بن عُمَر رَضِیَاللّٰہُ تَعَالٰی عَنْہُما فرماتے ہیں کہ میرے والِدِ مُحْتَرَم اَمِیرُ الْمُوْمِنِین حضرت سَیِّدُنا عُمَر فَارُوقِ اَعْظَم رَضِیَاللّٰہُ تَعَالٰی عَنْہ رات میں جس قَدْر ربّ تعالیٰ چاہتا،نَماز پڑھتے رہتے،یہاں تک کہ جب رات کا آخری وَقْت ہوتا تو اپنے گھر والوں کو بھی نَماز کے لیے جگا دیتے اور ان سے فرماتے: اَلصَّلٰوة یعنی نماز۔ پھر یہ آیت مُبارَکہ تِلاوَت فرماتے:
            وَاۡمُرْ اَہۡلَکَ بِالصَّلٰوۃِ وَ اصْطَبِرْ عَلَیۡہَا ؕ لَا نَسْـَٔلُکَ رِزْقًا ؕ نَحْنُ نَرْزُقُکَ ؕ وَالْعٰقِبَۃُ لِلتَّقْوٰی (پ۱۶،طٰهٰ:۱۳۲)
    </h3>
  </body>
  
</html>

Ответ 1

Ответ на исходный вопрос

ПРИМЕЧАНИЕ. Как я недавно узнал, я, возможно, ошибаюсь во многих местах, любезно исправляю свои ошибки.

Существует два решения

  • Использовать REGEXP Оператор с SQLite Query
  • Реализация собственной пользовательской функции с помощью NDK

Проблема с первым заключается в том, что он возвращает либо true, либо false, но мне нужны данные. И проблема с обоими методами заключается в том, что вы должны использовать C/С++ Library в своем Android-проекте. Поэтому я решил создать свою собственную пользовательскую функцию.

Вы можете найти много руководств по использованию NDK в своем проекте, но не найдете полного примера использования сторонних библиотек в вашем проекте.

После большого поиска/изучения я объединил вещи из разных мест и смог выполнить свою задачу. Ниже приведены некоторые шаги о том, как вы можете это сделать. Я также намерен написать полный пошаговый учебник.

Подготовка к работе

  • Сначала вам нужны библиотеки, которые вы хотите использовать в своем проекте. В моем случае мне нужна sqlite3 объединенная библиотека, которую можно загрузить с здесь. Извлеките их в папку cpp вашего проекта.
  • Возможно, вы уже знакомы с файлом CMakeLists.txt, когда вы включили NDK в свой проект. Пора добавить эти библиотеки в файл CMakeLists.txt. Для этого перейдите в панель Project, вы увидите там External Build Files и внутри него вы увидите нужный файл. Откройте его и отредактируйте следующим образом.

# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds it for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             # Associated headers in the same location as their source
             # file are automatically included.
             src/main/cpp/native-lib.cpp )

include_directories(${CMAKE_SOURCE_DIR}/src)
add_library(sqlite3 STATIC src/main/cpp/sqlite3.c src/main/cpp/sqlite3.h src/main/cpp/sqlite3ext.h)
add_executable(sqlite src/main/cpp/sqlite3.c src/main/cpp/sqlite3.h src/main/cpp/sqlite3ext.h)
set_target_properties(sqlite PROPERTIES OUTPUT_NAME sqlite3)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because system libraries are included in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.


find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in the
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       sqlite3
                       log )