0

共通のsqlite データベースに格納された単純なテーブルを持つアプリがあります。アプリにはmainviewと他のいくつかのビューがありview1, view2, ....,viewNます。からmainview、ユーザーは次のview1コード セクションに移動します。

screen.modalTransitionStyle=UIModalTransitionStyleCoverVertical;
        [self presentModalViewController:screen animated:YES];

ではview1、ユーザーはデータベースにアクセスして何かを行い、データベースを更新して、完全view1に に戻りmainviewます。

[self dismissModalViewControllerAnimated:YES];

ユーザーは、他のビューに対しても同じことを行います。つまり、データベースにアクセスし、何かを実行し、データベースを更新してから、mainview.

私の質問は、シングルトンを使用して共通オブジェクトを作成し、でデータベースを開く方法で、私の場合にデータベースをどのように編成する必要があるかですmainview。次に、すべてのビューがデータベースにアクセスして更新するか、各ビューがデータベースを開いてアクセスします。個別に更新するか、他の効率的な方法はありますか。ありがとうございました

4

2 に答える 2

2

アプリの構造が1つのスレッドのみであると説明しているように、シングルトンの使用は完全に問題ありません。アプリの起動時に一度だけDBを開く必要があり、アプリが終了したとき、またはアプリがバックグラウンドになったときにも必ずDBを閉じてください(もちろん、バックグラウンドから戻ったときにもDBを開く必要があります)

ちなみに、ビューごとにDBを開いたり閉じたりしようとしましたが、これもうまくいきます。このアプローチでは、「ダーティ」フラグを使用することもあります。これは、閉じる前に DB を更新する必要があることを示すために設定されますが、パフォーマンスに違いはありません。

シングルトンを使用する代わりに、クラス変数を使用するか、アプリデリゲート内で宣言することもできます。これは、コアデータのコテキストに対して行われることがよくあります(コアデータの「コンテキスト」は、DB に似ています)。

どのようなアプローチを使用する場合でも重要なのは、たとえば電話によってアプリが「中断」される可能性があるため、DB が常に一貫した状態になることです。

ちなみに、私は状況が許せば iPhone でより頻繁にコア データを使用する傾向があります。これは、コア データが DB の問題の多くを処理するためです。一貫した状態での保存のみを明示的に行う必要があります。ただし、データがより大きなDBであるか、単に「いくつかの」永続的なオブジェクト/属性であるかによって異なります。

于 2012-09-09T17:26:38.107 に答える
0

SQLite DB を呼び出すための C レベルのコードを避けることをお勧めします - SQLite の単純なラッパーを試してください - https://github.com/JohnGoodstadt/EasySQLiteを参照してください

これは、「接続」するときにシングルトンを使用します。

self.db = [DBController sharedDatabaseController:@"MyDB.sqlite"];

その後、任意のファイルが共有シングルトンにアクセスできます。

int personCount = [_db  ExecuteScalar:@"SELECT count(*) FROM person" asInt:YES];

DataTable* table = [_db  ExecuteQuery:@"SELECT firstname,lastname FROM person"];

for (NSArray* row in table.rows)
{
   NSString* firstname = row[0];
   NSString* firstname = row[1];
   ...
}
于 2012-09-14T17:11:45.683 に答える