Страница 1 из 1

Поиск по БД

Добавлено: 27 авг 2013, 12:21
Andrew_qb
Есть БД в ней три столбца id, email, link, не могу понять как найти в базе нужную строку по введённому email и вывести значение из link, упираюсь на пример:
Урок 34. Хранение данных. SQLite
Прошу помочь))

Re: Поиск по БД

Добавлено: 27 авг 2013, 12:28
Foenix
select link from sometable where email like 'andrew@gmail.com'

Re: Поиск по БД

Добавлено: 27 авг 2013, 12:31
Foenix
вместо Like = кажется можно, проверь.

Re: Поиск по БД

Добавлено: 27 авг 2013, 13:01
Andrew_qb
Если честно я не понял, код мне знаком по php, но не соображу какой синтаксис должен быть в java, вот что делаю щас

Код: Выделить всё

                Log.d(LOG_TAG, "--- Search by Email ---");
                columns = new String[] { "link" };
                c = db.query("mytable", columns, null, null, "email", null, null);
                int nameColIndex = c.getColumnIndex("link");
                Log.d(LOG_TAG, "Output" + c.getString(nameColIndex));
Туда иду хоть нет?
"с - это Cursor"

Re: Поиск по БД

Добавлено: 27 авг 2013, 13:06
Foenix
в уроке 36 подробно описано это
а лучше и понятнее делать так, как в 37 через rawQuery(запрос к нему я уже написала)

Re: Поиск по БД

Добавлено: 27 авг 2013, 15:25
Andrew_qb
Не получается, возвращает 0 rows В базе есть 123.
Вот что в обработчике кнопки:

Код: Выделить всё

                Log.d(LOG_TAG, "--- INNER JOIN with rawQuery---");
                String sqlQuery = "select name from mytable where email like '123' = ?";
                c = db.rawQuery(sqlQuery, new String[]{"123"});
                if (c.moveToFirst()) {
                    int nameColIndex = c.getColumnIndex("name");

                    do {
                        Log.d(LOG_TAG, "name = " + c.getString(nameColIndex));
                    } while (c.moveToNext());
                } else
                    Log.d(LOG_TAG, "0 rows");
                c.close();
Что не так?

Re: Поиск по БД

Добавлено: 27 авг 2013, 15:34
Foenix
эй-эй.. так не пойдет "select name from mytable where email like '123' = ?";
либо так select name from mytable where email like '123'
либо так попробуй select name from mytable where email = '123'
если у тебя с вопросиками, то так
select name from mytable where email like ?
или так
select name from mytable where email =?

Re: Поиск по БД

Добавлено: 27 авг 2013, 15:40
Foenix
like - это оператор сравнения строк, при котором можно использовать подстановки типа
SELECT FROM table_name
WHERE column LIKE 'XXXX%'

or

SELECT FROM table_name
WHERE column LIKE '%XXXX%'

or

SELECT FROM table_name
WHERE column LIKE 'XXXX_'

or

SELECT FROM table_name
WHERE column LIKE '_XXXX'

or

SELECT FROM table_name
WHERE column LIKE '_XXXX_'
где % это любые символы, а_ это 1 символ

= работает быстрее, like медленнее

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

Re: Поиск по БД

Добавлено: 27 авг 2013, 15:59
Andrew_qb
Foenix писал(а): select name from mytable where email like ?
или так
select name from mytable where email =?
Вот эти два робят))
Как всё сложно в этом java!((
ужс!
В общем остановился на варианте вот таком

Код: Выделить всё

                String sqlQuery = "select name from mytable where email =?";
                c = db.rawQuery(sqlQuery, new String[]{searchText.getText().toString()});
                if (c.moveToFirst()) {
                    int nameColIndex = c.getColumnIndex("name");

                    do {
                        Log.d(LOG_TAG, "name = " + c.getString(nameColIndex));
                    } while (c.moveToNext());
                } else
                    Log.d(LOG_TAG, "0 rows");

Re: Поиск по БД

Добавлено: 27 авг 2013, 16:12
Foenix
это ж не java, это sql :)

Re: Поиск по БД

Добавлено: 27 авг 2013, 16:23
Andrew_qb
Foenix писал(а):это ж не java, это sql :)
вот на php там всё прозрачно

Код: Выделить всё

if (isset($_POST['search'])) {
    $query = "SELECT `link` FROM `$userstable` where `email` = '" . mysql_real_escape_string($_POST['search']) . "' limit 1";
    $result = mysql_query($query) or trigger_error(mysql_errno() . ' ' . mysql_error() . ' query: ' . $sql);

    if (!mysql_num_rows($result)) {
        echo "В базе нет такого email: {$_POST['search']}";
    } else {
        $result = mysql_fetch_assoc($result);
        echo $result['link'];
    }
}
а тут кабзец какой то))

Re: Поиск по БД

Добавлено: 27 авг 2013, 16:33
Foenix
ну для меня, допустим, это выглядит как иероглифы :)

Поэтому я тебе вначале запрос и написала. Тут же тоже можно почти так же. Вначале составляешь строку, т.е. без вопросиков, просто к строке "select name from mytable where email =" добавляешь свою строку с email searchText.getText().toString()
"select name from mytable where email ="+searchText.getText().toString()
а потом все это сразу загоняешь в rawQuery: rawQuery(sqlQuery, null)

Способ еще чем хорош? да тем, что когда запрос сложный, да на несколько таблиц, можно всю эту подготовленную строку выдать в лог и запустить в каком-нибудь sql-мэнеджере на своей базе. Да и вообще видно сразу что не так. Сомневаюсь, что это в php так все прозрачно)

Re: Поиск по БД

Добавлено: 27 авг 2013, 17:18
KamiSempai
Foenix писал(а):"select name from mytable where email ="+searchText.getText().toString()
Зачем человека плохому учишь?

С php примером, кстати, та-же проблема.
Andrew_qb писал(а):

Код: Выделить всё

...
    $query = "SELECT `link` FROM `$userstable` where `email` = '" . mysql_real_escape_string($_POST['search']) . "' limit 1";
...

Re: Поиск по БД

Добавлено: 27 авг 2013, 17:50
Foenix
это совершенно не плохо, я это для целей тестирования писала. Да, могут быть оказии ;) но это уж при совсем странных обстоятельствах.

кстати, я забыла, можно воспользоваться queryBuilder-ом и тогда оттуда выносить в лог query, это тоже удобно.

Re: Поиск по БД

Добавлено: 27 авг 2013, 22:59
KamiSempai
Foenix писал(а):Да, могут быть оказии ;) но это уж при совсем странных обстоятельствах.
Если какой-нибудь шутник сделает sql инъекцию и похерит всю базу - это уже не оказия.

Хотя, с php я немного погорячился. Там mysql_real_escape_string используется, а это нормально.

Re: Поиск по БД

Добавлено: 28 авг 2013, 00:30
Foenix
:-D самое смешное, что часто в программах, в которых база это не сильно важная информация, вероятность этого нулевая, а чаще такие ляпсусы случаются по закону Мерфи в каких-нибудь сильно вумных структурах )))