ftp.nice.ch/pub/next/developer/objc/dbkit/TableViewExample.92.9.s.tar.gz#/TableViewExample/TableViewController.m

This is TableViewController.m in view mode; [Download] [Up]

/* TableViewController.m:
 * You may freely copy, distribute, and reuse the code in this example.
 * NeXT disclaims any warranty of any kind, expressed or  implied, as to its
 * fitness for any particular use.
 *
 * Written by: Mai Nguyen, NeXT Developer Support
 *
 *
 */
#import "TableViewController.h"

#define INSTALL_MODEL NXLocalizedString("Please install OracleDemo.dbmodel into your ~/Library/Databases directory and restart.", NULL, "Notify user that OracleDemo.dbmodel must be installed in his local Databases directory.")

@implementation TableViewController
/*
* Miscellaneous initialization tasks: connect to database, initialize
* tableview, set up dbModule. 
*/ 
-appDidInit:sender
{
	id entityList = [[List alloc] init];
	NXRect viewFrame;
	
	/* Notify the user if the database can't be found */
	if (!(dbDatabase = [DBDatabase findDatabaseNamed:"OracleDemo" 
					connect:YES])) {
		NXRunAlertPanel(NULL,INSTALL_MODEL, "OK", NULL, NULL);
		return self;
	}
	[dbDatabase setDelegate:self];
	
		/* Install the tableview into the custom view */
	[[dbTableView getFrame:&viewFrame] free];
	dbTableView = [[DBTableView alloc] initFrame:&viewFrame];
	[[window contentView] addSubview:dbTableView];
	[dbTableView setHorizScrollerRequired:YES];
	[dbTableView setVertScrollerRequired:YES];
	rootEntity = [dbDatabase entityNamed:"Order"];
	
		/* Must initialize your dbModule */
  	dbModule = [[DBModule alloc] initDatabase:dbDatabase 
							entity:rootEntity];					
	dbFetchGroup = [dbModule rootFetchGroup];
	dbQualifier = [[DBQualifier alloc] initForEntity:[dbModule entity]
				fromDescription:"customer.state = %s", "CA"];	
	[window disableFlushWindow];
	[self initTableView];
	[[window reenableFlushWindow] flushWindow];
	
	return self;
}
- showAll:sender
{
	[dbFetchGroup fetchContentsOf:[dbModule entity]
											usingQualifier:dbQualifier];
	[dbTableView display];

	return self;
}

/* In order to replicate the Interface Builder functionality, one has to
 * add an expression to the fetchgroup for each attribute and subattribute.
 */

- addTableColumn:(const char *)label
{
    id newExpression;

    /* allocate a new expression, add it to the FetchGroup and add it */
	/* to the TableView */
	newExpression = [[DBExpression alloc] initForEntity:[dbModule entity]
				fromDescription:label];
	[dbFetchGroup addExpression:newExpression];
	[dbTableView  addColumn:newExpression withTitle:label];
    return self;
}


/* Get all the attributes and subattributes from the defined table (named
 * "Order" in our demo model) and initialize the tableview accordingly.
 */
- initTableView
{
	int i, j, propCount, subpropCount;
	id prop, subprop, subpropList;
	char buffer[100];

  	propList = [[List alloc] init];
	[rootEntity getProperties: propList];
    propCount = [propList count];

    for (i = 0; i < propCount; i++) {
	    prop = [propList objectAt:i];

	    if(! [[prop propertyType] isEntity]) {

			/* add top-level attribute */
			[self addTableColumn:[prop name]];   /* defined above */
		} else if ([prop isSingular]) {

			/* add all sub-attributes but skip sub-relationships.
			   Note that getting sub-attributes only work for
			   to-one relationship
			 */
			subpropList  = [[List alloc] init];
			[[prop propertyType] getProperties:subpropList];
			subpropCount = [subpropList count];
			for (j = 0; j < subpropCount; j++) {
				subprop = [subpropList objectAt:j];
				if (![[subprop propertyType] isEntity]) {
				sprintf(buffer, "%s.%s", [prop name], [subprop name]);
				[self addTableColumn:buffer];   /* defined above */
				}
			}
			[subpropList free];		/* to prevent a memory leak */
		}
	}
	
		/* Making this association will make the fetchgroup
		 * become the tableview data source.
		 */
	[dbFetchGroup makeAssociationFrom:nil to:dbTableView];
		/*
		 * free property list which is no longer needed
		 */
	[propList free];
	[window makeKeyAndOrderFront:self];
    return self;
}


- free
{
	if (dbQualifier)
		[dbQualifier free];
	if (dbTableView)
		[dbTableView free];
	return [super free];
}

/* DBDatabase delegate methods to log SQL queries  - Useful for debugging */

- (BOOL)db:aDb willEvaluateString:(const char*)aString usingBinder:aBinder
{
	fprintf(stderr, "SQL query:%s\n", aString);
	return YES;
}

@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.