views:

213

answers:

1

I am building an application using CoreData which will require me to store an array of floating point numbers against instances of an Entity, and then fetch a selection of these entities in order of the (say) manhattan distance between their respective matrices.

Here is a rough diagram of something like what I mean:

Entity: {
  name: 'instance 1',
  data: [ 0.1, 0.2, 0.1, 0.1, 0.05, ... ]
},
Entity: {
  name: 'instance 2',
  data: [ 0.4, 0.9, 0.1, 0.1, 0.02 ... ]  // want to sort using this data
}

I know that it's possible to use a 'transformable' attribute for 'data', and encode an NSArray, but I don't believe it's possible to use the contents of that array in fetch or sorting queries.

So, my question is: what options do I have to build this? Is it possible to somehow extend CoreData to allow me to perform the vector calculations as part of the 'fetch' request? Or would I have to load every object into memory and then sort manually?..

Ultimately I am trying to find the most efficient option, because I expect to be dealing with thousands of instances, each with a 10-20 item feature vector.

Any suggestions as to the possible architecture here would be appreciated by a CoreData newbie ;-)

Please let me know if I have not framed this clearly enough and I will try to elaborate.

+2  A: 

I would create a new entity called VectorEntry with two attributes:

  • data (Float)
  • sort (Int16)

Then, in your main Vector entity, have a to-many relationship with VectorEntity (this is implemented as an NSSet by CoreData, hence the need to add sorting). You could also implement the VectorEntity as a doubly linked list (Vector would have a to-one relationship with the start and/or end).

In your VectorEntry fetch requests, specify a sort descriptor using the "sort" key path and a proper array will be returned.

gerry3