SQLite вместо update делает update+insert. Это баг или фича?
SQLite вместо update делает update+insert. Это баг или фича?
SQLite вместо update делает update+insert. Это баг или фича?
Вот код,который делает update записи в БД.
public Boolean updateBeaconName(long beaconId, String beaconName) {
if (beaconId<0) {
return false;
}
Boolean result = false;
try {
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(NAME_COLUMN_NAME, beaconName);
contentValues.put(LOW_CASE_NAME_COLUMN_NAME, beaconName.toLowerCase(Locale.getDefault()));
String where ="("+ID_COLUMN_NAME+"=?)";
Log.d("AAA", String.format("Updating beacon id=%d name to %s", beaconId, beaconName));
int count = db.update(BEACON_TABLE_NAME, contentValues, where, new String[] { String.valueOf(beaconId) });
Log.d("AAA", String.format("%d rows affected", count));
result = ( count > 0 );
db.close();
} catch(Exception e) {
result = false;
}
return result;
}
public Boolean updateBeaconName(String beaconName, Cursor cursor) {
if (cursor==null) {
return false;
}
long beaconId = -1;
try {
beaconId = cursor.getInt(cursor.getColumnIndex(ID_COLUMN_NAME));
} catch (Exception e) {
beaconId = -1;
}
if (beaconId<0) {
return false;
}
return updateBeaconName(beaconId, beaconName);
}
Использую его из списка, созданного при помощии SimpleCursorAdapter
После вызова метода updateBeaconName старая запись не удаляется, а новая создаётся.
Например, если сейчас у меня в БД оидин beacon с именем "AAA".
Вызываю updateBeaconName чтобы переименовать его в "BBB".
Однако после этого вижу в базе не одну, а две записи: первая с именем "AAA", а вторая -- с именем "BBB".
Это что новый баг андроида такой или я чего-то не догоняю?
Вот уже почти полмесяца над этой ерундой бюсь и все не могу понять как в андроиде сделать самый простой update.
Ну, то есть просто изменить запись в БД.
Вот код,который делает update записи в БД.
public Boolean updateBeaconName(long beaconId, String beaconName) {
if (beaconId<0) {
return false;
}
Boolean result = false;
try {
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(NAME_COLUMN_NAME, beaconName);
contentValues.put(LOW_CASE_NAME_COLUMN_NAME, beaconName.toLowerCase(Locale.getDefault()));
String where ="("+ID_COLUMN_NAME+"=?)";
Log.d("AAA", String.format("Updating beacon id=%d name to %s", beaconId, beaconName));
int count = db.update(BEACON_TABLE_NAME, contentValues, where, new String[] { String.valueOf(beaconId) });
Log.d("AAA", String.format("%d rows affected", count));
result = ( count > 0 );
db.close();
} catch(Exception e) {
result = false;
}
return result;
}
public Boolean updateBeaconName(String beaconName, Cursor cursor) {
if (cursor==null) {
return false;
}
long beaconId = -1;
try {
beaconId = cursor.getInt(cursor.getColumnIndex(ID_COLUMN_NAME));
} catch (Exception e) {
beaconId = -1;
}
if (beaconId<0) {
return false;
}
return updateBeaconName(beaconId, beaconName);
}
Использую его из списка, созданного при помощии SimpleCursorAdapter
После вызова метода updateBeaconName старая запись не удаляется, а новая создаётся.
Например, если сейчас у меня в БД оидин beacon с именем "AAA".
Вызываю updateBeaconName чтобы переименовать его в "BBB".
Однако после этого вижу в базе не одну, а две записи: первая с именем "AAA", а вторая -- с именем "BBB".
Это что новый баг андроида такой или я чего-то не догоняю?
Вот уже почти полмесяца над этой ерундой бюсь и все не могу понять как в андроиде сделать самый простой update.
Ну, то есть просто изменить запись в БД.
Re: SQLite вместо update делает update+insert. Это баг или ф
отформатируй нормаьлно код, читать не возможно. ПОложи сюда сиквелы создания таблиц которые используются, их данные и так далее
Полмесяца - многовато для такой проблемы.
Полмесяца - многовато для такой проблемы.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: SQLite вместо update делает update+insert. Это баг или ф
Вот как база создаётся:
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + BEACON_TABLE_NAME + " ( " + ID_COLUMN_NAME
+ " integer primary key autoincrement, "
+ NAME_COLUMN_NAME + " text collate nocase, "
+ LOW_CASE_NAME_COLUMN_NAME + " text collate nocase, "
+ IMEI_COLUMN_NAME + " text, "+ PHONE_COLUMN_NAME +" text);");
}
Код отформатировал, но после вставки он теряет форматирование.
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + BEACON_TABLE_NAME + " ( " + ID_COLUMN_NAME
+ " integer primary key autoincrement, "
+ NAME_COLUMN_NAME + " text collate nocase, "
+ LOW_CASE_NAME_COLUMN_NAME + " text collate nocase, "
+ IMEI_COLUMN_NAME + " text, "+ PHONE_COLUMN_NAME +" text);");
}
Код отформатировал, но после вставки он теряет форматирование.
Re: SQLite вместо update делает update+insert. Это баг или ф
В панели форматирования есть кнопка Code, нажимайте на неё и вставляйте код между тегов, получится так:Код отформатировал, но после вставки он теряет форматирование
Код: Выделить всё
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + BEACON_TABLE_NAME + " ( " + ID_COLUMN_NAME
+ " integer primary key autoincrement, "
+ NAME_COLUMN_NAME + " text collate nocase, "
+ LOW_CASE_NAME_COLUMN_NAME + " text collate nocase, "
+ IMEI_COLUMN_NAME + " text, "+ PHONE_COLUMN_NAME +" text);");
}Re: SQLite вместо update делает update+insert. Это баг или ф
Набирая этот текст, я не вижу никакой панели форматирования.
Re: SQLite вместо update делает update+insert. Это баг или ф
Кстати, с задачей разобрался. Надо было перед update закрывать не только курсор , но ещё и DBHelper.
Re: SQLite вместо update делает update+insert. Это баг или ф
Ниже поля для ответа есть кнопка "Редактор".Tamachi писал(а):Набирая этот текст, я не вижу никакой панели форматирования.
Re: SQLite вместо update делает update+insert. Это баг или ф
да ерунда это всеTamachi писал(а):Кстати, с задачей разобрался. Надо было перед update закрывать не только курсор , но ещё и DBHelper.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: SQLite вместо update делает update+insert. Это баг или ф
Дык больше всего бесит то, что основной функционал программы уже давно готов. А работать приходится со всякими "мелочами". И вот на эти самые мелочи времени уходит в десятки, нет -- в сотни раз больше, чем на основной функционал. И при этом постоянно натыкаешься на сообщения о том, что та или иная фича "deprecated" -- приходится повторно копаться в том, что уже когда-то делал! Например, Notifications теперь стали пищать про "deprecated" -- приходится отвлекаться от основной канвы разработки и думать как это исправить.... Потом Eclipse IDE потребовал обновления. Обновил --- все перестало компилиться. Опять долго разбирался в причинах. Оказывается новая IDE совсем подругому работает с проектами, которые помечены как "is library". В общем время утекает на борьбу с IDE, на переписываение "deprecated"-модулей, --- на всё что угодно, только не на написание основного функционала!Olivka писал(а):да ерунда это всеTamachi писал(а):Кстати, с задачей разобрался. Надо было перед update закрывать не только курсор , но ещё и DBHelper.
Re: SQLite вместо update делает update+insert. Это баг или ф
и мне ещё вчера говорили что писать под андроид одно удовольствие хД)
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: SQLite вместо update делает update+insert. Это баг или ф
все вышеописанное - от незнания (я не говорю что я умная, еще больше ошибок делаю, но считаю что просто не все знаю и это нормальный рабочий процесс) и непонимания логики создателя.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: SQLite вместо update делает update+insert. Это баг или ф
Дык логика создателя -- она кривая!!!Olivka писал(а):все вышеописанное - от незнания (я не говорю что я умная, еще больше ошибок делаю, но считаю что просто не все знаю и это нормальный рабочий процесс) и непонимания логики создателя.
Например, почему входящие и исходящие SMS перехватываются разными методами?
Почему входящую SMS я могу перехватить с помощью BroadcastReceiver, а исходящую SMS надо ловить с помощью чтения БД контактов? Почему создатель не захотел сделать это однотипно?
Почему для Андроида до сих пор нет шаблонов проектирования? Была бы у Андроида логика -- появились бы и шаблоны проектирования.
Почему вызов функций requestlocationupdates и requestsingleupdate работают так, что первую из них лучше никогда не использовать (хотя именно она рекоммендуется создателем)?
API предлагаемое Гуглом --это скорее не API, а огромный набор "How to do"-записей, слабо связанных друг с другом.
Да, андроид впитал в себя все недостатки Java, но при этом он добавил в и без того кривой язык еще больше неразберихи.
У WinPhone и IPhone тоже непростые API, но там хотя бы есть элемент предсказуемости. У андроида же предсказуемость на нуле. И это с учетом того что я тестирую не в эмуляторе, а на реальных телефонах!
Google периодически исправляет баги, но делает он это странным образом: создает какойнибудь Manager
(CursorManager, LoadManager и пр...). В результате для того чтобы сделать приммитивную с точки зрения обычной логики вещь, необходимо созддать целую сеть Менеджеров, передавая данные из одного к другому, добавить к этому Handler, пропихнуть его в UI....
А недавно выяснилось ещё одно ужасающее обстоятельство: многие операции, например получение текущего местонахождения могут работать неправильно (или в лучшем случае не так как ожидалось) в зависимость от того, откуда они вызываются: из службы, из BroadcastReceiver или из Activity.
И об этом в официальных доках ничего не говорится!
Потом,
некоторые возможности закрываются. Например, в последнем API уже нельзя изнутри службы сделать звонок
(я имею в виду не отобразить Activity звонка, а именно -- сделать сам звонок). И с какой стати об этом нет ни слова в документации?
В общем, сплошные риски, сплошная непредсказуемость!
Re: SQLite вместо update делает update+insert. Это баг или ф
если найду ссылку то кину, на хабре была статья что 80% опрошенных по всему миру разработчиков Андроида хотели бы поменять платформу так как разработка под Андроид эм... цензура дальшеOlivka писал(а):все вышеописанное - от незнания (я не говорю что я умная, еще больше ошибок делаю, но считаю что просто не все знаю и это нормальный рабочий процесс) и непонимания логики создателя.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: SQLite вместо update делает update+insert. Это баг или ф
ладно, сдаюсь! может наоборот, это от того, что вы сильно много знаете, а мне каким-то образом удавалось всего этого избегать по жизни
может быть потому что я и не знаю так много и не разбираюсь во многом..
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: SQLite вместо update делает update+insert. Это баг или ф
Очень интересно! Откуда инфа? На опыте, или где-то прочли? Если можно, поделитесь ссылкой.Tamachi писал(а):Потом, некоторые возможности закрываются. Например, в последнем API уже нельзя изнутри службы сделать звонок (я имею в виду не отобразить Activity звонка, а именно -- сделать сам звонок). И с какой стати об этом нет ни слова в документации?
Re: SQLite вместо update делает update+insert. Это баг или ф
я знаю не больше, просто есть с чем сравнить и результат увы не в пользу АндроидаOlivka писал(а):ладно, сдаюсь! может наоборот, это от того, что вы сильно много знаете, а мне каким-то образом удавалось всего этого избегать по жизниможет быть потому что я и не знаю так много и не разбираюсь во многом..
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: SQLite вместо update делает update+insert. Это баг или ф
Просто сам проверял.=bor= писал(а):Очень интересно! Откуда инфа? На опыте, или где-то прочли? Если можно, поделитесь ссылкой.Tamachi писал(а):Потом, некоторые возможности закрываются. Например, в последнем API уже нельзя изнутри службы сделать звонок (я имею в виду не отобразить Activity звонка, а именно -- сделать сам звонок). И с какой стати об этом нет ни слова в документации?
Пробовал код, написанный для версии 2.2 откомпилить для 4.1 и запустить.
Сначала получил кучу ошибок компиляции, потом когда с этим разобрался, выяснилось, что не всё работает.
При этом функционал при тестировании вызывался из Activity (то есть в тестовом режиме), а в реальном приложении то же самое должна была делать служба. Вот тогда-то и выяснилась зловещая правда: не всё, что разрешено Activity разрешено службе. Но мне всё-таки удалось найти компромис: пришлось вызывать часть функционала из BroadcastReceiver и c помощью Intent передавать её в службу. Это значительно замедлило работу программы (теперь ясно, почему тормозят андроиды на 4-ядерных процах!!!), зато все же заявленный функционал был реализован.
Но больше всего меня бесит тот факт, что API android как бы специально провоцирует, чтобы однородные данные хранились в разных файлах. То есть нельзя выделить единый модуль для хранения, скажем информации о таком-то объекте. Волей-неволей из-за упомянутых ограничений придётся часть данных положить в один модуль, часть -- в дургой(например, для того чтобы открыть к ним доступ из службы), а оставшуюся часть -- в ресурсы (например, потому что этого требует setTag()). В результате получается весьма дурно-пахнущий код, в котором потом становится трудно разбираться.
Re: SQLite вместо update делает update+insert. Это баг или ф
Готовка приложений под Андроид, сперва более-менее проста, но когда узнаешь все подводные камни особенностей работы разных моделей, то начинаются танцы с бубном и изобретение мега-конструкций. Причем большинство из них, предназначены, чтоб обойти ограничения, которые накладывают отцы-основатели Андрода в поисках оптимизации времени автономной работы устройств.Tamachi писал(а):...
Но больше всего меня бесит тот факт, что API android как бы специально провоцирует, чтобы однородные данные хранились в разных файлах. То есть нельзя выделить единый модуль для хранения, скажем информации о таком-то объекте. Волей-неволей из-за упомянутых ограничений придётся часть данных положить в один модуль, часть -- в дургой(например, для того чтобы открыть к ним доступ из службы), а оставшуюся часть -- в ресурсы (например, потому что этого требует setTag()). В результате получается весьма дурно-пахнущий код, в котором потом становится трудно разбираться.