2011-11-09 21 views
2

私は聖書のアプリケーションをやっている、私はデフォルトの聖書データベース英語DB.Sqliteを使用して、INAPPを介してアプリケーション内で別の言語のデータベースをダウンロードすることができます、私はダウンロードを行う方法を知っているが、私の問題は、ヘブライ語データベースには、ユーザーがヘブライデータベースをダウンロードしたときにapp.ifに10の言語オプションボタンがあり、ヘブライボタンが有効になり、ボタンをタップしてテーブルビューで表示できますが、ヘブライボタンをタップするとアプリケーションデータベースユーザーが望む通りに切り替える必要があります。つまり、ユーザーがヒンディー・データベースをダウンロードした場合、ユーザーがヒンディー・データベース・ボタンをタップすると、それをテーブルビューで表示する必要があります。ユーザーは、そのデータベースを切り替える必要があるヘブライ・ボタンをタップします。ヘブライ語、およびヘブライ語のデータベースをテーブルビューにロードします。私は、ダウンロードしたデータベースでこれをリロードする方法を英語データベースの読み込みを完了しましたか? 英語データベースを示すための私のコードは データベースファイルをダウンロードしてアプリケーションで読む方法を教えてください。

#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 

であり、これを表示するため、この私のテーブルビューのコードは、これを行うために私を助けてください

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 `として、すべての言語のための1つの方法を持っています:」。次に、データベースオブジェクトメソッドで、言語のテストを行い、適切なテキストを返します。 または(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

あなたの親切なレスポンスに感謝します。私は天気その作品かどうかを確認します。 – ICoder

関連する問題