0

という名前のプロジェクトに定義済みでプリロードされたデータベースがあり、Database次のように定義していました。AppDelegate

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (__persistentStoreCoordinator != nil) {
    return __persistentStoreCoordinator;
}



NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"Database.sqlite"];



NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Database.sqlite"]; //este es el que sirve!!! CREE ESTE

//  NSLog(@"store URL %@", storeURL);

// Put down default db if it doesn't already exist
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:writableDBPath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Database" ofType:@"sqlite"];


    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:writableDBPath error:NULL];
    }
}    

NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return __persistentStoreCoordinator;
}

そして、どのクラスでも、使用するデータベースからデータを呼び出したい:

-(NSArray *)sqlCall {


AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"MotherWeekly" inManagedObjectContext:context];
NSFetchRequest *request = [[ NSFetchRequest alloc] init];
[request setFetchLimit:1];
[request setEntity:entityDesc];
NSString *a =[NSString stringWithFormat:@"%@==%d",@"id",pageNumber];
NSPredicate *pred = [NSPredicate predicateWithFormat:a];
[request setPredicate:pred];

NSError *error;
NSArray *objects = [context executeFetchRequest:request
                                          error:&error];

[request release];
return objects ;
}

問題は、プリロードされたデータベースのフィールドを更新してシミュレーターまたは iPhone で実行すると、データが更新されたものではなく古いものに見えることです。

PS:この問題に気付く前にアプリを AppStore に提出していたので、バイナリを拒否し、動作中または更新されたデータベースで新しいバージョンをアップロードするので、助けてください

前もって感謝します

4

1 に答える 1

1

明らかに、新しく更新されたストアがある場合、ストアは削除されません。したがって、古い値が表示されます。

新しいストアがある場合にストアを削除する場合はNSUserDefault、バージョンまたは更新が必要かどうかを示す何かを確認できます。はいの場合は、永続ストアを削除し、新しいストアをコピーして、ユーザー デフォルトを新しいバージョンに設定します。

ただし、すべてのユーザー データが失われます。これには 2 つの解決策があります。

1) 「静的」データ用とユーザー データ用の 2 つの永続ストアを使用できます。ただし、これは少し複雑すぎる可能性があります。

2) または、変更されたデータの情報を含めて、データベースを更新することもできます (データベースが存在しない場合、つまり新規インストールの場合のみコピーします)。これにより、ユーザーデータも保持されます。実際、更新する必要があるデータがそれほど多くない場合、データベース全体を再度コピーすることは意味がないようです。

実際、コピーするデータベースのレコード数が 10,000 未満の場合、コア データの永続ストアをコピーすることは問題になる可能性があります。あらゆる種類のファイルから読み取る代わりに、起動時にバックグラウンドですばやく挿入できます。

于 2013-07-15T18:53:16.333 に答える