#objective-c #core-data #sqlite #persistent-storage
#objective-c #core-data #sqlite #постоянное хранилище
Вопрос:
у меня есть хорошо заполненный файл sqlite, который я скопировал в свой проект (в папку и в окно проекта xcode)
когда я проверяю файл sqlite с помощью терминала, он работает нормально, в моем файле sqlite есть правильные данные.
Но затем я пытаюсь заполнить свой TableView данными из файла sqlite, но TableView по-прежнему пуст.
Не могли бы вы, пожалуйста, сказать мне, на что мне следует обратить внимание?
я сначала попробовал с некоторыми данными, и это работает (что прокомментировано в applicationDidFinish …), Но с моим файлом sqlite это не работает :
вот мой код: (и вот URL-адрес учебника: http://www.raywenderlich.com/980/core-data-tutorial-how-to-preloadimport-existing-data )
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSManagedObjectContext *context = [self managedObjectContext];
/*
THIS WORKS :
FailedBankInfo *failedBankInfo = [NSEntityDescription insertNewObjectForEntityForName:@"FailedBankInfo"
inManagedObjectContext:context];
failedBankInfo.name = @"the name";
failedBankInfo.city = @"the city";
failedBankInfo.state = @"the state";
FailedBankDetails *failedBankDetails = [NSEntityDescription insertNewObjectForEntityForName:@"FailedBankDetails"
inManagedObjectContext:context];
failedBankDetails.closeDate = [NSDate date];
failedBankDetails.updatedDate = [NSDate date];
failedBankDetails.zip = [NSNumber numberWithInt:12345];
failedBankInfo.details = failedBankDetails;
failedBankDetails.info = failedBankInfo;
NSError *error;
if (![context save:amp;error]){
NSLog(@"%@,", [error localizedDescription]);
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"FailedBankInfo"
inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:amp;error];
for (FailedBankInfo *info in fetchedObjects){
NSLog(@"name : %@", info.name);
FailedBankDetails *details = info.details;
NSLog(@"zip : %@", details.zip);
}
[fetchRequest release];*/
FailedBanksListViewController *root = (FailedBanksListViewController *)[_navController topViewController];
root.context = [self managedObjectContext];
[window addSubview:_navController.view];
[self.window makeKeyAndVisible];
return YES;
}
/** Returns the persistent store coordinator for the application.
If the coordinator doesn't already exist, it is created and the application's store added to it.
*/
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator_ != nil) {
return persistentStoreCoordinator_;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"FailedBanksCD.sqlite"];
/*NSString *storePath = [[self applicationDocumentsDirectory]
stringByAppendingPathComponent: @"FailedBanksCD.sqlite"];
*/
//NSURL *storeURL = [NSURL fileURLWithPath:storePath];
// Put down default db if it doesn't already exist
NSString *storePath = [NSString stringWithFormat:@"%@", storeURL];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath]) {
NSString *defaultStorePath = [[NSBundle mainBundle]
pathForResource:@"FailedBanksCD" ofType:@"sqlite"];
if (defaultStorePath) {
[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}
}
NSError *error = nil;
persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:amp;error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator_;
}
Большое спасибо
Ответ №1:
Для меня это выглядит так, как будто база данных не была скопирована в документ-каталог. Можете ли вы переместить эту часть
if (persistentStoreCoordinator_ != nil) {
return persistentStoreCoordinator_;
}
помимо этого блока if:
if (![fileManager fileExistsAtPath:storePath]) {
...
}
Вы должны удалить текущую пустую базу данных из каталога документов, прежде чем пытаться снова (удалить в симуляторе, удалить приложение с устройства и переустановить).
Комментарии:
1. спасибо ott—, к сожалению, это не обновляет представление таблицы. Если я проверю, что содержит скопированный sqlite из doc-dir,
select * from ZFAILEDBANKINFO limit 3
он ничего не покажет мне в терминале, возможно, это потому, что он зашифрован. Случайно, не могли бы вы взглянуть на мой код? я поместил zip-файл, содержащий sqlite и проект xcode, по адресу: www.pondb.com (мой личный веб-сайт).2. Вы работаете не с той базой данных? Данные, которые вы пытаетесь извлечь, находятся в banklist.sqlite3, в то время как вы скопировали базу данных FailedBanksCD.sqlite.
3. спасибо, отт …, я думаю, я что-то перепутал, когда копировал файл failedbank sqlite, должно быть, так оно и есть, потому что я пробовал снова и снова, и, наконец, это сработало. Спасибо за вашу помощь, Ваше здоровье