Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Java & Jni. Переопределение функции SQLite / 1 сообщений из 1, страница 1 из 1
11.06.2012, 19:30:01
    #37834618
Denis.Dacko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java & Jni. Переопределение функции SQLite
Столкнулся со следующей проблемой - требуется в приложении для андройда, которое взаимодействует с базой 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
Форумы / Java [игнор отключен] [закрыт для гостей] / Java & Jni. Переопределение функции SQLite / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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