Inserting with the Adaptor Layer
Description
The adaptor level is a server-independent interface for working with the relational database consisting of an EOAdaptor, an EOAdaptorContext and an EOAdaptorChannel. In this level, the database rows are represented as instances of NSDictionary.
The EOAdaptor manages the EOModel, a model that maps the tables and relationships in the database to EOF objects. The EOAdaptor is also responsible for instantiating the correct subclass for the database specific adaptor layer. The EOAdaptorContext manages the database transactions. The EOAdaptorChannel does all the inserts, updates, and deletes, as well as executing SQL. Before you send any SQL to the database, you need to:
· Create an EOAdaptor for the database.
· Create an EOAdaptorContext from the EOAdaptor.
To insert into the database at the adaptor level, the row should be stored in a NSDictionary where the keys are NSStrings containing the database-dependent attributes, and the values are their corresponding values.
The keys representing the attributes depend on the database. In ODBC, the keys are the column names. For example, in Oracle, the first column to which the SQL INSERT refers has the key "Attribute0", the second column has the key "Attribute1" and so on.
The following code inserts a row using the adaptor level.
Figure 1. Objective-C Code
- (void) rawInsert:(EOEditingContext *)ec forModelNamed:(NSString *)
modelName forEntityNamed:(NSString *)entityName
dictionary:(NSDictionary *)dict
{
EOModel *myModel;
EOEntity *myEntity;
EOAdaptor *myAdaptor;
EOAdaptorContext *myAdaptorContext;
EOAdaptorChannel *myAdaptorChannel;
// get the model, entity describing table to insert into
myModel = [[ec modelGroup] modelNamed:modelName];
myEntity = [ec entityNamed:entityName];
// get the adaptor, adaptor context, and adaptor channel
myAdaptor = [EOAdaptor adaptorWithModel:myModel];
myAdaptorContext = [myAdaptor createAdaptorContext];
myAdaptorChannel = [myAdaptorContext createAdaptorChannel];
// insert row into the database
[myAdaptorChannel openChannel];
[myAdaptorChannel insertRow:dict forEntity:myEntity];
[myAdaptorChannel closeChannel];
}