核心数据 - 创建其他属性或构建数据

时间:2016-07-02 05:52:52

标签: ios arrays database swift core-data

我正在开发一个项目,用户可以使用标题和标题保存图像,然后使用Core Data保存。我遇到的问题是尝试添加一个专辑,用户可以使用字幕保存类似的图像。我是CoreData的新手,并且花了一整天时间查看文档并通过Stackoverflow进行梳理。

我附上了我正在寻找的基本布局的图片(当然不是艺术家)。Layout

我还附上了我认为数据结构看起来像的图像。 Data Structure

标有红色的部分是我正在构建的问题。我已经构建了我认为是数据结构的“顶层”层。

let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext

    let saveData = NSEntityDescription.insertNewObjectForEntityForName("ScannedItem", inManagedObjectContext: context)

    let imageRep = UIImagePNGRepresentation(image)!

    saveData.setValue(textTitle, forKey: "savedTitle")
    saveData.setValue(scannedText, forKey: "savedText")
    saveData.setValue(imageRep, forKey: "savedImage")


    do{
        try context.save()
    }catch{
        print("Failed")
    }

我如何添加较低级别的数据,一个用于保存一组字符串,另一个用于保存一组图像?

我一直试图将它构建好几个小时,根本无法解决它。

我希望这些图片可以为我所要求的内容添加上下文。

1 个答案:

答案 0 :(得分:0)

  

我如何添加较低级别的数据,一个用于保存一组字符串,另一个用于保存一组图像?

没有一组字符串和一组单独的图像(你怎么知道哪个字符串属于哪个图像?)。 ScannedItem对象已经包含字符串和图像,因此您应该将Scanned Item个对象组合在一起制作相册。

在CoreData术语中,您将创建一个新实体Album。该实体可能有自己的属性,例如albumNamealbumDescription,以及表示相册中ScannedItems的关系。由于Album是许多ScannedItems的集合,因此关系将是" to-many"。

在CoreData中,如果定义从一个实体到另一个实体的关系,则应始终创建反向关系。要问自己的问题是每个ScannedItem是否可以包含多个Album?如果是这样,则反比关系也是" to-many&#34 ;;如果不是,反之为" to-one"。

默认情况下,CoreData将多对多关系中的对象集合表示为Set。这有两个后果:

  • 首先,集合中没有对象的隐式排序。如果订单很重要,您可以建立关系" ordered" (在这种情况下,CoreData使用有序集),或者您可以在访问关系中的对象时指定排序顺序(例如,按标题的升序字母顺序排列)。如果用户可以在Album中选择订单,则可能需要通过添加sortOrder属性来明确建模排序顺序。如果从ScannedItemAlbum的关系为1,那就很容易了,但如果关系是-to,则ScannedItem可能是一个Album中的第一个图像{ {1}}但不同Album中的最后一张图片。
  • 第二,一个集合只能容纳一个给定的对象。因此,Album不能多次包含相同的ScannedItem

每个解决方案都是相同的:创建一个第三个​​实体,您可以称之为AlbumScanReference,它具有sortOrder属性,与...之间的一对一关系AlbumScannedItem的一对一关系。反向关系可以是多个:Album可能有很多AlbumScanReferencesScannedItem也可能有很多AlbumScanReferences

如果myScan1album1中的第一项和album2中的第七项,则会创建两个AlbumScanReferences

let reference1 = ....
reference1.scannedItem = myScan1
reference1.album = album1
reference1.sortOrder = 1

let reference2 = ....
reference2.scannedItem = myScan1
reference2.album = album2
reference2.sortOrder = 7

同样,如果myScan2album1中的第二项和第八项,那么您将有两个AlbumScanReferences

let reference3 = ....
reference3.scannedItem = myScan2
reference3.album = album1
reference3.sortOrder = 2

let reference4 = ....
reference4.scannedItem = myScan2
reference4.album = album1
reference4.sortOrder = 8