LINUX.ORG.RU

Qt4. QSqlRelationalModel + QDataWidgetMapper и потеря текущей строки.


0

0

В процессе работы с реляционной моделью объект типа QDataWidgetMapper может потребовать нескольких вызовов setCurrentIndex. (Например, для того чтобы создать записи в подчиненной таблице сперва надо создать запись в главной таблице.) Однако между вызовом insertRecord и submit в главной таблице могут появиться/исчезнуть записи (из-за многопользовательской природы) и первоначальное значение свойства currentIndex может оказаться неверным...

Есть мысль для каждого mapper'а создавать отдельную модель и маскировать все лишние записи по ключу, но что делать если ключ заранее неизвестен, напр. Он устанавливается по autoincrement'у.

Есть еще идея такая – заставить модель при выполнении INSERT emit-ить сигнал с значением query->lastInsertId().

Заранее спасибо.

anonymous

> QDataWidgetMapper
Ух ты! Спасибо. А я и не знал о таком полезном классе! ;-)

UVV ★★★★★
()

> В процессе работы с реляционной моделью объект типа QDataWidgetMapper может потребовать нескольких вызовов setCurrentIndex.
Может я что-то недопонял, но ведь при изменении текущей записи автоматически происходит setCurrentIndex. Я не думаю, что это правильное решение - создавать запись в подчинённой таблице между insertRecord и submit.

UVV ★★★★★
()
Ответ на: комментарий от zensey

> А что вы предлогаете блокировать всю таблицу?
А не проще сначала вставить записи в подчинённую таблицу, а потом в главную?

UVV ★★★★★
()
Ответ на: комментарий от UVV

>А не проще сначала вставить записи в подчинённую таблицу, а потом в главную?

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

zensey
()
Ответ на: комментарий от zensey

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

Как это нарушит целостность? Сначала пишешь в одну таблицу, затем в другую. Тем более, что в документации ясно написано:

Note that QDataWidgetMapper keeps track of external modifications. If the contents of the model are updated in another module of the application, the widgets are updated as well.

Что-то я не пойму, как тебе может помешать currentIndex?

UVV ★★★★★
()
Ответ на: комментарий от UVV

>Что-то я не пойму, как тебе может помешать currentIndex?

Ну допустим на момент map.setCurrentIndex(row) в модели было:

 ID NAME
 1  BEAR
 2  DONKEY
 3  RABBIT
 *
 * - редактируется в mapper, row==3

Затем пользователь сохраняет запись, происходит вызов model.submit,
произойдет повторная выборка. 
Но вот незадача - кто-то удалил первую запись. Имеем:

 ID NAME
 2  DONKEY
 3  RABBIT
 4  OWL
 
Соответственно нужно повтоно вызвать map.setCurrentIndex(row), где
row==2, иначе дальнейшее редактирование в маппере будет невозможно,
так как строки 3 не существует.

zensey
()
Ответ на: комментарий от zensey

Проверил данную ситуацию. Данные просто уходят в никуда.

Я просто только сейчас узнал о таком механизме редактирования данных. А сейчас использую обычные запросы на обновление. Если узнаешь как разрешить эту ситуацию, то напиши, т.к. это удобнее, чем запросы на обновление.

UVV ★★★★★
()

Сейчас задам твой вопрос в лист рассылки

UVV ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.