crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как вставить в таблицу базы SQLite строку в нужную позицию?
Rocky
  опции профиля:
сообщение 12.2.2009, 23:56
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Отображение таблицы базы SQLite делаю с помощью модели и QTableView. Хочу сделать удаление/добавление строк. Код взял из примера для sqlbrowser (который в demos). Удаление вроде как работает, а со вставкой проблемы. В таблицу строка вставляется туда, куда нужно, а вот после вызова submitAll(), эта добавленная строка перемещается в конец таблицы... Это так и задумано, или баг или я чето не так делаю? Если открывать эту таблицу в самом sqlbrowser, то там строка добавляется, но после нажатия кнопки submit, эту добавленную строку вообще не видать.

Таблица ключевых полей не имеет, создавалась через sql-запросы напрямую (INSERT), если надо, могу привести код создания таблицы и попыток вставки строк...

Если кто что подскажает, буду очень сильно признателен. Спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.2.2009, 0:08
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Rocky @ 13.2.2009, 2:56) *
если надо, могу привести код создания таблицы
давай
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 13.2.2009, 0:14
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


В принципе это логично, что строка в конце оказывается, т.к. при обычной работе с базой данных ты также не можешь вставить записи между какими-то другими. Нужно добавлять специальный столбец сортировки в таблицу в котором менять значения таким образом, чтобы "order by" выдавал нужную последовательность.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 13.2.2009, 0:27
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


SABROG, хитро, но в крайнемм случае придется делать так, спасибо ))

Litkevich Yuriy
//создаю таблицу (соединение с базой уже установлено)
void CMaterialDatabase::CreateInitialDatabase()
{
    QSqlQuery oQuery;
    std::ifstream file("E:\\Valtec_MSVC\\Modules\\ValtecDatabase\\materials.txt");
    if (!file) return;

    oQuery.exec(QString("DELETE FROM %1").arg(m_sInternalDatabaseName));
    oQuery.exec(QString("CREATE TABLE %1 (MaterialGroup varchar(200), MaterialName varchar(200), K1 varchar(20), K2 varchar(20))").arg(m_sInternalDatabaseName));
    
    char szBuf[128];
    while (!file.eof())
    {
        oQuery.prepare(QString("INSERT INTO %1 VALUES(:MaterialGroup, :MaterialName, :K1, :K2)").arg(m_sInternalDatabaseName));
        
        file.getline(szBuf, 128, ';');
        file.getline(szBuf, 128, ';'); oQuery.bindValue(":MaterialGroup", szBuf);
        file.getline(szBuf, 128, ';'); oQuery.bindValue(":MaterialName", szBuf);
        file.getline(szBuf, 128, ';'); oQuery.bindValue(":K1", szBuf);
        file.getline(szBuf, 128, ';'); oQuery.bindValue(":K2", szBuf);
        file.getline(szBuf, 128, ';');
        
        if (!oQuery.exec())
        {
            QString s = oQuery.lastQuery();
            s;
        }
    }

    file.close();
}
//показываю таблицу
void CMaterialDatabase::ShowContent()
{
    QSqlTableModel *pModel = new QSqlTableModel();
    if (!pModel) return;

    pModel->setTable(m_sInternalDatabaseName);
    pModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    pModel->select();

    pModel->setHeaderData(0, Qt::Horizontal, qApp->tr("1"));
    pModel->setHeaderData(1, Qt::Horizontal, qApp->tr("2"));
    pModel->setHeaderData(2, Qt::Horizontal, qApp->tr("3"));
    pModel->setHeaderData(3, Qt::Horizontal, qApp->tr("4"));
    
    ValtecCommonDatabase::CDataBrowserDialog *pDataBrowserDialog = new ValtecCommonDatabase::CDataBrowserDialog(pModel);
    pDataBrowserDialog->exec();
}

//сам диалог с таблицей (конструктор и пара функций)
CDataBrowserDialog::CDataBrowserDialog(QSqlTableModel *pModel, QWidget* pParent) : QDialog(pParent)
{
    setupUi(this);

    m_pModel = pModel;
    m_pDataTableView->setModel(pModel);
    .......................

    QDialog::connect(m_pAddABtn, SIGNAL(clicked()), this, SLOT(OnAddRowAfter()));
    QDialog::connect(m_pAddBBtn, SIGNAL(clicked()), this, SLOT(OnAddRowBefore()));
    QDialog::connect(m_pDelBtn, SIGNAL(clicked()), this, SLOT(OnDelRow()));
    ............................
}

void CDataBrowserDialog::OnAddRowAfter()
{
    QModelIndex oInsertIndex = m_pDataTableView->currentIndex();
    int nRow = oInsertIndex.row() == -1 ? 0 : oInsertIndex.row() + 1;
    bool bRetVal = m_pModel->insertRow(nRow);
    oInsertIndex = m_pModel->index(nRow, 0);
    m_pDataTableView->setCurrentIndex(oInsertIndex);
    m_pDataTableView->edit(oInsertIndex);
}

void CDataBrowserDialog::OnAddRowBefore()
{
    QModelIndex oInsertIndex = m_pDataTableView->currentIndex();
    int nRow = oInsertIndex.row() == -1 ? 0 : oInsertIndex.row();
    bool bRetVal = m_pModel->insertRow(nRow);
    oInsertIndex = m_pModel->index(nRow, 0);
    m_pDataTableView->setCurrentIndex(oInsertIndex);
    m_pDataTableView->edit(oInsertIndex);
}

Удаление строки работает.. А вставку делаю вот так..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.2.2009, 2:56
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Rocky, а SABROG, совершенно прав!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 16.2.2009, 12:58
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Ок, а как правильно это организовать? Я делаю так:
QModelIndex oInsertIndex = m_pDataTableView->currentIndex();
int nRow = oInsertIndex.row() == -1 ? 0 : oInsertIndex.row() + 1;
m_pModel->insertRow(nRow);

oInsertIndex = m_pModel->index(nRow, 0);
m_pDataTableView->setCurrentIndex(oInsertIndex);
m_pDataTableView->edit(oInsertIndex);

const int nRowNum = m_pModel->rowCount();
for (int i = 0; i < nRowNum; ++i)
{
    QSqlRecord oSqlRecord = m_pModel->record(i);
    oSqlRecord.setValue("id", i + 1);
    m_pModel->setRecord(i, oSqlRecord);
}


Т.е. добавил поле ID, и после вставки новой строки перенумеровываю всю таблицу.... И штука в том, что таблица перенумеровывается, но вот после вызова submitAll ничего не происходит, новый записи не сохраняются, и измененные ID тоже не сохраняются... В чем беда?

поле id создавал так: id INTEGER PRIMARY KEY AUTOINCREMENT

--
Добавлено
Попробовал создавать таблицу с полем просто id INTEGER. Результат то же. :(

Сообщение отредактировал Rocky - 16.2.2009, 13:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 21:59