- 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/
这段代码无法编译: for(vector::iterator it = shapes.end(); it >= shapes.begin(); --it){ *it.update(1,1);
我一直在研究 Common Lisp 对象协议(protocol) (CLOS),我遇到了一个疑问。 有人知道 CLOS 中的“标准方法组合”和“简单方法组合”是什么意思吗? 在“简单方法组合”中,“
在Rust上对值调用方法之间是否有任何区别,如下所示: struct A { e: u32 } impl A { fn show(&self) { println!("{}",
我在一些 StackOverflow 答案中看到了术语抽象方法、具体方法和默认方法的“不同”定义。 Java 语言规范给出的真正定义是什么?请在您的答案中包含相关的支持 JLS 引用资料。 最佳答案
如果method = "post",如何使rest[method]扩展为rest.post(uri, body).then(. .? function proxyUrl() { return
这个问题在这里已经有了答案: Method cannot be translated into a store expression (1 个回答) 关闭 9 年前。 我有一个问题。我在 Visua
它们各自的优缺点是什么? 接口(interface)方法 虚方法 抽象方法 什么时候应该选择什么?做出这一决定时应牢记哪些要点? 最佳答案 虚拟和抽象几乎是一样的。虚方法在基类中有一个可以选择被覆盖的
我在 Meteor.js 上的那段代码出错: 客户端 : Meteor.call("logUser", function(myvar){ console.log("le c
运行代码时出现以下错误 Line: 18 illegal start of expression Line: 18 ';' expected 这意味着第 18 行中有代码写得不正确(public bo
如果可能的话,如何从另一个方法的返回中调用一个方法? 例如…… class Example { public static void main(String[] args) {
当遍历指针的 vector (或其他容器)时,使用以下优势和/或优势之间是否有任何区别: for (it = v.begin(); it != v.end(); ++it) { (*it)->
在从带有参数的 void 方法打印值或将值返回给方法调用者并在方法调用者中打印它之间,哪个被认为是更好的做法(如果有的话)?比如第一个代码摘录是前者,第二个代码摘录是后者: public static
考虑这个例子https://codesandbox.io/s/1yvp4zz5x7?module=%2Fsrc%2FApp.vue Greet1 Greet2
晚上好, 我刚开始使用 Microsoft.Contracts(最新版本)并将其插入示例界面之上,现在它看起来像这样: namespace iRMA2.Core.Interfaces { us
我是 Laravel 4 的新手,并试图弄清楚为什么我收到一个错误,说 Method [show] 不存在。 我没有名为“show”的方法,只能想象这是一个内部的 Laravel 方法,但我不知道如何
有人可以向我解释一下当我们进行下一次返回时“或”(||) 是什么意思吗? 我的意思是这行: 返回封面(值,金额 - 值 [索引],索引 + 1)||覆盖(值、金额、索引 + 1); public st
这个问题已经有答案了: Why doesn't the post increment operator work on a method that returns an int? (11 个回答) 已
我很难理解 jQuery 的 $.method() 和 $(selector).method 之间的区别。 $.method() 实际适用于 DOM 中的哪些元素?如果有人能帮助解释这两种说法之间的区
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 5 年前。 Improve t
////////////////////////////////////////////////////////////////////////////// // 3 construct
我是一名优秀的程序员,十分优秀!