2011-11-09 3 views
2

나는 성경 응용 프로그램을하고 있는데, 나는 기본 DB 데이터베이스 인 영어 DB.Sqlite를 가지고 있으며, INAPP를 통해 응용 프로그램 내에서 다른 언어 데이터베이스를 다운로드 할 수있다. 다운로드 방법은 알고 있지만, 내 문제는 사용자가 다운로드 할 때이다. 히브리어 언어 데이터베이스, app.if에 10 개의 언어 옵션 버튼이 있습니다. 사용자가 히브리어 데이터베이스를 다운로드하면 히브리어 버튼이 활성화되고 버튼을 탭하여 테이블 뷰에서 볼 수 있지만 히브리어 버튼을 누르면 응용 프로그램 데이터베이스 사용자가 원하는대로, 즉 사용자가 힌디어 데이터베이스 버튼을 탭하면 사용자가 힌디어 데이터베이스를 다운로드 한 경우 테이블 뷰에서 볼 필요가 있고, 사용자는 그 데이터베이스를 전환 할 필요가있는 히브리어 버튼을 탭합니다 히브리어 및로드 hebrew 데이터베이스 tableview.I가 수행 한로드 된 데이터베이스와 함께 이것을 다시로드하는 방법 영어 데이터베이스의 로딩? 영어 데이터베이스를 보여주는 내 코드 데이터베이스 파일을 다운로드하여 응용 프로그램에서 읽는 방법은 무엇입니까?

#import <sqlite3.h> 

#define DbName @"BibleDB.sqlite" 

@interface DbHandler : NSObject { 

} 

+(void)createEditableCopyOfDatabaseIfNeeded; 
+(NSString *) dataFilePath:(NSString *)path; 

// Malayalam Version 
+(int)mNumberOfChaptersInBook:(NSString *)book; 
+(int)mNumberOfVerseForChapter:(NSString *)chapter andBook:(NSString *)book; 
+(NSMutableArray *)mVerseForChapter:(NSString *)chapterNo OfBook:(NSString *)book; 
+(NSString *)mVerseForVerseNo:(NSString *)verseNo OfChapter:(NSString *)chapterNo OfBook:(NSString *)book; 
//+(NSString *)mVerseForVerseNo:(NSString *)verseNo OfChapter:(NSString *)chapterNo OfBook:(NSString *)book FromDB:(sqlite3 *)database; 


// English Version 
//+(int)eNumberOfChaptersInBook:(NSString *)book; 
+(NSMutableArray *)eVerseForChapter:(NSString *)chapterNo OfBook:(NSString *)book; 
+(NSMutableArray *)verseForSearchTag:(NSString *)searchTag; 

//Hindi version 
+(NSMutableArray *)hVerseForChapter:(NSString *)chapterNo OfBook:(NSString *)book; 
+(int)hNumberOfChaptersInBook:(NSString *)book; 
//+(NSMutableArray *)hverseForSearchTag:(NSString *)searchTag; 
//Bookmarks 
+(void)createBookmark:(NSString *)text :(NSString *)book :(NSString *)chapter :(NSString *)verse; 
+(NSMutableArray *)getBookmarks; 
+(bool)deleteBookmark:(NSString *)book :(NSString *)chapter :(NSString *)verse; 

@end 

in.h하는 .m

#pragma mark Englisg DB 


+(NSMutableArray *)eVerseForChapter:(NSString *)chapterNo OfBook:(NSString *)book 
{ 
    NSMutableArray * result = [[NSMutableArray alloc] init]; 
    sqlite3 *database; 
    NSString *dbpath; 
    dbpath = [DbHandler dataFilePath:DbName]; 
    if (sqlite3_open([dbpath UTF8String], &database) == SQLITE_OK) 
    { 
     NSString *selectSql = [NSString stringWithFormat:@"SELECT [text] FROM english where book = '%@' and chapterNo = '%@'",book,chapterNo]; 
     sqlite3_stmt *statement; 
     if (sqlite3_prepare_v2(database, [selectSql cStringUsingEncoding:NSUTF8StringEncoding], -1, &statement, NULL) == SQLITE_OK) 
     { 
      while (sqlite3_step(statement) == SQLITE_ROW) 
      { 
       [result addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)]] ; 
      } 
      sqlite3_finalize(statement); 
     } 
     else 
     { 
      NSLog(@"Sql Preparing Error"); 
     } 
     sqlite3_close(database); 
    } 
    else 
    { 
     NSLog(@"Database not opening"); 
    } 
    return result; 


} 


+(NSMutableArray *)verseForSearchTag:(NSString *)searchTag 
{ 
    NSMutableArray * result = [[NSMutableArray alloc] init]; 
    sqlite3 *database; 
    NSString *dbpath; 
    dbpath = [DbHandler dataFilePath:DbName]; 
    if (sqlite3_open([dbpath UTF8String], &database) == SQLITE_OK) 
    { 
     NSString *selectSql = [NSString stringWithFormat:@"SELECT [text],book,chapterNo,verseNumber FROM english where [text] like '%%%@%%%' limit 0,500",searchTag]; 
     sqlite3_stmt *statement; 
     if (sqlite3_prepare_v2(database, [selectSql cStringUsingEncoding:NSUTF8StringEncoding], -1, &statement, NULL) == SQLITE_OK) 
     { 
      while (sqlite3_step(statement) == SQLITE_ROW) 
      { 
       [result addObject:[[NSMutableDictionary alloc] init]] ; 

       [[result lastObject] setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)] forKey:@"text"]; 
       [[result lastObject] setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)] forKey:@"book"]; 
       [[result lastObject] setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 2)] forKey:@"chapter"]; 
       [[result lastObject] setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 3)] forKey:@"verse"]; 
      } 
      sqlite3_finalize(statement); 
     } 
     else 
     { 
      NSLog(@"Sql Preparing Error"); 
     } 
     sqlite3_close(database); 
    } 
    else 
    { 
     NSLog(@"Database not opening"); 
    } 
    return result; 


} 
+(int)hNumberOfChaptersInBook:(NSString *)book 
{ 
    sqlite3 *database; 
    NSString *dbpath; 
    dbpath = [DbHandler dataFilePath:DbName]; 
    if (sqlite3_open([dbpath UTF8String], &database) == SQLITE_OK) 
    { 
     NSString *selectSql = [NSString stringWithFormat:@"SELECT count(*) FROM hindi where book = '%@'",book]; 
     sqlite3_stmt *statement; 
     if (sqlite3_prepare_v2(database, [selectSql cStringUsingEncoding:NSUTF8StringEncoding], -1, &statement, NULL) == SQLITE_OK) 
     { 
      while (sqlite3_step(statement) == SQLITE_ROW) 
      {  
       return [[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)] intValue]; 
      } 
     } 
     else 
     { 
      NSLog(@"Sql Preparing Error"); 
     } 
    } 
    else 
    { 
     NSLog(@"Database not opening"); 
    } 
    return 0; 


} 

#pragma mark DB Setup Functions 

+(void)createEditableCopyOfDatabaseIfNeeded { 
    // First, test for existence. 
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:DbName]; 
    success = [fileManager fileExistsAtPath:writableDBPath]; 
    if (success) { 
     NSLog(@"Database file already exist, so returning..."); 
     return; 
    } 
    NSLog(@"CREATING A NEW COPY OF THE DATABASE..."); 
    // The writable database does not exist, so copy the default to the appropriate location. 
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:DbName]; 
    //[fileManager removeItemAtPath:writableDBPath error:nil]; 
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
    if (!success) { 
     //Some serious problem... 
     NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
    } 
} 

+(NSString *) dataFilePath:(NSString *)path 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return [documentsDirectory stringByAppendingPathComponent:path]; 
} 

@end 

이며,이 표시를위한이 내있는 tableview 코드는이 일을 도와주세요

static NSString *CellIdentifier = @"Cell"; 

    readCell *cell = (readCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"readCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
     cell.malayalamVerse.hidden = YES; 
     cell.malayalamVerse.backgroundColor = [UIColor clearColor]; 
     // self.table.tableFooterView = refreshFooterView; 
     //self.table.tableFooterView.userInteractionEnabled = YES; 

    } 
if(tableView == table) 
    { 
     UIView *myBackView = [[UIView alloc] initWithFrame:cell.frame]; 
     // myBackView.backgroundColor = [UIColor colorWithRed:250.0 green:248.0 blue:192.0 alpha:1.0]; 
     [myBackView setBackgroundColor:[UIColor clearColor]]; 
     cell.selectedBackgroundView = myBackView; 
     [myBackView release]; 


     cell.textLabel.highlightedTextColor = [UIColor colorWithRed:1 green:1 blue:0.75 alpha:1]; 
     table.backgroundColor = [UIColor clearColor]; 
     table.separatorColor = [UIColor clearColor]; 
     cell.chapterAndVerse.text = [NSString stringWithFormat:@"%@.%d ",delegate.selectedChapter, indexPath.row+1]; 

     cell.chapterAndVerse.backgroundColor= [UIColor whiteColor]; 
     cell.chapterAndVerse.textColor = [UIColor brownColor]; 
     cell.chapterAndVerse.font = [UIFont fontWithName:@"Georgia" size:14.0]; 
     cell.chapterAndVerse.frame=CGRectMake(33, 6, 30.0, 12.0); 
     cell.textLabel.text = [NSString stringWithFormat:@"   %@",[delegate.allSelectedVerseEnglish objectAtIndex:indexPath.row]]; 
     cell.textLabel.font = [UIFont fontWithName:@"Georgia" size:18]; 
     cell.textLabel.textColor = [UIColor darkGrayColor]; 
     cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; 
     cell.textLabel.numberOfLines = 0; 
     cell.backgroundColor = [UIColor clearColor]; 

    } 

을 DB , 누군가가 이것에 대한 아이디어가 있다면 나와 공유하십시오. 감사합니다.

+0

제발 도와주세요. 간단한 질문이 아닙니다. 누구나 아이디어를 공유해 주시면 – ICoder

답변

2

이 질문은 잠시 동안 머물러있어 이미 문제를 분류했을 수 있습니다.

꽤 많은 코드를 게시했지만 질문을 이해하려면 tableView : cellForRowAtIndexPath : 메소드에서 앱이 어떤 언어를 선택했는지에 따라 다른 작업을 수행해야합니다. .

두 가지 접근 방법 : 어느 (1) (코드에서 delegate으로 향하고있는) 데이터베이스 개체에 같은 allSelectedVerse`모든 언어에 대한 하나의 방법을 가지고 '. 그런 다음 데이터베이스 개체 메서드에서 언어 테스트를 수행하고 적절한 텍스트를 반환합니다. 또는 (2) tableView : cellForRowAtIndexPath : 메소드에서 선택한 언어에 대한 테스트를 실행하고 이에 따라 데이터베이스 개체에서 다른 메서드를 호출합니다.

어느 쪽이든, 선택한 언어를 저장하는 방법이 필요합니다. 이것은 데이터베이스 개체 또는 설정을 추적하는 데 사용되는 단일 개체 또는 여러 가지 다른 방식으로 사용할 수 있습니다.

(2)는 덜 우아하지만 설명하기에 더 적은 코드가 필요합니다. NSString 속성 을 사용하여 현재 선택된 언어가 데이터베이스 객체에 저장된다고 가정하면 사용자가 tableView에 reloadData 메서드를 보내는 언어를 변경할 때마다 다음 코드가이 트릭을 수행해야한다고 가정합니다.

- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    readCell *cell = (readCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     [self configureCellOnFirstCreation: cell]; // farm out configuration 
    } 

    if (tableView == table) 
    { 
    [self configureCell: cell]; // farm out cell configuration, so the content setting code is more prominent 

    cell.chapterAndVerse.text = [NSString stringWithFormat:@"%@.%d ",delegate.selectedChapter, indexPath.row+1]; 

    if ([[delegate selectedLanguage] isEqualToString: @"Malayalam"]) 
    { 
     cell.textLabel.text = [NSString stringWithFormat:@"   %@",[delegate.allSelectedVerseMalayalam objectAtIndex:indexPath.row]];   
    } 
    else if ([[delegate selectedLanguage] isEqualToString: @"Hindi"]) 
    { 
     cell.textLabel.text = [NSString stringWithFormat:@"   %@",[delegate.allSelectedVerseHindi objectAtIndex:indexPath.row]]; 
    } 
    else // default to English is no matching string found 
    { 
     cell.textLabel.text = [NSString stringWithFormat:@"   %@",[delegate.allSelectedVerseEnglish objectAtIndex:indexPath.row]]; 
    } 
    } 

    else 
    { 
     // handle the other case, e.g. when we're doing search 

    } 
} 

미주 (이 모든 ... 난 처음에 올바로 문제를 이해 한 가정) 나는 당신이 당신의 질문에 적은 코드를 게시 할 수있는 경우에 당신이 더 빠른 답변을 얻을 수 있습니다 생각합니다. 위의 코드에서 다른 메소드로 설정을 변경하여 중요한 코드 플로우가 더 두드러졌습니다.

+0

친절한 응답을 보내 주셔서 감사합니다. 그 작품의 날씨를 확인해보십시오. 감사합니다. + 1 답변 해드립니다. – ICoder

관련 문제