Страница 3 из 11

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

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

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

Добавлено: 28 сен 2012, 12:50
top
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 в условие заходит,
всмысе в скобки { }.
Но потом почему-то выдается эта ошибка.

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

Добавлено: 28 сен 2012, 13:18
top
всем спасибо, нашел ошибку.
в скобках была команда, которая не выполнялась, соответственно, давала ошибку

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

Добавлено: 05 дек 2012, 23:24
nubodroid
Всем ку!

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

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

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

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

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

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

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

Добавлено: 10 дек 2012, 20:23
dubok79
Почему нужно было с 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 ошибки нет но и результата нет, наверное из-за кирилицы

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

Добавлено: 10 дек 2012, 20:58
rezak90
на счёт регистров я где то уже на форуме кидал ссылку, у них в доках пишется что все записи при сравнении автоматом приводятся к какому то регистру. как то примерно так звучит, нужно искать ссылку или у них в доках.

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

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

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

Добавлено: 19 дек 2012, 14:25
rezak90

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

public boolean exists(String table) {
    try {
         db.query("SELECT * FROM " + table);
         return true;
    } catch (SQLException e) {
         return false;
    }
}

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

Добавлено: 19 дек 2012, 15:23
KamiSempai
rezak90 писал(а):

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

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

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

"SELECT * FROM " + table + " LIMIT 1"

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

Добавлено: 20 дек 2012, 10:24
eternal_ego
Понятно, спасибо!

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

Добавлено: 03 фев 2013, 23:49
zenit
Добрый день! Почему то у меня ошибку выдает в данном примере на месте:

@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. Условие, сор

Добавлено: 04 фев 2013, 00:12
rezak90
table mytable has no column named region
нету столбца region

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

Добавлено: 04 фев 2013, 08:23
zenit
Как его добавить?

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

Добавлено: 05 фев 2013, 01:05
dens
Смотри 39 урок

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

Добавлено: 05 фев 2013, 14:49
zenit
Так у меня не работает именно этот урок!! Именно в этом уроке такая ошибка!! Причем тут 39 урок не понимаю....

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

Добавлено: 05 фев 2013, 22:42
dens
При создании БД у тебя вызывался метод

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

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 уже не вызовется, так как база данных уже была создана ранее с другими полями.

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

Добавлено: 06 фев 2013, 14:38
zenit
ДА именно! я делаю все уроки в одном проекте!!!!

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

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