2013-09-04 3 views
2

Я изучаю SQLite и C++ в рамках Qt. В качестве учебного проекта я делаю простой просмотрщик изображений, который позволяет пользователю отмечать изображения ключевыми словами, категориями, комментариями и ROI (для некоторых более поздних функций OpenCV). Это довольно простая база данных с некоторыми основными таблицами и некоторыми реляционными таблицами.Написание SQLite-менеджера: жизнеспособный подход?

Я думаю, что у меня есть основы, и ранние тесты показывают, что мои данные записи хранятся, но при написании методов управления базой данных похоже, что я собираюсь в конечном итоге использовать множество методов, особенно когда Я начинаю добавлять в поиск, сортировку, удаление и т. Д.

Это заставляет меня спросить, правильно ли я делаю это. Я вижу, как некоторые из моих логических запросов (для поиска, сортировки), вероятно, лучше относятся к другому классу типа «контроллер» и что все, что требуется этому классу менеджера, - это выполнять основные задачи создания и удаления и просто возвращать объект запроса в ответ на оператор SELECT, переданный в виде строки.

Итак, я собираюсь об этом разумным способом?

(. Кроме того, для кого проголосовал, чтобы закрыть этот вопрос, было бы полезно, если бы вы оставили комментарий, так что я могу улучшить его спасибо)

методы // менеджер до сих пор:

bool openDatabase(QString name); 
void closeDatabase(); 
bool createTables(); 
bool addKeyword(QString keyword); 
bool addCategory(QString category); 
bool deleteKeyword(QString keyword); 
bool deleteCategory(QString category); 
bool addROI(int x, int y, int width, int height); 
bool deleteROI(int id); 
bool addImage(QString name, QString path, QByteArray image, QByteArray thumb); 
+0

Я также занимаюсь SQL с Qt. Но у меня есть только одна функция для вставки, удаления и т. Д. Эти функции могут использоваться для любой таблицы. Вставка, например, принимает следующие аргументы: имя таблицы, столбцы и значения. – Davlog

+0

@Davlog - да, это имеет смысл. Конечно, я могу избавиться от ряда моих методов. Вы нашли способ справиться с этим, когда в записи есть различное количество полей? (например: мой 'addROI' против' addKeyword' выше) –

+0

Я отправил свою функцию вставки, надеюсь, что это ответит на ваш вопрос. – Davlog

ответ

0

Я видел DatabaseManager класс где-то и изменить его. Это функция вставки:

bool DatabaseManager::insert(const QString &tableName, const QString& columns, const QString &value) 
{ 
    bool ret = false; 
    if(db.isOpen()){ 
     QSqlQuery query; 
     ret = query.exec(QString("INSERT INTO %1 (%2) VALUES(%3)").arg(tableName, columns, value)); 
    } 
    return ret; 
} 

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

if(!dm.insert("Product", "ID, Name, Price, Notes, Category", 
       "'1', 'A DVD','10€', 'Some Notes', 'DVD'")) 
{ 
//Note that each value is surrounded by an apostrophe 
//Now whatever you want to 
} 
+0

Спасибо. У меня наконец появился такой подход - эти одиночные кавычки сложны! Я пытался использовать подход prepare/bindValue, но этот способ намного более гибкий. Для справки, может быть, это был пример Qt/SQLite, с которого вы начали? :: http://developer.nokia.com/Community/Wiki/Inserting_a_row_into_a_database_in_Qt –

+0

Да, точно. – Davlog

1

Вы, вероятно, следует использовать механизм Qt Model View Framework. Важными классами являются QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel. Чтобы ваш интерфейс был изолирован от структуры базы данных, разумным подходом было бы добавить view models для конкретных случаев использования. Затем вы можете легко связать их, например, с пользовательским интерфейсом Qt Quick.

Нет ничего особенного в функционально-ориентированном интерфейсе, который вы предлагаете, за исключением того, что для его использования для пользовательских интерфейсов требуется много скучного кода. Лучше всего использовать такой код клея, как модель прокси-представлений, поскольку вы работаете с документированным API, который затем легко подбирается сотрудниками.

Смежные вопросы