将核心数据与SQLite一起使用 - 为什么在某些示例中使用扩展:使用@"momd"?

DSh*_*hah 1 iphone cocoa-touch core-data objective-c

我正在使用sqlite的核心数据..我在AppDelegate中找到了一个现成的应用程序

-(NSManagedObjectModel *) managedObjectModel
{
    if(__managedObjectModel != nil)
    {
         return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MYSQLite" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    return __managedObjectModel;
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中虽然我的SQLite数据库有.sqlite扩展名...这个例子有.momd扩展....这背后的原因是什么?

Tec*_*Zen 19

.mom.momd文件是汇编的数据模型文件.这些类似于定义SQL数据库模式的文件,尽管它们与SQL 完全无关,可以与任何类型或Core Data持久存储一起使用.

数据模型是您在数据模型编辑器中创建的,您可以在其中以图形方式定义实体和实体之间的关系.数据模型定义了对象如何相互关联,以便托管对象上下文可以在运行时"管理"对象.它还被presistent存储用于"冻结"对象到磁盘上的文件中以进行持久存储.

编译项目时,.xcdatamodel文件将编译为.mom文件或.momd文件.前者用于无版本模型,后者用于版本化模型.这些天,你几乎总是看到一个.momd文件.编译的文件仅出现在应用程序包中.它不会显示为项目文件,只是.o编译的源代码文件出现在项目文件中.

相比之下,.sqlite.plist或其他文件扩展名是包含应用程序的数据的实际持久性存储文件.您获得的文件类型取决于使用的商店类型.您拥有的已编译模型文件的类型与您使用的持久性存储的类型完全无关.几乎所有类型的商店都可以使用相同的型号.唯一的限制是,一旦使用模型创建商店,您必须使用相同的模型从该点开始访问商店.如果更改模型,则必须将存储迁移到新模型.

所以,这段代码:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MYSQLite" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
Run Code Online (Sandbox Code Playgroud)

...完全错误,因为它混淆了两种类型的文件.此时,您只是加载数据模型,以便上下文和持久性存储将理解数据如何组合在一起.通常,代码看起来像:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"appNameDataModel" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
Run Code Online (Sandbox Code Playgroud)

(另请注意,数据模型文件存储在应用程序包中,因此始终是只读的.)

一旦拥有了托管对象模型,就可以将其提供给持久性存储协调器,如下所示:

persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
Run Code Online (Sandbox Code Playgroud)

...然后创建或打开实际的持久性存储文件,如果使用sqlite存储,则该.sqlite文件是:

[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]
Run Code Online (Sandbox Code Playgroud)

持久性存储协调器将使用.momd文件中的信息来了解在持久存储文件中存储和检索数据时如何配置数据.

此外,请确保您了解Core Data不是某种对象SQL包装器.核心数据与SQL无关.SQLite存储只是Core Data可以在幕后使用的几种商店类型之一.Core Data的实际操作根本不需要SQL,许多Core Data应用程序根本不使用SQL.

  • Core Data的主要功能是创建模型 - 视图 - 控制器设计应用程序的模型层.它主要涉及在运行时管理对象的实时集合,对象图.将对象图保持为磁盘是可选的,并且有几种不同的持久格式,例如sqlite,xml,binary,custom.将Core Data视为围绕sqlite构建是错误的,因为sqlite是Core Data的最新成员,Core Data在没有它的情况下工作正常. (2认同)