7

由于这个问题,我的申请被拒绝:

http://i.imgur.com/yajQh.png

我的应用程序是一个使用 SQL DB 的字典,带有书签等...

所以我从 appDelegate.m 的 Apple 文档中复制了这段代码:

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

    NSError *error = nil;
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
                                  forKey: NSURLIsExcludedFromBackupKey error: &error];
    if(!success){
        NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
    }
    return success;
}

但像这样使用:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    [self addSkipBackupAttributeToItemAtURL:[NSURL URLWithString:@"<myApplication>/Library/Caches"]];
}

但由于这个原因崩溃:

断言失败:([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]),函数 -[AppDelegate addSkipBackupAttributeToItemAtURL:],文件 /iData/Development 2011/My iPhone Project/APPNAME/APPNAME/AppDelegate.m,第 27 行。

根据那张照片,这是我唯一拒绝的问题吗?因为这是我第一次使用数据库。

谢谢 。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

编辑:

- (NSString *) getDBPath
{
    NSInteger kValue = [[[NSUserDefaults standardUserDefaults] stringForKey:@"Bv"] intValue];

    NSString *documentsDir = [[NSString alloc] init];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    documentsDir = [paths objectAtIndex:0];


    switch (kValue) {

            case 0:
            documentsDir = [NSString stringWithFormat:@"%@/eng-per.sqlite", documentsDir];
            break;
        case 1:
            documentsDir = [NSString stringWithFormat:@"%@/eng-per.sqlite", documentsDir];
            break;

        case 2:
            documentsDir = [NSString stringWithFormat:@"%@/per-eng.sqlite", documentsDir];
            break;
}

return documentsDir

}

然后在 app delegate.m 中改为:

[self addSkipBackupAttributeToItemAtURL:[NSURL fileURLWithPath:dbClass.getDBPath]];

现在应用程序午餐很好,没有崩溃

4

1 回答 1

4

您的应用程序正在“崩溃”,因为您正在在线点击该断言:

assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

而且我怀疑您的问题实际上在于您如何设置 URL:

[NSURL URLWithString:@"<myApplication>/Library/Caches"];

您如何获得“ <myApplication>”的路径?

您需要获取应用程序的真正缓存文件夹,您可以通过以下方式完成:

[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask];(对于通过文件 URL 传回的位置)

或者

NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);(对于 NSString 形式的路径)

因此,最终,您需要做的不是断言是否已将密钥设置为默认值,并且您需要为要保存的文件正确设置文件 URL。

使用以下内容创建您的 URL(准确地说是文件 URL):

NSArray * arrayOfURLs = [[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask];
// make certain there's at least one file url returned by the above call
if([arrayOfURLs count] > 0)
{
    // and this would just be the URL to the cache directory...
    NSURL * cacheDirectoryPath = [arrayOfURLs objectAtIndex: 0];

    // ... to create a file url to your actual dictionary, you'd need to add a
    // filename or path component.

    // Assuming you save this as a property within your object
    self.cacheFileURL = [cacheDirectoryPath URLByAppendingPathComponent: @"myDatabase.db"];
}
于 2012-11-21T17:38:08.250 回答