我读过这篇文章http://www.slideshare.net/redigon/refactoring-1658371 在第53页上,它指出"您有一个返回值的方法,但也改变了对象的状态。创建两个方法,一个用于查询,另一个用于修改。
但是如果在查询中我需要多于1个字段的值。
例如:
QSqlQuery query(QSqlDatabase::database("MAIN"));
QString command = "SELECT FIELD1, FIELD2, FIELD3, FIELD4, FIELD5 FROM TABLE";
query.exec( command );
这是我所知道的方法,但我真的觉得这不是那么可读
QString values;
columnDelimiter = "[!@#]";
rowDelimiter = "[$%^]";
while( query.next )
{
values += query.value(0).toString() + columnDelimiter;
values += query.value(1).toString() + columnDelimiter;
values += query.value(2).toString() + columnDelimiter;
values += query.value(3).toString() + columnDelimiter;
values += rowDelimiter;
}
我会像这样回复它。
QStringList rowValues, columnValues;
rowValues = values.split(rowDelimiter);
int rowCtr =0;
while( rowCtr < rowValues.count() )
{
columnValues.clear();
// Here i got the fields I need
columnValues = rowValues.at( rowCtr ).split( columnDelimiter );
// I will put the modification on variables here
rowCtr++;
}
编辑:有没有更可读的方法呢?
答案 0 :(得分:1)
&#34;有更可读的方法吗?&#34; 是一个主观问题。我不确定你的问题是否能在SO上持续多久,因为SO更喜欢事实上的问题和解决方案。
我个人认为会让您的代码更具可读性:
示例:
// data structure for a single row
struct MyRow {
QString a, b, c;
}
...
QList<MyRow> myDataSet;
while( query.next )
{
MyRow currentRow;
// fill with data
currentRow.a = query.value(0).toString();
currentRow.b = query.value(1).toString();
...
myDataSet.append(currentRow);
}
我怀疑你的所有数据都是文字。有些可能是数字。切勿将数字存储为字符串。那效率很低。
首先将所有数据读入数据结构,然后读取数据结构进行处理。你为什么不把两者结合起来?即在阅读数据的过程中,使用相同的while(...)
在评论中,您对enum
和struct
之间的区别感到困惑。我建议,停止做复杂的数据库和QT的东西。获取一本基础C ++书籍并尝试首先理解C ++。