Страница 1 из 1

update одного поля

Добавлено: 15 ноя 2013, 12:18
walle
Добрый день.
Как мне обновить одно поле в записи оставив остальные поля без изменения?

как-то так работать не желает
[syntax=java5]
String strUPDATE = "UPDATE tbl SET field = false WHERE _id = 1";
db.execSQL(strUPDATE);
[/syntax]

Re: update одного поля

Добавлено: 15 ноя 2013, 12:24
Foenix
что значит "не хочет"? Поясни
И что значит false? в sqite полей с таким значением нет

Re: update одного поля

Добавлено: 15 ноя 2013, 12:25
trew
WHERE _id = 1
означает что нужно обновить поле, у которого _id = 1 (где _id - это имя столбца, а 1 - это его значение)

Если нужно обновить весь столбец в таблице, тогда так:
UPDATE tbl SET field = false

или так (если обратить внимание на сообщение Foenix),
UPDATE tbl SET field = 0 // это false
UPDATE tbl SET field = 1 // это true

Re: update одного поля

Добавлено: 15 ноя 2013, 13:59
walle
trew писал(а): или так (если обратить внимание на сообщение Foenix),
UPDATE tbl SET field = 0 // это false
UPDATE tbl SET field = 1 // это true
обновился весь столбец.
[syntax=sql]
UPDATE tbl SET field = 0[/syntax]

но в true не обновляется почему? :?
[syntax=sql]
UPDATE tbl SET field = 1[/syntax]

вообще странно что sqlite true и false не поддерживает..

Re: update одного поля

Добавлено: 15 ноя 2013, 14:04
trew
walle
SQLite
Не поддерживается тип boolean. Используйте числа 0 для false и 1 для true.
help
SQLite does not have a separate Boolean storage class. Instead, Boolean values are stored as integers 0 (false) and 1 (true).

Re: update одного поля

Добавлено: 15 ноя 2013, 16:26
walle
trew писал(а):WHERE _id = 1
означает что нужно обновить поле, у которого _id = 1 (где _id - это имя столбца, а 1 - это его значение)

Если нужно обновить весь столбец в таблице, тогда так:
UPDATE tbl SET field = false

или так (если обратить внимание на сообщение Foenix),
UPDATE tbl SET field = 0 // это false
UPDATE tbl SET field = 1 // это true
у меня только так заработало....
[syntax=java5]
if(chkFavorite.isChecked())
strUPDATE = "UPDATE tblStation SET favorite='true' WHERE title='" + stationValues[position] + "'";
else
strUPDATE = "UPDATE tblStation SET favorite='false' WHERE title='" + stationValues[position] + "'";
[/syntax]

Re: update одного поля

Добавлено: 15 ноя 2013, 16:34
trew
favorite='false'
Значит поле у вас текстовое, а не число.

Такие поля обычно делают числовыми, чтобы компьютер быстрее работал, когда база большая.
Числа компьютер сравнивает быстрее, чем текст.
Программист запоминает для себя, что ноль - это будет false, а единица - true.

Re: update одного поля

Добавлено: 15 ноя 2013, 16:40
walle
trew писал(а):favorite='false'
Значит поле у вас текстовое, а не число.
[syntax=java5]
db.execSQL("CREATE TABLE 'tblStation' ('_id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
"'id_country' INTEGER NOT NULL ," +
"'id_genre' INTEGER NOT NULL ," +
"'id_language' INTEGER NOT NULL ," +
"'title' NVARCHAR NOT NULL," +
"'description' NVARCHAR NOT NULL," +
"'sourceURL' NVARCHAR NOT NULL , " +
"'favorite' BOOL NOT NULL);"); // DEFAULT 'true'
[/syntax]

Re: update одного поля

Добавлено: 15 ноя 2013, 19:15
Foenix
walle, запомни такую штуку.. в sqlite, даже если ты объявляешь поле как string или integer, то все равно можешь туда записать все что угодно. Вот такая вот интересная особенность. Это раз.

А два то, что нельзя вписать в поле значение "SET favorite=true", потому что true для sqlite это не служебное слово. Таким образом чтоб оно его воспринимало как текст - нужно заключить это слово в кавычки"SET favorite='true'", если как число - то писать число "SET favorite=1"

И три. "NVARCHAR" - писать там совершенно бесполезно. В sqlite воспример любой "unusual" тип данных

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

CREATE TABLE ex2(
  a VARCHAR(10),
  b NVARCHAR(15),
  c TEXT,
  d INTEGER,
  e FLOAT,
  f BOOLEAN,
  g CLOB,
  h BLOB,
  i TIMESTAMP,
  j NUMERIC(10,5)
  k VARYING CHARACTER (24),
  l NATIONAL VARYING CHARACTER(16)
);
Но все они будут приведены только к таким

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

TEXT
NUMERIC
INTEGER
REAL
NONE
http://www.sqlite.org/datatype3.html
по ссылке есть табличка, куда и как преобразовываются все любые типы к этим четырем.
Я не про то, что писать NVARCHAR не нужно.. нужно просто понимать - что разницы между
CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB
нету совершенно никакой. Поэтому лучше при описании структуры таблицы использовать вышепреведенные типы
TEXT
NUMERIC
INTEGER
REAL