Key-value coding is a way to separate interfaces and a way to flexibly access data and methods in object instances. The concept has a long history. It appeared in Eiffel, and other places as well. If you are familiar with OGNL then you will know it from there. We'll call key-value coding KVC in the context of this page to abbreviate. KVC also exists in the Cocoa infrastructure shipped with MacOS-X, having evolved from OPENSTEP and the development tools created for it. In this page we will focus on KVC in the context of WebObjects and java.

Conceptual Aspects

Consider the following model segment:

This model shows a number of entities and the lines between the entities show relationships. For example, the Organisation entity has a to-one relationship with a Worker called "workerAccount" and it also has a "to-many" relationship to "OrgRegion" called "orgRegions".

The term "instance" here is referring to a specific organisation. For example, "The Corn Flour Company" and "Aqua Breweries" might be instances of the Organisation entity.

Value For Key

An instance of an Organisation can supply values for the keys "address", "countryIso", "email" etc... and they will return a value for the key. It is essentially acting like an NSDictionary or a Map object. This is how data is extracted from an object.

Take Value For Key

This is where an instance of an entity is asked to "take up" some value for a key. For example, an instance of an organisation might be told to take the value "foo@foo.co.nz" for the key "email". This is how data is loaded into an object using KVC.

Value For Key Path

Using a dotted path, it is possible to traverse relationships to access data in other entities. For example, if you have an instance of "OrgExpertise", it is possible to get the value for the key path "organisation.workerAccount.name". This is how you can extract data from the interconnected network of object instances.

Take Value For Key Path

Using a dotted path, it is possible to get an object in the interconnected network of object instances to "take up" some piece of data. For example, if you have an instance of "OrgExpertise" then it is possible to get the object to "take up" a value of "Joe Smith" for the key path "organisation.workerAccount.name".