2015-01-20 132 views
-2

我正在尝试对Core Data存储进行备份/恢复;在我的应用程序中,我创建了该文件,执行fileExistsAtPath并且该文件在那里。当我使用Finder时,它不在那里。这是代码(我复制和修改,使风格和重复的命名是不是我或许应该从头再来)创建备份:我使用NSPersistentStoreCoordinator创建了一个文件,但在应用程序重新启动后未找到该文件

UPDATE的代码是here ...

这是控制台输出:

CURRENTURL为file:///用户/ spokanedude /库/开发商/ CoreSimulator /设备/ 1EE69744-255A-45CD-88F1-63FEAD117B32 /数据/集装箱/数据/应用/ 41B5E165-C3E2-4D8A-81EB-98ADB20B8B0D/Documents/saori.sqlite 2015-01-20 10:41:36.042 SalonBook [84743:20 55509]

要使用的备份文件URL是file:/// Users/spokanedude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/41B5E165-C3E2 -4D8A-81EB-98ADB20B8B0D /文档/ saori.backup-20153920103944

2015年1月20日10:41:36.042 SalonBook [84743:2055509]

currentCoreData存在 2015年1月20日10时41分: 36.042 SalonBook [84743:2055509]

备份文件存在 2015-01-20 10:41:36.042 SalonBook [84743:2055509]

目标文件存在 2015年1月20日10:41:36.092 SalonBook [84743:2055509]当前存储器文件中删除

2015年1月20日10:41:36.125 SalonBook [84743:2055509]替换当前存储文件成功

二零一五年一月二十零日10:41:36.126 SalonBook [84743:2055509]商店选项是{ NSSQLitePragmasOption = { “journal_mode”= WAL; }; } 2015年1月20日10:41:36.127 SalonBook [84743:2055509] addPersistentStoreWithType成功完成...

2015年1月20日10:41:36.127 SalonBook [84743:2055509] STORE文件是/用户/spokanedude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/41B5E165-C3E2-4D8A-81EB-98ADB20B8B0D/Documents/saori.sqlite

当我做备份时,它说文件在那里;当我使用ForkLift(Finder替换)时,它显示(有时);当我执行还原时,它会找到该文件并说恢复成功,但是它会清除现有数据,如文件内容丢失。无法弄清楚我的生活......帮助将不胜感激。

+0

该控制台输出是不一样的'NSLog'在您的代码段调用你明白了什么从运行代码 – 2015-01-20 19:09:52

+0

我没有把代码弥补了休息矿石...有问题的控制台输出是从那里...我讨厌把这个数量的代码... pastebin好吗? – SpokaneDude 2015-01-20 19:11:52

+3

你应该包括任何与问题相关的代码。控制台输出应该与问题中包含的代码相匹配。 – 2015-01-20 19:13:49

回答

1

首先,检查fileExistsAtPath:的文档。您将看到以下警告:

不建议尝试基于文件系统的当前状态或文件系统上的特定文件来判断行为。这样做会造成奇怪的行为或竞赛状况。尝试一个操作(例如加载文件或创建目录),检查错误并妥善处理这些错误要比试图提前弄清操作是否成功要好得多。

这正是你在做什么,并且你正在看到意外的行为。

使用WAL模式时,最需要的数据是不是在“saori.sqlite”的文件,但在SQLite的将在同一目录中放置其他文件。在使用WAL模式时,实际上不会写入“saori.sqlite”文件。 Apple Technical QA 1809记录了这一点,并且SQLite documentation中提供了更多详细信息。

对于这样那样的原因,它通常是一个好主意,让每个核心数据的SQLite储存它自己的目录。

如果您尝试将“saori.sqlite”文件复制到新位置,并使用核心数据而不是将其打开,则其他存储的文件将实际上为空。你会去:(

不幸的是,你的恢复实施做了什么,它需要备份“saori.sqlite”文件并将其复制到一个新的位置,而不用WAL模式使用的其他文件,然后添加一个新的使用该位置存储 - 但WAL文件丢失,所以核心数据会创建新的数据,这会导致数据丢失 - 您的数据永远不会移动,并且核心数据会创建新文件。

执行还原的推荐方法是只是备份的相反:?使用迁移

+0

我想备份存储在用户的文档目录,因为我认为这是什么建议。我只有一个CD存储(saori.sqlite)......当我看着ForkLift中的目录时,它们似乎在那里,并且所有三个文件(saori.backup,shm和wal都在那里)。我可以使用SQLite Professional打开备份文件,但这不是被恢复的! – SpokaneDude 2015-01-20 19:23:16

+0

“我可以使用SQLite Professional打开备份文件,但这不是恢复的内容!”你是什么意思?什么得到恢复?是否有数据(特别是关系)缺失? – quellish 2015-01-20 19:29:53

+0

SQLite Prof在文件复制之前或之后显示它?我会建议使用像Core Dara Editor这样的核心数据特定工具。 SQLite工具通常会显示一个令人误解的情况:您只能看到.sqlite文件中的少量内容,并认为所有数据都在那里,而实际上您需要的数据位于其他(缺少)文件中。以CoreData为重点的工具不太可能存在相同的问题。 – quellish 2015-01-20 19:41:26

相关问题