Урок 36. SQLite. Подробнее про метод query. Условие, сортировка, группировка

Обсуждение уроков
Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение neoksi » 28 сен 2012, 01:37

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

top
Сообщения: 14
Зарегистрирован: 22 июн 2012, 06:09

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение top » 28 сен 2012, 12:50

log пишет при if(c_cd.getCount==0)
09-29 09:25:21.861: E/AndroidRuntime(1124): Caused by: java.lang.NullPointerException

Пробовал с помощью debuger-а посмотреть. В начале курсор c_cd имеет значение null.
После c_cd=db.query(...)
курсору присваевается

c_cd = SQLiteCursor (id=830085601240)
mContentResolver = null
mCount = -1
mCurrentRowID = null
mCursorState = 0
mDatabase = SQLiteDatabase (id=830085595376)
...
mPos = -1
mRowIdColumnIndex = -1




т.е. он не null, поэтому не выполняется условие if (c_cd==null).

тогда пробую условие if(c_cd.getCount==0), при нажатии на StepOver в условие заходит,
всмысе в скобки { }.
Но потом почему-то выдается эта ошибка.

top
Сообщения: 14
Зарегистрирован: 22 июн 2012, 06:09

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение top » 28 сен 2012, 13:18

всем спасибо, нашел ошибку.
в скобках была команда, которая не выполнялась, соответственно, давала ошибку

nubodroid
Сообщения: 28
Зарегистрирован: 19 ноя 2012, 08:20

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение nubodroid » 05 дек 2012, 23:24

Всем ку!

Вопрос по выборке... В общем.. я уже писал в другой ветке, но вопрос получился слишком большой...видимо у людей не хватило терпения на весь вопрос, т.к. ответили на половину )))) Так вот.... после ввода данных в спиннеры, едитТексты , прежде чем добавить запись я проверяю, нет ли такой уже в базе... Запрос "SELECT * FROM DBDBDBDBDB WHERE name = <какое-то значение>" считает разными значения "Имя", "имя", "иМя" и т.п. Есть вариант как обойти эту проблему... надо просто перед вводом текстовых данных в базу преобразовывать их все к нижнему регистру(или к верхнему)(или первую делать заглавной), в общем...кому как нравится... и при проверке тоже приводить проверяемые данные к нужной форме, а потом уже делать запрос... НО... это уже а-ля "нажми здесь, покрути там, пукни два раза". Нет ли другого способа? Я имею ввиду может запрос как-то по-другому надо строить? Просто, я не очень в SQL-запросах...

Всем заранее спасибо!

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение rezak90 » 05 дек 2012, 23:39

http://www.sqlite.org/datatype3.html#collation
1 минуту потратил что бы найти, так что стоит только правильно спросить =)
R.id.team
Политика на форуме запрещена

nubodroid
Сообщения: 28
Зарегистрирован: 19 ноя 2012, 08:20

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение nubodroid » 06 дек 2012, 00:10

rezak90 писал(а):http://www.sqlite.org/datatype3.html#collation
1 минуту потратил что бы найти, так что стоит только правильно спросить =)
)) Тенкс

dubok79
Сообщения: 12
Зарегистрирован: 24 ноя 2012, 13:41

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение dubok79 » 10 дек 2012, 20:23

Почему нужно было с SQL запросами все так усложнять?
вот пытаюсь сделать поиск, пишу:

cur = db.query("table", "column", "column like ?", new String[] {"%а%"}, null, null, null);

вылетает с ошибкой.

вот так работает:

cur = db.query("table", "column", "column like ?", new String[] {"а"}, null, null, null);

но мне надо чтобы находилось все где есть символ "а". Запрос в самом SQLite проверял, все работает.
Помогите разобраться. Спасибо.

Текст ошибки:
Cannot bind argument at index 1 because the index is out of range. The statement has 0 parameters.

Может быть символ "%" воспринимается так же как и "?", если да то как быть?

Короче тут разобрался: работать будет если проценты писать в уникоде:
cur = db.query("table", "column", "column like ?", new String[] {"\u0025а\u0025"}, null, null, null);

И еще есть ли тут аналог MSSQL UPPER или LOWER ну чтобы все в верхний или в нижний регистр. Пробовал на SQLite ошибки нет но и результата нет, наверное из-за кирилицы
Последний раз редактировалось dubok79 10 дек 2012, 21:01, всего редактировалось 1 раз.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение rezak90 » 10 дек 2012, 20:58

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

eternal_ego
Сообщения: 10
Зарегистрирован: 14 дек 2012, 05:19

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение eternal_ego » 19 дек 2012, 11:39

Подскажите, как лучше посмотреть, существует ли в базе таблица с нужным именем? Ткнуться запросом db.query(table_name, null, null, null, null, null, null); , держа наготове try-catch, чтобы узнать об отсутствии по исключению, или есть более красивый вариант?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение rezak90 » 19 дек 2012, 14:25

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

public boolean exists(String table) {
    try {
         db.query("SELECT * FROM " + table);
         return true;
    } catch (SQLException e) {
         return false;
    }
}
R.id.team
Политика на форуме запрещена

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

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение KamiSempai » 19 дек 2012, 15:23

rezak90 писал(а):

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

public boolean exists(String table) {
    try {
         db.query("SELECT * FROM " + table);
         return true;
    } catch (SQLException e) {
         return false;
    }
}
Лучше ограничить выборку.

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

"SELECT * FROM " + table + " LIMIT 1"
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

eternal_ego
Сообщения: 10
Зарегистрирован: 14 дек 2012, 05:19

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение eternal_ego » 20 дек 2012, 10:24

Понятно, спасибо!

zenit
Сообщения: 13
Зарегистрирован: 03 фев 2013, 22:59

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение zenit » 03 фев 2013, 23:49

Добрый день! Почему то у меня ошибку выдает в данном примере на месте:

@Override
protected void onCreate(Bundle savedInstanceState)
{
...

if( c.getCount() == 0 )
{
ContentValues cv = new ContentValues();
//Заполним таблицу
for(int i = 0; i<10; i++)
{
cv.put( "name" , name );
cv.put( "people", people );
cv.put( "region", region );

Log.d( LOG_TAG, "id = " + db.insert("mytable", null, cv) );
}

}

...
}



Ошибка следующая:
09-01 02:37:48.544: E/SQLiteDatabase(23681): Error inserting region=Азия people=1400 name=Китай
09-01 02:37:48.544: E/SQLiteDatabase(23681): android.database.sqlite.SQLiteException: table mytable has no column named region: , while compiling: INSERT INTO mytable(region,people,name) VALUES (?,?,?)
09-01 02:37:48.544: E/SQLiteDatabase(23681): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
09-01 02:37:48.544: E/SQLiteDatabase(23681): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
09-01 02:37:48.544: E/SQLiteDatabase(23681): at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
09-01 02:37:48.544: E/SQLiteDatabase(23681): at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
09-01 02:37:48.544: E/SQLiteDatabase(23681): at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:260)



Подскажите как исправить?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение rezak90 » 04 фев 2013, 00:12

table mytable has no column named region
нету столбца region
R.id.team
Политика на форуме запрещена

zenit
Сообщения: 13
Зарегистрирован: 03 фев 2013, 22:59

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение zenit » 04 фев 2013, 08:23

Как его добавить?

Аватара пользователя
dens
Сообщения: 47
Зарегистрирован: 03 фев 2013, 00:14

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение dens » 05 фев 2013, 01:05

Смотри 39 урок

zenit
Сообщения: 13
Зарегистрирован: 03 фев 2013, 22:59

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение zenit » 05 фев 2013, 14:49

Так у меня не работает именно этот урок!! Именно в этом уроке такая ошибка!! Причем тут 39 урок не понимаю....

Аватара пользователя
dens
Сообщения: 47
Зарегистрирован: 03 фев 2013, 00:14

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение dens » 05 фев 2013, 22:42

При создании БД у тебя вызывался метод

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

public void onCreate(SQLiteDatabase db) {
      Log.d(LOG_TAG, "--- onCreate database ---");
      // создаем таблицу с полями
      db.execSQL("create table mytable ("
          + "id integer primary key autoincrement," + "name text,"
          + "people integer," + "region text" + ");");
    }
В нём создавалась таблица 'mytable ' с этим полем 'region '. Если ты делал всё правильно, то поле это быть в таблице должно.

upd: если ты делал предыдущий урок в этом же проекте, то метод onCreate уже не вызовется, так как база данных уже была создана ранее с другими полями.

zenit
Сообщения: 13
Зарегистрирован: 03 фев 2013, 22:59

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение zenit » 06 фев 2013, 14:38

ДА именно! я делаю все уроки в одном проекте!!!!

Аватара пользователя
dens
Сообщения: 47
Зарегистрирован: 03 фев 2013, 00:14

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение dens » 06 фев 2013, 16:01

Тогда, чтобы всё заработало, самое простое - это через мэнеджер файлов виртуального устройства удалить старую базу данных (в одном из уроков про это написано). Для этого надо найти там data/data/ИМЯ_ПРОЕКТА/databases/ и удалить содержимое (там сама БД и журнал), тогда при запуске приложение не найдёт файлов с БД и снова вызовется метод OnCreate, которое создаст необходимую для тебя БД и новой таблицей и всеми полями.

Ответить