【发布时间】:2015-08-20 08:40:08
【问题描述】:
我是第一次使用 coredata,我必须从文档目录中的 iCloud 备份中限制 sqlite db 文件,我使用以下代码完成了它
-(id)init
{
if((self = [super init]))
{
NSURL* documentsDirectoryURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL* modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
NSURL* giveForwardSqliteURL = [documentsDirectoryURL URLByAppendingPathComponent:@"InfoCollection.sqlite"];
NSError* error;
m_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
m_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:m_managedObjectModel];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if ([m_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:giveForwardSqliteURL options:options error:&error])
{
m_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[m_managedObjectContext setPersistentStoreCoordinator:m_persistentStoreCoordinator];
[self addSkipBackupAttributeToItemAtPath:giveForwardSqliteURL];
}
else
{
NSLog(@"Failed to create or open database: %@", [error userInfo]);
return nil;
}
}
return self;
}
//防止iCloud备份文档目录文件夹
- (BOOL)addSkipBackupAttributeToItemAtPath:(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;
}
现在我不明白的是,我们是否还需要限制来自 icloud 备份的 sqlite-wal 和 sqlite-shm 文件,如果是,那么 如何限制来自 icloud 备份的 sqlite-wal 和 sqlite-shm 文件
我想要一个解决方案,而不需要从文档目录文件夹中更改 sqlite db 位置......我们该怎么做
以上代码如有错误请指正
提前致谢
【问题讨论】:
-
如果我们需要跳过它们,为
wal和shm文件创建 URL 并将它们传递给添加跳过属性方法应该非常简单。问题是我们是否需要这样做,如果是,何时因为这些文件可能不会在创建持久存储时创建。此外,WAL 日志会定期合并到主数据库中并重新创建等。我们如何跟踪这些更改? -
@lukya 我不知道该做什么以及如果我这样离开会发生什么......所以我添加了这些行'if ([[NSFileManager defaultManager] fileExistsAtPath:[sqliteShmURL path ]]) { [self addSkipBackupAttributeToItemAtPath:sqliteShmURL]; } if ([[NSFileManager defaultManager] fileExistsAtPath:[sqliteWalURL path]]) { [self addSkipBackupAttributeToItemAtPath:sqliteWalURL]; }'
-
hmm.. 很奇怪.. 我想我会得到很多参考资料... 但令人惊讶的是,没有任何地方对此进行讨论... 我已经开始对这个问题进行赏金。让我们看看是否有任何有效的答案出现......
-
即使在开始赏金之后也没有活动。我想这个问题没有真正的答案。
-
我添加了question on apple developer forums。如果出现任何有用的信息,将更新此帖子。
标签: ios sqlite core-data icloud