Поиск по БД

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Andrew_qb
Сообщения: 17
Зарегистрирован: 27 авг 2013, 12:14

Поиск по БД

Сообщение Andrew_qb » 27 авг 2013, 12:21

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

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Поиск по БД

Сообщение Foenix » 27 авг 2013, 12:28

select link from sometable where email like 'andrew@gmail.com'
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Поиск по БД

Сообщение Foenix » 27 авг 2013, 12:31

вместо Like = кажется можно, проверь.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Andrew_qb
Сообщения: 17
Зарегистрирован: 27 авг 2013, 12:14

Re: Поиск по БД

Сообщение Andrew_qb » 27 авг 2013, 13:01

Если честно я не понял, код мне знаком по 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"

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Поиск по БД

Сообщение Foenix » 27 авг 2013, 13:06

в уроке 36 подробно описано это
а лучше и понятнее делать так, как в 37 через rawQuery(запрос к нему я уже написала)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Andrew_qb
Сообщения: 17
Зарегистрирован: 27 авг 2013, 12:14

Re: Поиск по БД

Сообщение Andrew_qb » 27 авг 2013, 15:25

Не получается, возвращает 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();
Что не так?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Поиск по БД

Сообщение Foenix » 27 авг 2013, 15:34

эй-эй.. так не пойдет "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 =?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Поиск по БД

Сообщение Foenix » 27 авг 2013, 15:40

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 медленнее

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

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Andrew_qb
Сообщения: 17
Зарегистрирован: 27 авг 2013, 12:14

Re: Поиск по БД

Сообщение Andrew_qb » 27 авг 2013, 15:59

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");

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Поиск по БД

Сообщение Foenix » 27 авг 2013, 16:12

это ж не java, это sql :)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Andrew_qb
Сообщения: 17
Зарегистрирован: 27 авг 2013, 12:14

Re: Поиск по БД

Сообщение Andrew_qb » 27 авг 2013, 16:23

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'];
    }
}
а тут кабзец какой то))

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Поиск по БД

Сообщение Foenix » 27 авг 2013, 16:33

ну для меня, допустим, это выглядит как иероглифы :)

Поэтому я тебе вначале запрос и написала. Тут же тоже можно почти так же. Вначале составляешь строку, т.е. без вопросиков, просто к строке "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 так все прозрачно)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Поиск по БД

Сообщение KamiSempai » 27 авг 2013, 17:18

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";
...
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Поиск по БД

Сообщение Foenix » 27 авг 2013, 17:50

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

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

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Поиск по БД

Сообщение KamiSempai » 27 авг 2013, 22:59

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

Хотя, с php я немного погорячился. Там mysql_real_escape_string используется, а это нормально.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Поиск по БД

Сообщение Foenix » 28 авг 2013, 00:30

:-D самое смешное, что часто в программах, в которых база это не сильно важная информация, вероятность этого нулевая, а чаще такие ляпсусы случаются по закону Мерфи в каких-нибудь сильно вумных структурах )))
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить