Урок 36. SQLite. Подробнее про метод query. Условие, сортировка, группировка
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Включи логи и через них посмотри, что у тебя лежит в c_cd в разных случаях, таким образом найдешь как именно проверять.
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
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 в условие заходит,
всмысе в скобки { }.
Но потом почему-то выдается эта ошибка.
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 в условие заходит,
всмысе в скобки { }.
Но потом почему-то выдается эта ошибка.
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
всем спасибо, нашел ошибку.
в скобках была команда, которая не выполнялась, соответственно, давала ошибку
в скобках была команда, которая не выполнялась, соответственно, давала ошибку
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Всем ку!
Вопрос по выборке... В общем.. я уже писал в другой ветке, но вопрос получился слишком большой...видимо у людей не хватило терпения на весь вопрос, т.к. ответили на половину )))) Так вот.... после ввода данных в спиннеры, едитТексты , прежде чем добавить запись я проверяю, нет ли такой уже в базе... Запрос "SELECT * FROM DBDBDBDBDB WHERE name = <какое-то значение>" считает разными значения "Имя", "имя", "иМя" и т.п. Есть вариант как обойти эту проблему... надо просто перед вводом текстовых данных в базу преобразовывать их все к нижнему регистру(или к верхнему)(или первую делать заглавной), в общем...кому как нравится... и при проверке тоже приводить проверяемые данные к нужной форме, а потом уже делать запрос... НО... это уже а-ля "нажми здесь, покрути там, пукни два раза". Нет ли другого способа? Я имею ввиду может запрос как-то по-другому надо строить? Просто, я не очень в SQL-запросах...
Всем заранее спасибо!
Вопрос по выборке... В общем.. я уже писал в другой ветке, но вопрос получился слишком большой...видимо у людей не хватило терпения на весь вопрос, т.к. ответили на половину )))) Так вот.... после ввода данных в спиннеры, едитТексты , прежде чем добавить запись я проверяю, нет ли такой уже в базе... Запрос "SELECT * FROM DBDBDBDBDB WHERE name = <какое-то значение>" считает разными значения "Имя", "имя", "иМя" и т.п. Есть вариант как обойти эту проблему... надо просто перед вводом текстовых данных в базу преобразовывать их все к нижнему регистру(или к верхнему)(или первую делать заглавной), в общем...кому как нравится... и при проверке тоже приводить проверяемые данные к нужной форме, а потом уже делать запрос... НО... это уже а-ля "нажми здесь, покрути там, пукни два раза". Нет ли другого способа? Я имею ввиду может запрос как-то по-другому надо строить? Просто, я не очень в SQL-запросах...
Всем заранее спасибо!
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
http://www.sqlite.org/datatype3.html#collation
1 минуту потратил что бы найти, так что стоит только правильно спросить =)
1 минуту потратил что бы найти, так что стоит только правильно спросить =)
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
)) Тенксrezak90 писал(а):http://www.sqlite.org/datatype3.html#collation
1 минуту потратил что бы найти, так что стоит только правильно спросить =)
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Почему нужно было с 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 ошибки нет но и результата нет, наверное из-за кирилицы
вот пытаюсь сделать поиск, пишу:
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 раз.
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
на счёт регистров я где то уже на форуме кидал ссылку, у них в доках пишется что все записи при сравнении автоматом приводятся к какому то регистру. как то примерно так звучит, нужно искать ссылку или у них в доках.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
-
- Сообщения: 10
- Зарегистрирован: 14 дек 2012, 05:19
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Подскажите, как лучше посмотреть, существует ли в базе таблица с нужным именем? Ткнуться запросом db.query(table_name, null, null, null, null, null, null); , держа наготове try-catch, чтобы узнать об отсутствии по исключению, или есть более красивый вариант?
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Код: Выделить всё
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. Условие, сор
Лучше ограничить выборку.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.
Хватит таскать макулатуру на тренировку! Используй T Note.
-
- Сообщения: 10
- Зарегистрирован: 14 дек 2012, 05:19
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Понятно, спасибо!
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Добрый день! Почему то у меня ошибку выдает в данном примере на месте:
@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)
Подскажите как исправить?
@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)
Подскажите как исправить?
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
нету столбца regiontable mytable has no column named region
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Как его добавить?
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Смотри 39 урок
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Так у меня не работает именно этот урок!! Именно в этом уроке такая ошибка!! Причем тут 39 урок не понимаю....
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
При создании БД у тебя вызывался метод
В нём создавалась таблица 'mytable ' с этим полем 'region '. Если ты делал всё правильно, то поле это быть в таблице должно.
upd: если ты делал предыдущий урок в этом же проекте, то метод onCreate уже не вызовется, так как база данных уже была создана ранее с другими полями.
Код: Выделить всё
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" + ");");
}
upd: если ты делал предыдущий урок в этом же проекте, то метод onCreate уже не вызовется, так как база данных уже была создана ранее с другими полями.
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
ДА именно! я делаю все уроки в одном проекте!!!!
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Тогда, чтобы всё заработало, самое простое - это через мэнеджер файлов виртуального устройства удалить старую базу данных (в одном из уроков про это написано). Для этого надо найти там data/data/ИМЯ_ПРОЕКТА/databases/ и удалить содержимое (там сама БД и журнал), тогда при запуске приложение не найдёт файлов с БД и снова вызовется метод OnCreate, которое создаст необходимую для тебя БД и новой таблицей и всеми полями.