MojoDatabase 소스 학습의 객체 매핑

3181 단어
Mojo-database는 개인적으로 멀티소스 프로젝트를 좋아합니다. 다음은 이 프로젝트의 소개와 주소입니다. Mojo-database 소개: Mojo Database is an Active Record-like ORM for SQLite written in Objective-C for use in iOS application.
The goal is to provide a nicer user interface for using SQLite with Objective-C applications via the ActiveRecord pattern.
다음은 모조의 대상 매핑 메커니즘을 소개하겠습니다.다음 코드는 모델 실행findsql 실행 코드입니다.
NSArray *results = [database executeSql:sql
withParameters:parameters withClassForRow:[self class]];

코드의 [self class]는 자신의 클래스를 전달하는 것이고,
withParameters:(NSArray *)parameters 
withClassForRow:(Class )rowClass 

execute 함수에는 다음과 같은 코드가 있습니다.
      if (needsToFetchColumnTypesAndNames) {
        columnTypes = [self columnTypesForStatement:statement];
        columnNames = [self columnNamesForStatement:statement];
        needsToFetchColumnTypesAndNames = NO;
      }

      id row = [[rowClass alloc] init];
      [self copyValuesFromStatement:statement 
      toRow:row queryInfo:queryInfo 
      columnTypes:columnTypes columnNames:columnNames];
      [rows addObject:row];
    }

그중 id row = [[rowClass alloc] init]; 동적 생성 대상입니다. 그 중에서 sqlite가 지원하는 유형은
-(int)columnTypeToInt:(NSString *)columnType {
  if ([columnType isEqualToString:@"INTEGER"]) {
    return SQLITE_INTEGER;
  } else if ([columnType isEqualToString:@"REAL"]) {
    return SQLITE_FLOAT;
  } else if ([columnType isEqualToString:@"TEXT"]) {
    return SQLITE_TEXT;
  } else if ([columnType isEqualToString:@"BLOB"]) {
    return SQLITE_BLOB;
  } else if ([columnType isEqualToString:@"NULL"]) {
    return SQLITE_NULL;
  }
  return SQLITE_TEXT;
}


수치를 추출하는 코드
-(id)valueFromStatement:(sqlite3_stmt *)statement 
column:(int)column queryInfo:(NSDictionary *)queryInfo columnTypes:(NSArray *)columnTypes 
{
  int columnType = [[columnTypes objectAtIndex:column] intValue];

  /*
   * force conversion to the declared type using sql conversions; this saves
   * some problems with NSNull being assigned to non-object values
   */
  if (columnType == SQLITE_INTEGER) {
    return [NSNumber numberWithInt:sqlite3_column_int(statement, column)];
  } else if (columnType == SQLITE_FLOAT) {
    return [NSNumber numberWithDouble:sqlite3_column_double(statement, column)];
  } else if (columnType == SQLITE_TEXT) {
    const char* text = (const char *) sqlite3_column_text(statement, column);
    if (text != nil) {
      return [NSString stringWithUTF8String:text];
    } else {
      return @"";
    }
  } else if (columnType == SQLITE_BLOB) {
    // create an NSData object with the same size as the blob
    return [NSData dataWithBytes:sqlite3_column_blob(statement, column) length:sqlite3_column_bytes(statement, column)];
  } else if (columnType == SQLITE_NULL) {
    return nil;
  }


  NSLog(@"Unrecognized SQL column type: %i for sql %@", columnType, [queryInfo objectForKey:@"sql"]);
  return nil;
}

객체 등록 정보의 코드 설정
      [row setValue:value forKey:[columnNames objectAtIndex:i]];
    }

좋은 웹페이지 즐겨찾기