我需要永久地对表格进行排序。我无法控制数据库的创建方式或表格。我有一个用c ++编写的程序,它有几个方法可以对数据库及其表做不同的事情。例如打印,调用行,更新行,下载行,更新行和列表继续。
我目前正在使用排序数据库。它需要实际按照指定的列对数据库进行排序,如果用户指定了列,则可以按另一列进行子排序。因此,在完成排序之后,如果使用第三方应用程序查看它,则所有数据都将显示为已排序。
我知道SELECT * FROM table1 ORDER BY Col1,Col2会返回已排序的表,但是从实际的内存站点来看,所有数据的表仍然是相同的,所以如果col 1在ORDER BY之后全部乱序数据库查看器仍会显示col 1全部乱序。排序后,应对数据库中的数据进行排序,并在数据库查看器中查看时,它们都是有序的。
这是我第一篇文章的完整编辑。 FYI
答案 0 :(得分:1)
在@RogerRowland的帮助下,我能够解决这个问题,但对那些希望和我做同样事情的人来说。为什么你真的想要这样做我不知道,但如果你需要实际排序数据库表的数据,而不是只返回已排序的数据,并使用sqlite3和c ++,这就是你想要做的。
步骤1)
rc = sqlite3_prepare(this->dbPointer, "CREATE [TEMP] VIEW tempViewOfSortedTable AS SELECT * FROM tableName ORDER BY columnName", -1, &ppStmt, NULL);
第2步) 获取所有表信息(列名和类型以及不包含的内容)并将其存储在带有。
的字符串中rc = sqlite3_prepare_v2(this->dbPointer, "pragma table_info tableName", -1, &ppStmt, NULL);
步骤3)创建一个与原始列具有相同列和属性的新表。
sprintf(strQuery, "CREATE TABLE tempUserTable (%s)", strListOfFieldsAndTypes);
if (rc == SQLITE_OK)rc = sqlite3_exec (this->dbPointer, strQuery, NULL, NULL, &errMsg);
步骤4)将所有视图的已排序数据复制到新表中。
sprintf(strQuery, "INSERT INTO tempUserTable SELECT %s FROM tempViewOfSortedTable", strListOfFields);
if (rc == SQLITE_OK)rc = sqlite3_exec (this->dbPointer, strQuery, NULL, NULL, &errMsg);
步骤5)删除旧表
if (rc == SQLITE_OK)rc = sqlite3_exec (this->dbPointer, "DROP TABLE tableName", NULL, NULL, &errMsg);
步骤6)如果需要,将新表重命名为旧名称。
if (rc == SQLITE_OK)rc = sqlite3_exec (this->dbPointer, "ALTER TABLE tempUserTable RENAME TO 'tableName'", NULL, NULL, &errMsg);
如果您没有创建临时视图,或者在关闭数据库之前要重复此操作,您可能还想删除该视图,因为如果您不执行临时视图,则关闭数据库。 / p>
同样无论如何不要声称这是快速路线。我使用sqlite3_exec的唯一原因是因为我回收了别人的旧代码,我将自己用sqlite3_prepare_v2替换它,但是想要为其他任何有同样问题的人解决这个问题。
源。