Перемещение SQLite из одного места в другое: сбой приложения и несовместимый тип - PullRequest
0 голосов
/ 03 февраля 2011

Я начинаю изучать Objective-C и, чтобы помочь мне в этом, я использую "Head First iPhone Development".Теперь я изучаю базы данных SQLite, и чтобы заставить их работать, мне сказали, что файл SQLite должен находиться в папке «Документы» приложения, и поэтому мне нужно переместить файл.

Я использую примериз книги, но я не могу заставить ее работать.Каждый раз, когда я компилирую это, мое приложение вылетает.У меня есть следующее предупреждение: «Несовместимые типы Objective C, инициализирующие« struct NSURL * », ожидаемые» struct NSString * '

У кого-нибудь есть совет, как это исправить?

РЕДАКТИРОВАТЬ:

Кажется, проблема в этих двух строках с applicationDocumentsDirectory, возвращающей NSURL, но я говорю ему, чтобы возвратить NSString. Я мог бы сказать, чтобы вернуть NSURL, но это вызывает у меня проблему наСледующая строка, где я использую stringByAppendingPathComponent. Есть ли способ это исправить?

    NSString *documentsDirectory = [self applicationDocumentsDirectory];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"iBountyHunter.sqlite"];

Это то, что выводит консоль отладчика при сбое приложения:

2011-02-04 07:33:42.126 iBountyHunter[591:207] -[NSURL stringByAppendingPathComponent:]: unrecognized selector sent to instance 0x6043f80
2011-02-04 07:33:42.128 iBountyHunter[591:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSURL stringByAppendingPathComponent:]: unrecognized selector sent to instance 0x6043f80'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00f87be9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x010dc5c2 objc_exception_throw + 47
    2   CoreFoundation                      0x00f896fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x00ef9366 ___forwarding___ + 966
    4   CoreFoundation                      0x00ef8f22 _CF_forwarding_prep_0 + 50
    5   iBountyHunter                       0x00001d8e -[iBountyHunterAppDelegate createEditableCopyOfDatabaseIfNeeded] + 107
    6   iBountyHunter                       0x00001f24 -[iBountyHunterAppDelegate application:didFinishLaunchingWithOptions:] + 37
    7   UIKit                               0x002ba1fa -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163
    8   UIKit                               0x002bc55e -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 439
    9   UIKit                               0x002c6db2 -[UIApplication handleEvent:withNewEvent:] + 1533
    10  UIKit                               0x002bf202 -[UIApplication sendEvent:] + 71
    11  UIKit                               0x002c4732 _UIApplicationHandleEvent + 7576
    12  GraphicsServices                    0x018bda36 PurpleEventCallback + 1550
    13  CoreFoundation                      0x00f69064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    14  CoreFoundation                      0x00ec96f7 __CFRunLoopDoSource1 + 215
    15  CoreFoundation                      0x00ec6983 __CFRunLoopRun + 979
    16  CoreFoundation                      0x00ec6240 CFRunLoopRunSpecific + 208
    17  CoreFoundation                      0x00ec6161 CFRunLoopRunInMode + 97
    18  UIKit                               0x002bbfa8 -[UIApplication _run] + 636
    19  UIKit                               0x002c842e UIApplicationMain + 1160
    20  iBountyHunter                       0x00001cf8 main + 102
    21  iBountyHunter                       0x00001c89 start + 53
)
terminate called after throwing an instance of 'NSException'

Ответы [ 4 ]

1 голос
/ 26 июня 2011

Если приложение все еще не работает в вашем симуляторе, не забудьте удалить приложение из вашего симулятора, а затем снова скомпилируйте и запустите приложение.

Вы удаляете приложение из симулятора так же, как вы делаете это с реальным устройством.

1 голос
/ 03 февраля 2011

Я использую пример из книги но я не могу заставить его работать. Каждый раз, когда я компилирую это, мое приложение вылетает. У меня есть следующее предупреждение: «Несовместимые типы Objective-C инициализация 'struct NSURL *', ожидаемый 'struct NSString *'

Исправить предупреждение; Вы назначаете экземпляр NSURL чему-то, что ожидает экземпляр NSString.

Или опубликовать предупреждение и строку кода, которая его вызывает.

Если ваше приложение дает сбой, опубликуйте сбой.

<Ч />

Проблема, кажется, в этих двух линии с applicationDocumentsDirectory возвращая NSURL, но я говорю это вернуть строку NSString. Я мог бы сказать это вернуть NSURL, но это дает мне проблема на следующей строке, где я использую stringByAppendingPathComponent. Является Есть ли способ исправить это?

Вы не можете сообщить метод, который возвращает NSURL, чтобы вместо этого возвратить NSString. Ни приведение типа к возвращаемому значению, ни присвоение, подобное следующему, не будут работать:

NSString *documentsDirectory = [self applicationDocumentsDirectory];

Компилятор предупреждает об этой строке, потому что она не работает; Вы не можете обращаться с NSURL как с NSString.

Должно работать что-то вроде следующего:

NSString *documentsDirectory = [[self applicationDocumentsDirectory] path];
0 голосов
/ 04 февраля 2011

Это поможет.

// Check the existence of database 
        NSFileManager *mngr = [[NSFileManager alloc] init];

        // If the database doesn't exist in our Document folder we copy it to Documents (this will be executed only the first time we launch the app).
        if (![mngr fileExistsAtPath:[NSString stringWithFormat:@"%@/Documents/db.sqlite", NSHomeDirectory()]]){
            NSString *filePath = [[NSBundle mainBundle] pathForResource:@"db.sqlite" ofType:nil];
            [mngr copyItemAtPath:filePath toPath:[NSString stringWithFormat:@"%@/Documents/db.sqlite", NSHomeDirectory()] error:NULL];
        }
        [mngr release];

вот еще одна версия метода applicationDocumentsDirectory:

+ (NSString*)applicationDocumentsDirectory {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return documentsDirectory;
}
0 голосов
/ 04 февраля 2011

У меня есть следующее предупреждение: «Несовместимые типы Objective C, инициализирующие« struct NSURL * », ожидаемые» struct NSString * '

Проблема в том, что вы вызываете предоставленный яблоком метод applicationDocumentsDirectory, который возвращает NSURL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...