2

ここで同様の性質の他の質問を調べましたが、それらはすべて、アプリの更新時に以前の sqlite db を置き換えることに関連しています。以前のすべてのアプリでそれを行ってきました。それらは本質的に参照であり、単純な置き換えで十分だったからです。

私が使用しているこの特定のアプリはクイズ ゲームであり、スコアを維持する必要があります。現時点では約 15 の質問がある 4 つのレベルがあり、後の更新でこれらが増える可能性があります。私はこれまでにこれをやったことがないので、好奇心が強く、初めてこれを正しい方法で行うつもりです. だからここに私の質問があります:

  1. SO の教祖が推奨するコンテンツを更新する好ましい方法は何ですか? バージョン番号 (おそらく DB 自体) を持ち、新しいアプリの最初の実行時に、新しいコンテンツがテーブルに挿入されますか?
  2. 挿入クエリを格納するための推奨される方法は何ですか? 実装ファイルでハードコーディングする必要がありますか?

PS。データベースを Documents ディレクトリにコピーして、アプリの更新後も保持されるようにします。

EDIT:クイズアプリは一種の「ロゴクイズ」レプリカであり、すべての質問のスコア(または回答/未回答の質問のステータス)を維持する必要があることを追加する必要がありました. したがって、最初のバージョンには 60 の質問があり、ユーザーが回答するとステータスが変更されます。

編集2:これは、私が最も懸念しているテーブル、質問テーブルの構造です:

_id (整数、プライマリ キー)、levelId (整数)、QuestionImage (Varchar)、CorrectAnswer (Varchar)、boolAnsweredCorrectly (整数)。

クイズはロゴスクイズのようなものです。画像があり、ユーザーは答えを入力する必要があります。入力された回答が DB の正解と一致する場合、boolAnsweredCorrectly が true に設定されます。私の主な関心事は boolAnsweredCorrectly (結果に応じて 0 または 1 になります) です。

編集 3: アプリの更新時にデータを挿入することについて話すときは、これを意味します。最初のバージョンに 60 の質問があったとします。2 番目のバージョンでは、40 の新しい問題が追加されています。そのため、ユーザーがアプリを 2 番目のバージョンに更新するときに、新しい 40 個の質問を質問テーブルに挿入する必要があります。これは、前の 60 の質問が台無しにされず、そのまま残るように追加されます。

4

2 に答える 2

2

SO の教祖が推奨するコンテンツを更新する好ましい方法は何ですか? バージョン番号 (おそらく DB 自体) を持ち、新しいアプリの最初の実行時に、新しいコンテンツがテーブルに挿入されますか?

個人の回答の結果を保存するためだけにデータベースを使用しているかどうかによって異なります (その場合、その人のクイズの回答を保存する以外に、テーブルに「挿入」する必要はおそらくありません) または元の質問を保存する別のテーブルがあるかどうか (サーバー インターフェイスを介して新しい質問を配信しない場合は、おそらく意味があります)。

私は個人的に、" . . "の形式のテーブルのdatabase_versionフィールドを使用します。ここでは、データベースの更新を必要とするデータベースの変更を前提としていますが、変更は必要ありません)。しかし、私はこのデータベースのバージョン番号システムを使用して、バンドルのデータベースを に再コピーするかどうかを判断しています(ただし、これはデータベースの構造的な変更に対してのみ行い、サーバー インターフェース経由で新しいデータを取得することを好みますが、これはあなたのソリューションが設計されています)。データベースを再度コピーすることをプログラムで決定した場合、ただし、保存する必要があるデータがある場合は、Retterdesdialogs のポイントまで、古いデータベースのデータを新しいデータベースに保存することをお勧めします。configurationmajorminorrevisionmajorminorrevisionDocuments

挿入クエリを格納するための推奨される方法は何ですか? 実装ファイルでハードコーディングする必要がありますか?

INSERTとにかく、大量のハードコードされたステートメントを持つべきではないと思うので、これは問題になりません。以下のコメントから、ユーザーが以前に持っていたバージョンに基づいて新しい質問レコードを挿入しようとすることが予想されることがわかりました。

個人的には、私はもっとそうする傾向があります

  • バンドル内のデータベースに最新かつ最大の質問を入れてください
  • Documentsアプリが期待していたものに対して、アプリがデータベース バージョンのバージョンをチェックするようにします。
  • 異なる場合 (a) ユーザーの古い回答を保存します。(b) 新しいデータベースをバンドルから にコピーしDocumentsます。(c) 古いデータベースの回答に基づいて、新しいデータベースの回答を更新します。

確かにプログラムでレコードを挿入することもできますが、アプリの 20 番目のリリースに到達したときにどのような生活になるか想像してみてください。以前のバージョンのアプリはそうでした (ユーザーが常に以前のバージョンを使用しているとは想定できないため、いくつかのバージョンが古くなっている可能性があります)。そして、各バージョンが質問の追加、削除、および変更の組み合わせであると考えると、さらに厄介になります。

要するに、私は現在の質問のデータベースに傾倒し、必要にDocuments応じてそれをコピーし、アプリに古い回答のある古いデータベースがあるかどうかを確認してから、それらを手動で保存します。(または、回答を別のデータベースに保存することもできます。)

または、これはあなたが食い物にしたい以上のものだと思いますが、推奨される iOS 永続ストレージ モデルであるCore Dataの使用を検討することをお勧めします。Core Data Model Versioning and Data Migrationで説明されているように、この移行の問題は解決されたようです。私は Core Data の移行/バージョン管理機能を使用したことはありません (これまで、私は常に独自のものを使用してきました) が、有望に見えます。

于 2012-08-23T08:00:24.297 に答える
1

疑似コードで次のようにします。

// if old database exists in documents directory
// get scores
// delete old database
// copy the new database from bundle to documents directory
// update scores in the new database

古いデータベースが古いデータベースかどうかを確認するには、名前を確認するか、「is Questions == 15」のように somthink を実行します。

于 2012-08-23T07:22:54.830 に答える