Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 28 май 2017, 21:40

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 74 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: 28 ноя 2011, 03:00 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1329
Благодарил (а): 0 раз.
Поблагодарили: 72 раз.
В этом уроке:

- читаем данные из связанных таблиц
- используем rawQuery

Click here to read this article!

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Последний раз редактировалось damager82 01 май 2017, 16:41, всего редактировалось 5 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 янв 2012, 12:00 

Зарегистрирован: 10 янв 2012, 11:53
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Здравствуйте!
такой вопрос.

Вы закрываете базу dbh.close(); а нужно ли закрывать db.close(); ???

Спасибо!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 янв 2012, 12:10 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1329
Благодарил (а): 0 раз.
Поблагодарили: 72 раз.
pantomimo писал(а):
Вы закрываете базу dbh.close(); а нужно ли закрывать db.close(); ???

Добрый день!
В dbh.close() уже выполняется db.close(), поэтому не нужно. Посмотрите следующий урок №38, там в конце я это расписал с примером.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 янв 2012, 13:17 

Зарегистрирован: 10 янв 2012, 11:53
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
damager82 писал(а):
pantomimo писал(а):
Вы закрываете базу dbh.close(); а нужно ли закрывать db.close(); ???

Добрый день!
В dbh.close() уже выполняется db.close(), поэтому не нужно. Посмотрите следующий урок №38, там в конце я это расписал с примером.


спасибо! все отлично расписано! чуть поспешил с вопросом...)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 мар 2012, 13:03 

Зарегистрирован: 26 мар 2012, 12:51
Сообщений: 12
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Спасибо огромное за уроки... Если есть возможность у вас, не могли бы вы поподробнее остановиться на обьяснении как составлять SQL-запросы, а именно что все это значит --->

String sqlQuery = "select PL.name as Name, PS.name as Position, salary as Salary "
+ "from people as PL "
+ "inner join position as PS "
+ "on PL.posid = PS.id "
+ "where salary > ?";
или где можно об этом почитать? Спасибо.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 мар 2012, 14:13 

Зарегистрирован: 21 фев 2012, 05:59
Сообщений: 8
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
ссылка на официальный ман
ну а вообще то, что ты спрашиваешь, не имеет прямого отношения к андроиду. Берешь любую документацию по sql на русском языке и читаешь, синтаксис очень похож


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 мар 2012, 17:02 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1329
Благодарил (а): 0 раз.
Поблагодарили: 72 раз.
На Java, SQL и прочие используемые технологии я стараюсь не отвлекаться. Все таки сайт посвящен андроиду, по которому мало ресурсов в рунете.

Вам, действительно, имеет смысл поискать в сети SQL учебник какой-нибудь. Там для первого знакомства хватит одного дня. Например можно использовать этот: http://www.cs.ifmo.ru/education/documen ... ndex.shtml

Если разбирать текущий фрагмент:
Цитата:
"select PL.name as Name, PS.name as Position, salary as Salary "
+ "from people as PL "
+ "inner join position as PS "
+ "on PL.posid = PS.id "
+ "where salary > ?";


Здесь мы таблице people даем псевдоним PL (2-я строка), а таблице position - псевдоним PS (3-я строка). Это нужно просто для уменьшения кол-ва букв.
Во второй и третьей строке мы говорим, что хотим связать две таблицы и использовать данные из обоих (from и inner join). Связывать будем по условию в 4-й строке. И должно учитываться, что salary (5-я строка) больше параметра, который мы укажем далее. В итоге на выходе мы получим имя человека (PL.name), наименование должности (PS.name) и зарплату (salary) - это все мы указываем в первой строке (select).
В отличие от name здесь salary используется без PL. или PS., потому что оно только в одной из таблиц и система сама его найдет.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 мар 2012, 17:32 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
яфпкк писал(а):
...синтаксис очень похож
Как человек продолжительное время программировавший под MS SQL, могу сказать, что похож он не везде. Я был приятно удивлен, когда SELECT TOP 1... почему-то не захотел работать. :)
А вот ссылка на оф.сайт действительно полезная штука. Только боюсь поможет она, если есть хоть какие то познания в SQL.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 мар 2012, 21:04 

Зарегистрирован: 26 мар 2012, 12:51
Сообщений: 12
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
damager82 писал(а):
На Java, SQL и прочие используемые технологии я стараюсь не отвлекаться. Все таки сайт посвящен андроиду, по которому мало ресурсов в рунете.

Вам, действительно, имеет смысл поискать в сети SQL учебник какой-нибудь. Там для первого знакомства хватит одного дня. Например можно использовать этот: http://www.cs.ifmo.ru/education/documen ... ndex.shtml

Если разбирать текущий фрагмент:
Цитата:
"select PL.name as Name, PS.name as Position, salary as Salary "
+ "from people as PL "
+ "inner join position as PS "
+ "on PL.posid = PS.id "
+ "where salary > ?";


Здесь мы таблице people даем псевдоним PL (2-я строка), а таблице position - псевдоним PS (3-я строка). Это нужно просто для уменьшения кол-ва букв.
Во второй и третьей строке мы говорим, что хотим связать две таблицы и использовать данные из обоих (from и inner join). Связывать будем по условию в 4-й строке. И должно учитываться, что salary (5-я строка) больше параметра, который мы укажем далее. В итоге на выходе мы получим имя человека (PL.name), наименование должности (PS.name) и зарплату (salary) - это все мы указываем в первой строке (select).
В отличие от name здесь salary используется без PL. или PS., потому что оно только в одной из таблиц и система сама его найдет.


Спасибо за ответ... Был далек от SQL теперь пришлось нырнуть...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 мар 2012, 06:34 

Зарегистрирован: 21 фев 2012, 05:59
Сообщений: 8
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
KamiSempai писал(а):
SELECT TOP 1... почему-то не захотел работать. :)

это наверное единственное отличие в синтаксисе (имею ввиду обычные селекты), не знаю как в sqlite, но в mysql это записывается так
select * from table1 limit 10, например


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 май 2012, 23:53 

Зарегистрирован: 07 май 2012, 00:32
Сообщений: 22
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Сам столкнулся с трудностями в изучении последних глав, связанных с БД. После прочтения пятой главы книги "Using SQLite 2010" Jay Kreibich все разъяснилось. У кого тоже были трудности, очень советую почитать вышеупомянутую главу из книги.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 май 2012, 15:06 

Зарегистрирован: 29 мар 2012, 12:06
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Как в rawQuery использовать множественные условия в WHERE?

String selection = "SELECT * FROM TABLE WHERE id=? AND data=? AND text=?
String[] selectionArgs = { id, data, text};

Cursor c = db.rawQuery(selection, selectionArgs);

Вот так не работает почему-то. Даже если selection заменить явно на строку

SELECT * FROM TABLE WHERE id='123' AND data='123'

а вторым агрументом указать null, то происходит то же самое. В SQLite нельзя использовать AND разве?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 23 май 2012, 09:32 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1329
Благодарил (а): 0 раз.
Поблагодарили: 72 раз.
Andy_NTG писал(а):
В SQLite нельзя использовать AND разве?

Должно работать. Скорее всего выборка по таким условиям действительно ничего не возвращает. Проверьте данные в таблице.
Если указываете where с одним аргументом то работает?

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 23 май 2012, 11:47 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
id и data какого типа? Если числового, кавычки нужно убрать.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 23 май 2012, 13:41 

Зарегистрирован: 29 мар 2012, 12:06
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Да, всё работает, где-то в синтаксисе была ошибка.

Но вот есть новая проблема. SQLite не поддерживает поля календарного, так сказать, типа. То есть сортировку по дате не сделать, получается. Пробую сохранать в базу значения типа YYYY-MM-DD HH:MM:SS.SSS, но по ним почему-то не происходит корректная сортировка.

P.S. Перевёл в поле типа int и записал туда время в миллисекундах. Теперь сортировка работает.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 24 май 2012, 16:57 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Andy_NTG писал(а):
Но вот есть новая проблема. SQLite не поддерживает поля календарного, так сказать, типа. То есть сортировку по дате не сделать, получается. Пробую сохранать в базу значения типа YYYY-MM-DD HH:MM:SS.SSS, но по ним почему-то не происходит корректная сортировка.

P.S. Перевёл в поле типа int и записал туда время в миллисекундах. Теперь сортировка работает.
Не может быть такого. Сам использую вышеописанный формат даты, только без милисекунд, и все отлично сортируется. Каким образом Вы переводите дату в строку?

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 07 мар 2013, 16:47 

Зарегистрирован: 23 сен 2012, 23:10
Сообщений: 33
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Добрый день всем! Есть проблема. Бьюсь уже три дня и не могу понять в чем дело...
В общем, есть база у меня data.db. В ней есть куча таблиц (база не моя, а готовая с инета).
Мне нужна таблица food, в которой есть столбцы "id, title, proteins, fats, carbohydrates, water, energy". Это не все столбцы, но мне нужны только эти.
Мне нужно организовать поиск по строкам столбца title. Идея такая. Ввожу в edittext часть слова или слово, которое хочу найти. Нажимаю на баттон и нижу мой listview должен заполниться строками из "title, proteins, fats, carbohydrates, water, energy", в которых titlе равен или содержит текст из edittext-а.
Делал такой запрос:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. EditText search_prod = (EditText) findViewById(R.id.et_dob_prod);
  2.                                 lv_product = (ListView) findViewById(R.id.lv_dob_prod);
  3.                                 String[] arrayOfString = new String[1];
  4.                         arrayOfString[0] = String.valueOf(search_prod.getText().toString());
  5.                                 try {
  6.                                        
  7.                                         String [] selectionArgs = {search_prod.getText().toString() + "%"};
  8.                                         Cursor cursor;
  9.                                         // Wrap the next line in try-catch
  10.                                         cursor = database.rawQuery("select title, proteins, fats, carbohydrates, water, energy from food where food.title = ?", arrayOfString);
  11.                                        
  12.                                 if (cursor.moveToFirst()) {
  13.                                         do {
  14.                                                 Toast.makeText(getApplicationContext(), cursor.getString(0), Toast.LENGTH_LONG).show();
  15.                                                 // list1.add(cursor.getString(0));
  16.                                                 RowItemProduct item2 = new RowItemProduct(
  17.                                                                 R.drawable.dieta, cursor.getString(0), cursor
  18.                                                                                 .getString(1), cursor.getString(2),
  19.                                                                 cursor.getString(3), cursor.getString(5));
  20.  
  21.                                                 rowItems_product.add(item2);
  22.  
  23.                                         } while (cursor.moveToNext());
  24.                                 }
  25.                                 if (cursor != null && !cursor.isClosed()) {
  26.                                         cursor.close();
  27.                                 }
  28.                                 }catch (Exception e) {
  29.                                         // TODO: handle exception
  30.                                         Log.d(LOG_TAG, e.toString());
  31.                                 }
  32.  
  33.                                 rowItems_product = new ArrayList<RowItemProduct>();
  34.  
  35.                                 CustomLVAdapterProduct adapter1 = new CustomLVAdapterProduct(
  36.                                                 context, R.layout.list_item_product, rowItems_product);
  37.                                 lv_product.setAdapter(adapter1);
  38.  
  39.                         }


Но он не дает результатов... Уже не знаю, что и делать :-(
В БД я вообще нуб, но есть необходимость реализовать. Когда-то в университете имел дело с access в делфи, но там другое и уже много забыл...
Вот скрин структуры базы:
Вложение:
Комментарий к файлу: Скрин базы на компе
ScreenShot2222.png
ScreenShot2222.png [ 68.26 KiB | Просмотров: 8945 ]

Пожалуйста помогите мне. Я перерыл весь интернет, перепробовал кучу вариантов, но ничего не выходит :-(


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 08 мар 2013, 00:29 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 12:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
Знак процента можно с обоих сторон добавлять.
Второе, тут поиск с русскими буквами будет глючить. Я видела такую реализацию. В таблицу заносят данные, и еще делают столбик с данными только большими буквами. И ищут по нему, предварительно приведя и строку в большие буквы.
Другой способ - ищи в интернете, сильно заморочистый, чтоб подружить sqlite с русскими буквами.
Хотя что значит у тебя "не ищет". Вообще ничего не выдает, что ли?
распечатй запрос в лог, возьми базу, какой-нибудь редактор, открой ее там, внеси запрос из лога и посмотри что выдается. Тестировать запросы луше так.

_________________
R.id.team

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 08 мар 2013, 00:31 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 12:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
и кстати, нужно писать не знак равенства в запросе, а оператор LIKE.
Равенство нормально работает с любыми буквами вроде, но так в результатах запроса у тебя вряд ли что-то будет.

_________________
R.id.team

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 08 мар 2013, 09:25 

Зарегистрирован: 23 сен 2012, 23:10
Сообщений: 33
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Olivka писал(а):
Знак процента можно с обоих сторон добавлять.
Второе, тут поиск с русскими буквами будет глючить. Я видела такую реализацию. В таблицу заносят данные, и еще делают столбик с данными только большими буквами. И ищут по нему, предварительно приведя и строку в большие буквы.
Другой способ - ищи в интернете, сильно заморочистый, чтоб подружить sqlite с русскими буквами.
Хотя что значит у тебя "не ищет". Вообще ничего не выдает, что ли?
распечатй запрос в лог, возьми базу, какой-нибудь редактор, открой ее там, внеси запрос из лога и посмотри что выдается. Тестировать запросы луше так.

и кстати, нужно писать не знак равенства в запросе, а оператор LIKE.
Равенство нормально работает с любыми буквами вроде, но так в результатах запроса у тебя вряд ли что-то будет.

Сделал вот так:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. cursor = database.rawQuery("SELECT title, proteins, fats, carbohydrates, water, energy FROM food WHERE food.title LIKE ?", arrayOfString);

Когда ввожу с большой буквы, то в listview у меня появляется один результат, в котором title четко совпадает с текстом из edittext. Ну с регистром букв, я думаю, уже реальнее разобраться. Но вот я хочу, чтоб поиск был не по началу названия, а по всей строке из title чтоб искалось наличие текста из edittext. Такое реально вообще сделать? Я видел подобную реализацию в приложении Диетический калькулятор, но к сожалению исходников нет нигде... Вы мне можете подсказать, что сделать? Как сделать такой запрос, который выдаст не строго строчку, а строчку в которой присутствует нужный текст?

UPD1: Проблема решена! Спасибо за подсказку на счет процента! Сделал вот так :
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. arrayOfString[0] = String.valueOf("%"+search_prod.getText().toString()+"%");
и начало искать все совпадения! Круто! ))) Теперь буду искать на счет регистронезависимого поиска. Если есть идеи, то и тут попрошу помощи :-)

UPD2: Поиск по интернету не дал результатов. Решил сам попробовать. В итоге решил сделать два запроса к базе. Один начинается с большой буквы, второй - с маленькой. База достаточно большая, но на нагрузке устройства это не сказывается. Может кому пригодится в будущем. Вот реализация:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. EditText search_prod = (EditText) findViewById(R.id.et_dob_prod);
  2. lv_product = (ListView) findViewById(R.id.lv_dob_prod);
  3. String[] arrayOfString = new String[1];
  4. String[] arrayOfString1 = new String[1];
  5. String verh_registr = search_prod.getText().toString();
  6. verh_registr = verh_registr.substring(0, 1).toUpperCase()+verh_registr.substring(1);
  7. String nizh_registr = verh_registr;
  8. nizh_registr = nizh_registr.substring(0, 1).toLowerCase()+nizh_registr.substring(1);
  9. arrayOfString[0] = String.valueOf("%"+verh_registr+"%");
  10. arrayOfString1[0] = String.valueOf("%"+nizh_registr+"%");
  11. Cursor cursor;
  12. Cursor cursor1;
  13. rowItems_product = new ArrayList<RowItemProduct>();    
  14. cursor = database.rawQuery("SELECT title, proteins, fats, carbohydrates, water, energy FROM food WHERE food.title LIKE ?", arrayOfString);
  15. cursor1 = database.rawQuery("SELECT title, proteins, fats, carbohydrates, water, energy FROM food WHERE food.title LIKE ?", arrayOfString1);
  16.  
  17. cursor.moveToFirst();
  18. while (!cursor.isAfterLast()) {
  19.         RowItemProduct item2 = new RowItemProduct(R.drawable.dieta, cursor.getString(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(5));
  20.         rowItems_product.add(item2);
  21.         cursor.moveToNext();
  22.                                         }
  23. cursor1.moveToFirst();
  24. while (!cursor1.isAfterLast()) {
  25.         RowItemProduct item21 = new RowItemProduct(R.drawable.dieta, cursor1.getString(0), cursor1.getString(1), cursor1.getString(2), cursor1.getString(3), cursor1.getString(5));
  26.         rowItems_product.add(item21);
  27.         cursor1.moveToNext();
  28.                                         }
  29. CustomLVAdapterProduct adapter1 = new CustomLVAdapterProduct(context, R.layout.list_item_product, rowItems_product);
  30. lv_product.setAdapter(adapter1);


Всем, кто помогал большое спасибо! Надеюсь данная реализация пригодится в будущем таким же постигающим данный путь как и я :-D


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 74 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB