- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 NSFileManager 的 replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:
方法来移动 sqlite 文件,以防使用 replacePersistentStoreAtURL:destinationOptions:withPersistentStoreFromURL 无法移动该文件:sourceOptions:storeType:error:
方法。该文件包含三个组件文件 - 一个以 .sqlite 结尾,一个以 .sqlite-wal 结尾,一个以 .sqlite-shm 结尾。所有文件都使用 replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:
方法正确替换其现有副本;但是,实际上只有移动的 .sqlite 文件从其原始位置删除。 .sqlite-wal 和 .sqlite-shm 文件确实根据需要进行替换,但似乎它们实际上是复制而不是移动,因为这两个原始文件在其成功的 replacePersistentStoreAtURL:destinationOptions 末尾仍然存在。 :withPersistentStoreFromURL:sourceOptions:storeType:error:
操作。一切都发生在同一卷中,因此似乎没有理由制作副本。有人可以帮助我理解为什么会发生这种情况吗?
这是代码。稍后记录的状态消息显示为:
Successfully replaced SQLITE file. SQLITE file does NOT still exist in original location. Successfully replaced WAL file. WAL file DOES still exist in original location. Successfully replaced SHM file. SHM file DOES still exist in original location.
- (void)moveSqliteFileFromMigrateStorePathToFinalStorePathWithCompletionHandler:(void(^)(NSURL * migrateStoreURL,NSString * statusMessage,BOOL actuallyMovedFiles,BOOL movingHudIsRunning))handler {
__block NSString *statusMessage = nil;
__block BOOL actuallyMovedFiles = NO;
__block BOOL hudIsRunning = NO;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *applicationDocumentsDirectory = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSString *migrateStorePath = [applicationDocumentsDirectory stringByAppendingPathComponent:@"MyAppData.sqlite"];
NSURL *migrateStoreURL = [NSURL fileURLWithPath:migrateStorePath];
NSURL *finalStoreURL = [CoreDataController desiredFinalStoreURL];
NSString *finalStorePath = finalStoreURL.path;
NSString *fromWalPath = [migrateStorePath stringByAppendingString:@"-wal"];
NSString *fromShmPath = [migrateStorePath stringByAppendingString:@"-shm"];
BOOL walFileExists = [NSFileManager.defaultManager fileExistsAtPath:fromWalPath];
BOOL shmFileExists = [NSFileManager.defaultManager fileExistsAtPath:fromShmPath];
BOOL sqliteFileExists = [NSFileManager.defaultManager fileExistsAtPath:migrateStorePath];
if (sqliteFileExists || shmFileExists || walFileExists) {
[SVProgressHUD setForegroundColor:CPS_DARK_BLUE_COLOR];
[SVProgressHUD showWithStatus:NSLocalizedString(@"My App is updating. This one-time operation may take several minutes.",@"")];
hudIsRunning = YES;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (sqliteFileExists) {
BOOL finalStorePathFileExists = [NSFileManager.defaultManager fileExistsAtPath:finalStorePath];
NSError * sqliteMoveError = nil;
BOOL successfulSqliteMove = NO;
BOOL replacingSqliteFile = NO;
if (finalStorePathFileExists) {
replacingSqliteFile = YES;
NSURL *migrateStoreURL = [NSURL fileURLWithPath:migrateStorePath];
NSURL *finalStoreURL = [NSURL fileURLWithPath:finalStorePath];
successfulSqliteMove = [[NSFileManager defaultManager] replaceItemAtURL:finalStoreURL withItemAtURL:migrateStoreURL backupItemName:@"sqliteBackup" options:NSFileManagerItemReplacementUsingNewMetadataOnly resultingItemURL:nil error:&sqliteMoveError];//NSFileManagerItemReplacementUsingNewMetadataOnly
}
else {
successfulSqliteMove = [[NSFileManager defaultManager] moveItemAtPath:migrateStorePath toPath:finalStorePath error:&sqliteMoveError];
}
if (sqliteMoveError) {
DLog(@"The error for the SQLITE move: %@",sqliteMoveError.localizedDescription);
}
if (successfulSqliteMove) {
actuallyMovedFiles = YES;
if([NSFileManager.defaultManager fileExistsAtPath:migrateStorePath]) {
statusMessage = replacingSqliteFile?NSLocalizedString(@"Successfully replaced SQLITE file. SQLITE file DOES still exist in original location.", @""):NSLocalizedString(@"Successfully moved SQLITE file. SQLITE file DOES still exist in original location.", @"");
}
else {
statusMessage = replacingSqliteFile?NSLocalizedString(@"Successfully replaced SQLITE file. SQLITE file does NOT still exist in original location.", @""):NSLocalizedString(@"Successfully moved SQLITE file. SQLITE file does NOT still exist in original location.", @"");
}
}
else {
statusMessage = replacingSqliteFile?[NSString stringWithFormat:@"%@ (%@). ",NSLocalizedString(@"Failed to replace SQLITE file", @""),sqliteMoveError.localizedDescription]:[NSString stringWithFormat:@"%@ (%@). ",NSLocalizedString(@"Failed to move SQLITE file", @""),sqliteMoveError.localizedDescription];
}
}
else {
statusMessage = NSLocalizedString(@"No SQLITE file to move.", @"");
}
if (walFileExists) {
NSString *toWalPath = [finalStorePath stringByAppendingString:@"-wal"];
BOOL toWalFileExists = [NSFileManager.defaultManager fileExistsAtPath:toWalPath];
NSError * walMoveError = nil;
BOOL successfulWalMove = NO;
BOOL replacingWalFile = NO;
if (toWalFileExists) {
replacingWalFile = YES;
NSURL *fromWalURL = [NSURL fileURLWithPath:fromWalPath];
NSURL *toWalURL = [NSURL fileURLWithPath:toWalPath];
//successfulWalMove = [[NSFileManager defaultManager] replaceItemAtURL:fromWalURL withItemAtURL:toWalURL backupItemName:@"walBackup" options:NSFileManagerItemReplacementUsingNewMetadataOnly resultingItemURL:nil error:&walMoveError];
//THE ABOVE CODE WAS WRONG, WHICH WAS WHAT WAS CAUSING THE ISSUE
successfulWalMove = [[NSFileManager defaultManager] replaceItemAtURL:toWalURL withItemAtURL:fromWalURL backupItemName:@"walBackup" options:NSFileManagerItemReplacementUsingNewMetadataOnly resultingItemURL:nil error:&walMoveError];
}
else {
successfulWalMove = [[NSFileManager defaultManager] moveItemAtPath:fromWalPath toPath:toWalPath error:&walMoveError];
}
if (walMoveError) {
DLog(@"The error for the WAL move: %@",walMoveError.localizedDescription);
}
if (successfulWalMove) {
actuallyMovedFiles = YES;
if([NSFileManager.defaultManager fileExistsAtPath:fromWalPath]) {
statusMessage = replacingWalFile?[NSString stringWithFormat:@"%@ %@",statusMessage,NSLocalizedString(@"Successfully replaced WAL file. WAL file DOES still exist in original location.", @"")]:[NSString stringWithFormat:@"%@ %@",statusMessage,NSLocalizedString(@"Successfully moved WAL file. WAL file DOES still exist in original location.", @"")];
}
else {
statusMessage = replacingWalFile?[NSString stringWithFormat:@"%@ %@",statusMessage,NSLocalizedString(@"Successfully replaced WAL file. WAL file does NOT still exist in original location.", @"")]:[NSString stringWithFormat:@"%@ %@",statusMessage,NSLocalizedString(@"Successfully moved WAL file. WAL file does NOT still exist in original location.", @"")];
}
}
else {
statusMessage = replacingWalFile?[NSString stringWithFormat:@"%@ %@ (%@). ",statusMessage,NSLocalizedString(@"Failed to replace WAL file", @""),walMoveError.localizedDescription]:[NSString stringWithFormat:@"%@ %@ (%@). ",statusMessage,NSLocalizedString(@"Failed to move WAL file", @""),walMoveError.localizedDescription];
}
}
else {
statusMessage = NSLocalizedString(@"No WAL file to move.", @"");
}
if (shmFileExists) {
NSString *toShmPath = [finalStorePath stringByAppendingString:@"-shm"];
BOOL toShmFileExists = [NSFileManager.defaultManager fileExistsAtPath:toShmPath];
NSError * shmMoveError = nil;
BOOL successfulShmMove = NO;
BOOL replacingShmFile = NO;
if (toShmFileExists) {
replacingShmFile = YES;
NSURL *fromShmURL = [NSURL fileURLWithPath:fromShmPath];
NSURL *toShmURL = [NSURL fileURLWithPath:toShmPath];
//successfulShmMove = [[NSFileManager defaultManager] replaceItemAtURL:fromShmURL withItemAtURL:toShmURL backupItemName:@"shmBackup" options:NSFileManagerItemReplacementUsingNewMetadataOnly resultingItemURL:nil error:&shmMoveError];
//THE ABOVE CODE WAS WRONG, WHICH WAS WHAT WAS CAUSING THE ISSUE
successfulShmMove = [[NSFileManager defaultManager] replaceItemAtURL:toShmURL withItemAtURL:fromShmURL backupItemName:@"shmBackup" options:NSFileManagerItemReplacementUsingNewMetadataOnly resultingItemURL:nil error:&shmMoveError];
}
else {
successfulShmMove = [[NSFileManager defaultManager] moveItemAtPath:fromShmPath toPath:toShmPath error:&shmMoveError];
}
if (shmMoveError) {
DLog(@"The error for the SHM move: %@",shmMoveError.localizedDescription);
}
if (successfulShmMove) {
actuallyMovedFiles = YES;
if([NSFileManager.defaultManager fileExistsAtPath:fromWalPath]) {
statusMessage = replacingShmFile?[NSString stringWithFormat:@"%@ %@",statusMessage,NSLocalizedString(@"Successfully replaced SHM file. SHM file DOES still exist in original location.", @"")]:[NSString stringWithFormat:@"%@ %@",statusMessage,NSLocalizedString(@"Successfully moved SHM file. SHM file DOES still exist in original location.", @"")];
}
else {
statusMessage = replacingShmFile?[NSString stringWithFormat:@"%@ %@",statusMessage,NSLocalizedString(@"Successfully replaced SHM file. SHM file does NOT still exist in original location.", @"")]:[NSString stringWithFormat:@"%@ %@",statusMessage,NSLocalizedString(@"Successfully moved SHM file. SHM file does NOT still exist in original location.", @"")];
}
}
else {
statusMessage = replacingShmFile?[NSString stringWithFormat:@"%@ %@ (%@). ",statusMessage,NSLocalizedString(@"Failed to replace SHM file", @""),shmMoveError.localizedDescription]:[NSString stringWithFormat:@"%@ %@ (%@). ",statusMessage,NSLocalizedString(@"Failed to move SHM file", @""),shmMoveError.localizedDescription];
}
}
else {
statusMessage = NSLocalizedString(@"No SHM file to move.", @"");
}
if (handler) {
handler(migrateStoreURL,statusMessage,actuallyMovedFiles,hudIsRunning);
}
});
}
else {
if (handler) {
actuallyMovedFiles = NO;
hudIsRunning = NO;
statusMessage = NSLocalizedString(@"No SQLITE files to move.", @"");
handler(migrateStoreURL,statusMessage,actuallyMovedFiles,hudIsRunning);
}
}
}
编辑:感谢@matt,问题解决了 - 对于 shm 和 wal 文件,'to' 和 'from' 混淆了。我不敢相信我错过了。所以现在,正如我通过在线研究所期望的那样 - 尽管文档中没有写 - 当替换方法成功时,每个文件实际上都被移动,而不是复制。使用我修改和修复的代码,这是我现在收到的消息:
Successfully replaced SQLITE file. SQLITE file does NOT still exist in original location. Successfully replaced WAL file. WAL file does NOT still exist in original location. Successfully replaced SHM file. SHM file does NOT still exist in original location.
最佳答案
我可能是错的,但乍一看,在我看来,您使用的“从”和“到”概念与我使用它们的方式相反。您可能对将文件从何处移动以及要将其移动到何处感到困惑。
关于ios - replaceItemAtURL : method fails to remove original moved files in some cases,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52412542/
XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allow
Git diff 似乎在比较时返回不同的变化: git diff origin/master ... origin/branch git diff origin/master...origin/bra
我正在研究 3.1 Git Branching - Branches in a Nutshell 中的 git 分支概念 我正在玩虚拟存储库。 git log --oneline --decorate
我知道有很多类似的问题,唯一的区别是我从 **same ** 域提供的两个页面得到了这个。这可以在下面的示例中看到。 Uncaught DOMException: Blocked a fram
我被要求使用 Fork Workflow,即我必须处理具有相同或相似名称的多个分支。我为什么要使用这些不同的变体? 以下是不同命名约定的一些示例: 我的分支机构 起源我的分支 起源/我的分支机构 远程
这个问题已经有答案了: How do I delete a Git branch locally and remotely? (41 个回答) 已关闭 9 年前。 好的,我已经创建了一个 origin
这是我关于如何让 lerna 在 Jenkins 中运行的一系列问题的一部分。 上一期: lerna publish on Jenkins "git remote update" Fails "Cou
当我尝试从我的 Angular 6 应用程序访问 Webhdfs 时,我收到如下所示的错误。在我看来,我几乎尝试了所有方法,包括更改 core-site.xml 和 hdfs-site.xml 中的设
我正在从不同的来源向我的服务器发出 Ajax POST 请求以供用户登录。我已经在我的 application_controller.rb 中正确设置了 Cross Origin header : d
我刚刚克隆了一个存储库并在 Git 中开始了一个新分支。我已经这样做了很多次而没有遇到问题。今晚当我尝试使用 git branch --set-upstream develop origin/deve
我对 Git 还很陌生,但仍在掌握它的窍门。我最近才开始使用分支机构,遇到了一些问题。 我有两个开发系统,一个 Ubuntu 桌面和一个 MacBookPro。我在 Ubuntu 系统上的一个新的 o
这个问题在这里已经有了答案: Why does "git push main" work on GitHub when "git push master" does not? Also what i
我想从我的应用访问一个 API。 curl 请求是: curl --request POST https://... --header 'Authorization: Token ...'
我试图理解的遗留 makefile 具有 -Wl,-z,origin,-rpath,'$ORIGIN/../lib' 好的,我看到 -Wl 表示以下是链接器选项;逗号将替换为空格。 GNU ld 的联
我正在寻找 OpenShift Origin 和 OpenShift Enterprise 之间的主要区别。我知道第一个是开源的,后者是商业版。与开源版本相比,OpenShift Enterprise
我在 Sourcetree 中有这个历史图表: Sourcetree graph 如何将最后一次提交从 origin/development 复制到 origin/master 分支? 第二个问题:图
运行 git 命令时空格和斜杠有什么区别? 我有时会看到 git push origin master(这是一个空格) 还有其他时候我看到 git rebase origin/master(使用斜杠)
根据文档,git pull 执行 git fetch 然后执行 git merge,但是在那种情况下执行 git pull origin master 应该执行 git fetch origin ma
我正在使用我的 git 存储库,并在早些时候对 master 分支进行了相当多的提交。现在我意识到它有点太吵了,我想将所有这些 merge 到一个提交中。 102381 commit z .... 1
我制作了一个小的 xslt 文件来创建一个名为 weather.xsl 的 html 输出,代码如下: 我想将 html 输出加载到 html 文件中的 div 中,我正在尝试
我是一名优秀的程序员,十分优秀!