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

#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


这是我的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];

    }


请帮助我做到这一点,如果有人对此有任何想法,请与我分享。
非常感谢。

最佳答案

这个问题已经存在了一段时间,因此您可能已经解决了这个问题。

您已经发布了很多代码,但是如果我理解这个问题,那么最主要的事情就是在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

  }
}


尾注我认为,如果您可以在问题中张贴更少的代码,则可能会得到更多更快的答案。在上面,我将配置移植到其他方法上,因此重要的代码流更加突出。

关于iphone - 如何下载数据库文件并在应用程序中读取它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8065992/

10-14 19:37
查看更多