Я работаю над этой проблемой в течение недели, и я гуглил и искал переполнение стека, прочитал около 40 сообщений, до сих пор не могу решить свою проблему. вот что я сделал: 1. Я написал тестовое приложение для создания базы данных sqlite и предварительной загрузки данных. 2. Я создаю свое приложение и копирую предварительно загруженную БД в папку ресурсов. 3. Я написал следующий код для получения БД:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (!self.myDataBase) {
NSURL *url = [self localDocumentsDirectoryURL];
url = [url URLByAppendingPathComponent:@"myDB/"];
self.myDataBase = [[UIManagedDocument alloc] initWithFileURL:url];
}
return YES;
}
-(NSURL*)localDocumentsDirectoryURL {
static NSURL *localDocumentsDirectoryURL = nil;
if (localDocumentsDirectoryURL == nil) {
NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory,NSUserDomainMask, YES ) objectAtIndex:0];
localDocumentsDirectoryURL = [NSURL fileURLWithPath:documentsDirectoryPath];
}
return localDocumentsDirectoryURL;
}
- (void)useDocument
{
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.ICCarDataBase.fileURL path]])
{
[self.ICCarDataBase saveToURL:self.ICCarDataBase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {}];
}
else
{
[self.ICCarDataBase openWithCompletionHandler:^(BOOL success) {}];
}
}
- (void) setICCarDataBase:(UIManagedDocument *)carDataBase
{
if (_ICCarDataBase != carDataBase) {
_ICCarDataBase = carDataBase;
[self useDocument];
}
}
Затем, когда я запускаю myApp в симуляторе, myApp успешно получает данные БД, а когда я запускаю его на своем iPhone, myApp не может получить данные БД. Я не знаю, имеет ли значение версия SDK, потому что симулятор — iphone 5.1, а мой iPhone — 5.0 (джейлбрейк). И я не использую какие-либо специальные функции 5.1 в своем приложении.
Некоторые говорят, что вы должны сначала скопировать базу данных в каталог документов, чтобы она заработала, я пробовал решение, все еще работает нормально в симуляторе, но нет данных в iPhone. Кроме того, я просмотрел папки iphone с помощью iTool, папка myDB уже находится в каталоге документов. Сообщение предлагает решение здесь: Предварительная загрузка основная база данных в iOS 5 с UIManagedDocument
Другой говорит, что я должен использовать persistenceStoreCoordinator напрямую. Но я думаю, что UIManagedDocument мог бы работать в моей ситуации, поскольку он сам создает неявный объект persistenceStoreCoordinator.
Любое предложение о том, что не так с myApp?
И кто-нибудь может сказать мне, почему ios обертывает sqlite DB двумя слоями папок и называет фактический sqlite db persisentStore?