2

3 つのテーブル (シニア マネージャー、マネージャー、従業員) を含むローカル Sqlite DB があり、3 つのテーブルすべてが相互に関連しています。データ用に 3 つの NSObject クラス (wrt テーブル) を作成しました。これで、これらのテーブルにクエリを実行し、それらの NSobject クラスのオブジェクトを作成して更新する Controller クラスがあります。最後に、これらのオブジェクトをそのクラスの配列に追加します。

ここで、3 つのビュー コントローラー (VC1、VC2、VC3) があるとします。したがって、VC1 から VC2 に移動したときに、データ コントローラー クラスを呼び出し、クエリを作成し、データ コントローラー クラスから配列を取得して、これらのデータを 3 つのテーブルビューに表示します。私のVC2.So今では、新しいシニアマネージャー/マネージャーを追加/削除して、VC2の別のテーブルビューに表示できます。

したがって、私の問題は、VC2 から VC1 に戻って、VC2 に戻ったときに、追加/削除された行が表示されないことです。私のviewDidLoadでは、データコントローラークラスから配列を取得しようとしているため、DBに存在するデータが再び表示されます。

制限があることに注意してください。これらの追加/削除操作データをDBに書き込みたくありません。したがって、アプリケーションを再起動するたびに、DB に存在するデフォルトのデータを表示する必要があります。

この問題を解決するために体を助けることができますか?したがって、アプリケーションのオープンからクローズまで、これらのデータを維持できます。

4

3 に答える 3

0

DB からロードされた配列をキャッシュするだけです。おおよそ次のことができます。

@implementation DataController

static NSMutableArray *managers;

//Note: not thread-safe
- (NSMutableArray*) managers {
    if (!managers)
      managers = loadDefaultManagers();//queries default data from sqlite db and loads array

    return managers;
}

- (void) addManager:(NSDictionary*) manager {
  [managers addObject:manager];
}
...

@end
于 2012-12-15T20:23:43.700 に答える
0

起動から起動までデータを保持したい場合は、データを耐久性のある場所、ファイル、DB、iCloud などに保存する必要があります。

于 2012-12-15T19:04:54.790 に答える
0

バンドルからデータベースを開いていますか? バンドル内のデータベースに変更を保存することはできません。バンドルからデータベースをコピーして、Documentsそのデータベースを開く必要があります。また、セッション間でデータベースを保存したくないDocuments場合は、アプリの最初の起動時にバンドルからデータベースを常にコピーしてください。Documents(通常、人々はデータベースが にまだ存在しない場合にのみバンドルからコピーしますDocumentsが、常にコピーしたいようです。)

データベースをコピーするには、次のようにします。

NSString *databaseName = kDatabaseName; // obviously, replace this with your database filename

NSString *documentsFolder      = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *databaseDocumentPath = [documentsFolder stringByAppendingPathComponent:databaseName];
NSString *databaseBundlePath   = [[NSBundle mainBundle] pathForResource:databaseName ofType:@""];

NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;

if (![fileManager copyItemAtPath:databaseBundlePath
                          toPath:databaseDocumentPath
                           error:&error])
    NSLog(@"Unable to copy database from '%@' to '%@': error = %@", databaseBundlePath, databaseDocumentPath, error);

これを行うと、 が指すデータベースを開くことができますdatabaseDocumentPath

于 2012-12-15T19:07:21.633 に答える