swift2 以编程方式创建实体(核心数据)

dpiehjr4  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(213)

有没有办法用swift2在Core Data上以编程方式创建一个实体?我搜索了一下,但没有找到。

qvtsj1bj

qvtsj1bj1#

Web上只有几个教程(可能只有one)。
我不是Xcode的GUI工具(Nibs、Storyboards、XCDataModeld等)的粉丝,所以用代码创建一切(从DB到UI)对我来说是家常便饭。@Lubos引用的文章(我在评论中添加了链接后2分钟,嗯...)是用ObjC写的。
下面是一个Swift代码:

internal var _model: NSManagedObjectModel {
    let model = NSManagedObjectModel()

    // Create the entity
    let entity = NSEntityDescription()
    entity.name = "DTCachedFile"
    // Assume that there is a correct 
    // `CachedFile` managed object class.
    entity.managedObjectClassName = String(CachedFile)

    // Create the attributes
    var properties = Array<NSAttributeDescription>()

    let remoteURLAttribute = NSAttributeDescription()
    remoteURLAttribute.name = "remoteURL"
    remoteURLAttribute.attributeType = .StringAttributeType
    remoteURLAttribute.optional = false
    remoteURLAttribute.indexed = true
    properties.append(remoteURLAttribute)

    let fileDataAttribute = NSAttributeDescription()
    fileDataAttribute.name = "fileData"
    fileDataAttribute.attributeType = .BinaryDataAttributeType
    fileDataAttribute.optional = false
    fileDataAttribute.allowsExternalBinaryDataStorage = true
    properties.append(fileDataAttribute)

    let lastAccessDateAttribute = NSAttributeDescription()
    lastAccessDateAttribute.name = "lastAccessDate"
    lastAccessDateAttribute.attributeType = .DateAttributeType
    lastAccessDateAttribute.optional = false
    properties.append(lastAccessDateAttribute)

    let expirationDateAttribute = NSAttributeDescription()
    expirationDateAttribute.name = "expirationDate"
    expirationDateAttribute.attributeType = .DateAttributeType
    expirationDateAttribute.optional = false
    properties.append(expirationDateAttribute)

    let contentTypeAttribute = NSAttributeDescription()
    contentTypeAttribute.name = "contentType"
    contentTypeAttribute.attributeType = .StringAttributeType
    contentTypeAttribute.optional = true
    properties.append(contentTypeAttribute)

    let fileSizeAttribute = NSAttributeDescription()
    fileSizeAttribute.name = "fileSize"
    fileSizeAttribute.attributeType = .Integer32AttributeType
    fileSizeAttribute.optional = false
    properties.append(fileSizeAttribute)

    let entityTagIdentifierAttribute = NSAttributeDescription()
    entityTagIdentifierAttribute.name = "entityTagIdentifier"
    entityTagIdentifierAttribute.attributeType = .StringAttributeType
    entityTagIdentifierAttribute.optional = true
    properties.append(entityTagIdentifierAttribute)

    // Add attributes to entity
    entity.properties = properties

    // Add entity to model
    model.entities = [entity]

    // Done :]
    return model
}

此代码等同于此CD模型(在Xcode的GUI中创建):

在代码中创建模型比使用GUI复杂得多。
但是,IMO,它比加载CoreData模型文件来获得你的模型更快更安全(如果没有文件存在呢?或者文件被损坏了呢?)。
我所说的“更安全”是指您不必处理与从磁盘阅读CoreData模型相关的磁盘IO错误(您的模型在代码中,不需要在模型文件中)。

rslzwgfq

rslzwgfq2#

通过编程定义核心数据模型是可能的。我找到了一个很好的例子,虽然它是用Objective C编写的。我确信它也适用于Swift 2。你只需要重写它。应该需要几分钟。
https://www.cocoanetics.com/2012/04/creating-a-coredata-model-in-code/

相关问题