private void emitTableCRUD( Table table ) throws Exception
	{
		// Default array params for all rows
		ArrayList<String> params = new ArrayList<String>();
		for ( Field row : table.fields )
		{

			params.add( SqlUtil.getJavaTypeFor( row.type ) );
			params.add( row.name );
		}

		ArrayList<String> paramsWithUnique = new ArrayList<String>();
		paramsWithUnique.add( SqlUtil.getJavaTypeFor( table.getPrimaryKey().type ) );
		paramsWithUnique.add( table.getPrimaryKey().name );

		ArrayList<String> updateParams = new ArrayList<String>();
		// TODO : add unique id
		updateParams.addAll( params );

		Iterator<Constraint> constraintiter;

		writer.emitEmptyLine();
		writer.emitJavadoc( table.name + " OPERATIONS\nall operations require this client to first run start" );
		writer.emitEmptyLine();

		// Add through ContentProviderOperation
		writer.beginMethod( "void", "add" + Util.capitalize( table.name ), EnumSet.of( Modifier.PUBLIC ), params.toArray( new String[params.size()] ) );
		writer.emitStatement( "ContentProviderOperation.Builder operationBuilder = ContentProviderOperation.newInsert(" + mModel.getContentProviderName() + "." + SqlUtil.URI( table ) + ")" );
		for ( Field row : table.fields )
		{
			writer.emitStatement( "operationBuilder.withValue(" + mModel.getDbClassName() + "." + SqlUtil.ROW_COLUMN( table, row ) + "," + row.name + ")" );
		}
		insertAddOpBlock();
		writer.endMethod();

		// Removes
		writeRemoveWith( table, table.getPrimaryKey() );

		constraintiter = table.constraints.iterator();

		while ( constraintiter.hasNext() )
		{
			Constraint constraint = constraintiter.next();
			if ( constraint.type.equals( Constraint.Type.UNIQUE ) )
			{
				final String[] fields = SqlUtil.getFieldsFromConstraint( constraint );
				for ( int i = 0; i < fields.length; i++ )
				{
					writeRemoveWith( table, table.getFieldByName( fields[i] ) );
				}
			}
		}

		// Remove All results
		writer.emitEmptyLine();
		writer.beginMethod( "void", "removeAll" + Util.capitalize( table.name ), EnumSet.of( Modifier.PUBLIC ) );
		writer.emitStatement( "ContentProviderOperation.Builder operationBuilder = ContentProviderOperation.newDelete(" + mModel.getContentProviderName() + "." + SqlUtil.URI( table ) + ")" );
		insertAddOpBlock();
		writer.endMethod();

		// Update through ContentProviderOperation
		writer.emitEmptyLine();
		writer.beginMethod( "void", "update" + Util.capitalize( table.name ), EnumSet.of( Modifier.PUBLIC ), updateParams.toArray( new String[updateParams.size()] ) );
		writer.emitStatement( "ContentProviderOperation.Builder operationBuilder = ContentProviderOperation.newUpdate(" + mModel.getContentProviderName() + "." + SqlUtil.URI( table ) + ")" );
		for ( Field row : table.fields )
		{
			writer.emitStatement( "operationBuilder.withValue(" + mModel.getDbClassName() + "." + SqlUtil.ROW_COLUMN( table, row ) + "," + row.name + ")" );
		}
		insertAddOpBlock();
		writer.endMethod();
	}