【问题标题】:Reading sqlite file from dynamic framework从动态框架中读取 sqlite 文件
【发布时间】:2016-09-05 13:54:46
【问题描述】:

我目前使用 Magic 记录和动态框架来处理我的数据库内容。但是,在过去的两天里,我一直被困在同一个问题上。我无法获得具有嵌入式框架来创建任何类型实体的主应用程序。上下文被创建,但是当我尝试执行获取请求时,我找不到实体。我尝试使用共享容器来共享 mom 文件,尝试使用 self 类的 nsbundle,尝试对 bundle id 进行硬编码并获取资源的 url,但仍然没有运气。 mom 文件肯定是在框架中复制的,因为我将它包含在复制源文件中。有没有人有幸让它发挥作用?

尝试了以下方法:(我认为我们需要 sqlite 文件)

NSURL *storeURL = [[NSBundle bundleWithIdentifier:@"bundleid"] URLForResource:@"model" withExtension:@"momd"];
[MagicalRecord setupCoreDataStackWithStoreAtURL:storeURL]

【问题讨论】:

  • 需要更多细节。不就是把app里的sql文件名传给framework吗?
  • 基本上我只有在将模型复制到主应用程序时才能让它工作,否则它无法打开。
  • 我不明白为什么会这样。动态库与应用在同一个地址空间,共享沙盒权限等。
  • 是的,我正在使用一个包含 2 个项目的工作区。一个是主应用程序,第二个是带有模型等的动态库。
  • 您是从包中加载数据库吗?如果是,是哪个捆绑包?

标签: objective-c sqlite core-data magicalrecord


【解决方案1】:

你的代码有问题,

// this is data model, not Persistent Store URL
NSURL *storeURL = [[NSBundle bundleWithIdentifier:@"bundleid"] URLForResource:@"model" withExtension:@"momd"];
[MagicalRecord setupCoreDataStackWithStoreAtURL:storeURL]; // expect persistent store url

使用MagicalRecord,初始化真的很简单,

// which will collect and merge all data models in the main bundle 
[MagicalRecord setupCoreDataStackWithStoreNamed:@"my.sqlite"]

在MagicalRecordInternal.m中,你会发现一些很有灵感的代码,如下,

// *modelClass* can be any class in your dynamic framework
+ (void) setDefaultModelFromClass:(Class)modelClass;
{
    NSBundle *bundle = [NSBundle bundleForClass:modelClass]; 
    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:bundle]];
    [NSManagedObjectModel MR_setDefaultManagedObjectModel:model];
}

更多详情

如果您使用 coreData 创建一个名为“tmp”的新 Swift 项目,您将在 AppDelegate.swift 中看到类似的内容。

lazy var managedObjectModel: NSManagedObjectModel = {
    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
    let modelURL = NSBundle.mainBundle().URLForResource("tmp", withExtension: "momd")!
    return NSManagedObjectModel(contentsOfURL: modelURL)!
}()

没有名为tmp.momd的文件; Xcode 创建的是tmp.xcdatamodeld。一个合适的方法是NSManagedObjectModel.mergedModelFromBundles(_:),它将搜索所有合适的名为xx.momd的编译数据模型

【讨论】:

  • 我基本上无法让它从动态框架中读取,否则它很好。
  • 你说“否则没关系”是什么意思? @user281300
猜你喜欢
  • 2016-07-26
  • 2010-10-26
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 2017-04-03
  • 2014-01-31
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多