powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Java & Jni. Переопределение функции SQLite
1 сообщений из 1, страница 1 из 1
Java & Jni. Переопределение функции SQLite
    #37834618
Denis.Dacko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся со следующей проблемой - требуется в приложении для андройда, которое взаимодействует с базой sqlite организовать регистронезависимый поиск (для кирилицы данный функционал в like отсутствует).

Решил переопределить функцию upper(), т.е чтобы была возможность сделать нечто подобное:
cursor = database.rawQuery("SELECT name FROM tableF WHERE upperCase(name) like upperCase( ...", null);

Подтолкнула на эту идею вот эта ссылка:
Android. Is it posible to write custom function on C/C++ and use it in SQL query?

Написал следующий wrapper (udf.c), но в этом случае upperCase вызывается как обычная функция, а не как sql команда:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
	....
void
Java_com_application_name_DataHelper_execUpper(JNIEnv* env, jobject obj, jstring s)

	char out[256] = { 0 };
	int rc, i;
	char query[256];
	sqlite3 *db;
	char * errmsg;
	char *sql[] = {"select upperCase(\"teSt\")"}; // запрос из java-кода получаемый через аргумент s

	rc = sqlite3_open("bd.sqlite", &db);

	sqlite3_create_function(db, "upperCase", 1, SQLITE_UTF8, 0, &upperCase, 0, 0 ); //регистрация функции
	sqlite3_exec(db, sql[0], callback, NULL, &errmsg); //выполнение sql запроса

    return;

}

static void upperCase(sqlite3_context* cx, int cnt, sqlite3_value** v)
{
	char * szDst = NULL;
	int    iDstLen = 0;
	const char* arg0 = (const char*)sqlite3_value_text( v[0] );
	utf8upstr(arg0, sizeof(arg0), &szDst, &iDstLen);*/
    	sqlite3_result_text( cx, szDst, utf8strlen(szDst), 0 );
	....
}



class DataHelper:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
	....
        static native String upperCase();
	
	static {

        System.loadLibrary("UDF"); // сишный код моего враппера
        System.loadLibrary("sqlite");  //подключение sqlite - {sqlite3.h, sqlite3.c}
        ....
    }



Собственно сам вопрос, что можно сделать, чтобы функция воспринималась на sql команда? Заранее спасибо
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Java & Jni. Переопределение функции SQLite
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]