【问题标题】:Using MagicalRecord - Not able to fetch data appropriately from pre-loaded .sqlite file使用 MagicalRecord - 无法从预加载的 .sqlite 文件中正确获取数据
【发布时间】:2016-02-15 09:12:28
【问题描述】:

我正在尝试通过神奇的记录从我的 sqlite 数据库中获取一些信息。 应该注意 - 这个应用程序在 iOS9 之前运行没有任何问题。由于iOS9它崩溃了,所以我正在修改它。我安装了 cocoapods 并通过 pod 安装了 MagicalRecord(效果很好)。

在我的 AppDelegate 文件中,我使用我拥有的 .sqlite 文件中的数据预加载数据库,并使用 MagicalRecord 设置 CoreData 堆栈。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self copyDefaultStoreIfNecessary];
    //Copy the preloaded DB to the default path of the application's DB (REQUIRED)
    NSArray *paths = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
    NSURL *documentPath = [paths lastObject];
    NSURL *storeURL = [documentPath URLByAppendingPathComponent:@"Trips_54Miles.sqlite"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path] ]) {
        NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Trips_54Miles" ofType:@"sqlite" ]];
        NSError *err = nil;
        if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err]){
            NSLog(@"Error:  Unable to copy preloaded db.");
        }
    }
    //Setup Magical Record with the CoreData Stack
    [MagicalRecord setupCoreDataStackWithStoreNamed:@"Trips_54Miles.sqlite"];
    NSArray *schools = [MetaMiles MR_findAllSortedBy:@"beg_school" ascending:YES];
    NSLog(@"Default Array: %@", schools);
    return YES;
}

数组'schools',总是这样显示在日志中:

'默认数组:( )'

不显示任何条目。

很好奇为什么。我检查了我正在加载的 .sqlite 文件,它已经加载了所有适当的信息。

任何关于我应该去哪里提取信息的想法都将不胜感激。

【问题讨论】:

  • 也许copyDefaultStoreIfNecessary 无法复制文件?这是代码中最明显的潜在问题。
  • 如果无法复制文件,我将其设置为记录消息 - 我在控制台中看不到失败消息。
  • 它是复制 SQLite 日志文件还是仅复制主 SQLite 文件?
  • 我相信它只是复制了主要的 SQLite 文件:你可以在这里看到 copyDefaultStoreIfNecessary:github.com/PushpinDesigns/54Miles/blob/dev/54%20Miles/…

标签: ios xcode sqlite core-data magicalrecord


【解决方案1】:

根据您创建预加载 SQLite 文件的方式,很可能存在三个文件,而不仅仅是一个 - 主文件 .sqlite 加上另外两个文件,.sqlite-wal.sqlite-shm。如果是这种情况,大部分或全部数据将在这些文件中。实际上,仅复制 .sqlite 文件会删除所有数据,同时保持数据模型不变。所以你仍然可以打开文件,但没有什么可以获取的。

您需要复制这些文件以保持数据完整。

【讨论】:

  • 我写这个应用程序已经有一段时间了(差不多 2 年)。我所知道的是只有一个 .sqlite 文件(历史上和当前)。我可以使用 SQLite 数据库浏览器查看 .sqlite 文件并查看所有适当的信息。
  • 如果只有一个文件,很好,但是用 SQLite 数据库浏览器查看它是不相关的 - 如果它们存在,它将使用日志文件。
  • 我以前从未使用过日志文件?这个应用程序工作了几年——我从来不用处理或担心日志文件(通过我自己的承认——我不知道那些是什么);所以我的印象是日记文件不是这里的合适答案。
  • 较新版本的 iOS 使用不同的日志方案,因此额外文件并不总是存在。如果存在,那么它们绝对是至关重要的,但如果它们不存在,那么显然它们无关紧要。
  • 我明白了。不幸的是他们不存在,所以我会继续挖掘。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
相关资源
最近更新 更多