Core Data (along with Tiger) has been out in the wild for over a year, now. As a result, most of the whys? and hows? of CD have been answered at great length in mailing lists and updated documentation. A question that still gets asked on a fairly regular basis, though, is when? When should I use Core Data in my application?
The flip answer is, “Whenever you can!” Core Data is an incredibly powerful technology that crosses “Model” off the MVC list of Things Programmers Worry About. Unfortunately, not every program is a good fit with CD, and sometimes trying to wedge an inappropriate app into the CD mold can cause more complexity than it banishes. So how do you know if your app is a good candidate for CD use? Your answers to the following three questions will let you know.
Does my application need to run on versions of OS X prior to 10.4?
The easy one first: Core Data is a part of Tiger. Applications written to take advantage of CD, therefore, must be run on Tiger. If your app needs to target 10.3, 10.2, or any earlier version of OS X, CD isn’t for you. End of story.
Does my application require a specific file format?
My least favorite part of writing a new application is creating the translators needed to serialize my data and write it to a file. The inverse of this process is equally tedious. If your application makes use of Core Data, however, these woes are a thing of the past. CD takes care of saving, loading, and all the implied serialization for you — as long as it’s acceptable for your application to use one of CD’s native file formats.
CD is capable of generating human-readable (if not exactly efficient) XML files, snappy binary files, and even impressive SQLite files completely automagically without writing a single line of code. But if you’re developing a word processor that needs to load and save MS Word .doc files, you’re not going to gain any benefit from this really thrilling feature of CD.
This is not to say you couldn’t use CD at all. CD could still make up your app’s in-memory representation of your model. This would let you take advantage of other CD features like automatic undo and graphical object graph management. But, alas, you would still be stuck serializing your data out to files and back again the old fashioned (manual) way.
Does my application require order from its data?
Imagine you’re writing a paint program. This program may let you draw on many different layers that are composited together to form a final image. You need some sort of collection to hold these layers, but order is very important here. If you have a beautiful sunset on one layer and a log cabin on the layer above it, it wouldn’t do to mix up the order of these items. If you get them out of order and put the sunset on top of the cabin, all you’d see then is the sunset!
In most cases like this, you would store these layers in an array. An array is nice because it not only groups like data together in a container, but also indexes it. Here’s an interesting tidbit that many new to Core Data do not know: CD does not provide any array implementation. CD does have a sense of collections by way of to-many relationships. But those relationships are modeled as NSSets, not NSArrays. As such, objects in your to-many relationship may be returned to you in any order. In our paint program example, if we had a to-many relationship from our Document entity to one-or-more Layer entities, and the Layer entities only contained graphic information, we’d never know which layer went on top.
This is not as bad as it sounds. Some applications don’t require any order of their data (a virus checker doesn’t care what order files are scanned in, only that all files end up scanned). Others don’t need the data to be ordered in the model because the data itself provides order (imagine an app that displays the five most recent entries of an RSS feed. The order is provided by sorting the entries’ time stamp, not through any index). Yet others have indexes built-in to their data (say, a program that keeps track of the employees in a company. Each employee’s ID number acts as its own index).
Even in the paint program example we use above, it would be possible to add an index property to the Layer entity so that the order of the layers is preserved in the relationship. So it’s not impossible to create a paint program that uses CD. But you would have to handle assigning index numbers to each of the entities yourself. And you’d have to order the data manually every time it’s fetched… often, frustratingly, by putting it into an NSArray. CD’s other benefits may outweigh the annoyance of this extra work, but the work will still have to be done.
To CD or not CD, that is the question — and the answer, you can see, varies. CD can be applied to any project. But if the project requires the use of custom file formats, one of the major benefits of CD is negated. Likewise, if the project requires ordered data CD can still be used, but a lot of extra work will have to be done to make up for CD’s lack of ordered arrays. And, of course, if your app needs to be compatible with versions of OS X prior to 10.4, CD is right out. The exact tipping point of when these inconveniences outweigh CD’s benefits is different for each project. One thing is certain: if your answer to all of these questions is “no”, you should do yourself a favor and learn Core Data now. This very second. It really is that amazing!


Re: Sorting your own Index with CD
You don't have to actually convert the data yourself into an NSArray. If you use NSArrayController and use Sort Descriptors, the sorting is handled nicely. The real difficulty is maintaining your index ordering when you use copy / paste or drag and drop. In your example, if you had a panel with your layers and the user want to use drag and drop to change the ordering, the code to maintain the index can be a pain, particularly if you're allowing multiple layers to be selected for the drag and drop.
> If your app needs to target 10.3, 10.2, or any earlier version of OS X, CD isn't for you. End of story.
Which pretty much rules it out for any company except Apple.
Which pretty much rules it out for any company except Apple.
I'm not so sure. Mac users are much more likely to keep up to date with software than your average computer user. The fact that the hardware requirements for Tiger are modest (a G3 and 256Mb of RAM) helps reenforce this.
While not exactly scientific, it is still educational to look at Omni Group's user stats. Tiger looks like it's enjoying a pretty healthy audience.
Which pretty much rules it out for any company except Apple.
Delicious Library 2 is CoreData all the way. You want it faster AND able to handle more items? You got it!
Have you ever used a program that did not have an "Undo"? Remember the mild/major frustration there? That's a big fat plus for Core Data.
TrailRunner uses CoreData too. Without CoreData, TrailRunner would have less then half the features because I still would search for bugs in my own persistency code..