テーブルを永続的に並べ替える必要があります。データベースの作成方法やそのテーブルを制御することはできません。データベースとそのテーブルでさまざまなことを行ういくつかのメソッドを持つC ++で書かれたプログラムがあります。たとえば、印刷、行の呼び出し、行の更新、行のダウンロード、行の更新など、リストは続きます。
私は現在、ソートデータベースを使用しています。指定された列に関してデータベースを実際にソートする必要があり、ユーザーが指定した場合は別の列でサブソートできます。そのため、たとえばサードパーティのアプリケーションで表示された場合、並べ替えが実行された後、すべてのデータが並べ替えられて表示されます。
SELECT * FROM table1 ORDER BY Col1、Col2はソートされたテーブルを返しますが、実際のメモリの観点からは、すべてのデータはテーブルが同じであるため、データベースビューアのORDERBYの後に列1がすべて故障した場合それでも列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);
一時ビューを作成しなかった場合、またはデータベースを閉じる前にこれを繰り返す場合でも、一時ビューを作成しないと、データベースを閉じるまで一時ビューが持続するため、ビューを削除することもできます。
また、これが高速ルートであると主張しないでください。私がsqlite3_execを使用していた唯一の理由は、他の誰かの古いコードをリサイクルしたためです。自分でsqlite3_prepare_v2に置き換えますが、同じ質問を持つ他の人のためにこれを取得したかったのです。
ソース。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加