2011-11-09 29 views
2

我正在做一个圣经应用程序,我有一个默认的圣经数据库英文DB.Sqlite,使用可以通过INAPP在应用程序内下载不同的语言数据库,我知道如何做下载,但我的问题是当用户下载希伯来语语言数据库,应用程序中有10个语言选项按钮。如果用户下载希伯来语数据库,希伯来语按钮将启用,他可以点击按钮并在桌面视图中查看它,但是当他点击希伯来语按钮时,应用程序数据库需要根据用户需要进行切换,也就是说,如果用户点击印地文数据库按钮,如果用户下载了印地语数据库,则需要在桌面视图中查看,用户点击需要切换该数据库的希伯来文按钮希伯来语,并在tableview中加载希伯来语数据库。我已经完成加载英文数据库如何重新加载与下载的数据库? 我的英文显示数据库代码是 in.h中如何下载数据库文件并在应用程序中读取它?

#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 

.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]; 

    } 

请帮我做这件事如果有人对此有所了解,请与我分享。 非常感谢。

+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

感谢您的友善response.let我检查天气其作品或不.thanks。+ 1为你answert – ICoder

相关问题