BLOB数据未显示在UITextView中

时间:2013-05-29 09:26:48

标签: iphone uitableview sqlite uitextview

你好

我被困在最后一部分,请帮助我。

对于图书清单(在 UITableView 中),三个视图第一个一个, 第二个章节(在 UITableView 中),最后一个用于内容,其中是文本格式(在 UITextView 中)。

高达第二个视图它工作正常。问题是,当我在第二个视图中选择任何章节时,第三个视图中的文本视图不显示任何内容。但是在输出中它显示数字序列。

从数据库中获取数据并显示到UITextView中的代码。

 NSMutableString *mStr = [NSMutableString stringWithFormat:@"select content from content where name = \"%@\" and chapterno = %@",chapName,chapNo];
 const char *sql =(char *)[mStr UTF8String];

    sqlite3_stmt *sqlStmt;
    if(sqlite3_prepare(dbContent, sql, -1, &sqlStmt, NULL)!=SQLITE_OK)
    {
        NSLog(@"prob with prepare statement: %s",sqlite3_errmsg(dbContent));
    }
    else
    {
        while (sqlite3_step(sqlStmt)==SQLITE_ROW) {
            len = sqlite3_column_bytes(sqlStmt, 0);
            NSData *cData = [[NSData alloc]initWithBytes:sqlite3_column_blob(sqlStmt, 0) length:len];

            NSString *nstr = [NSString stringWithUTF8String:[cData bytes]];
            myTextView.text = nstr;
  }

上面的 chapName 来自第一个视图,而 chapNo 第二个视图中的选定行。

内容表如下:

 id      bookid      name       chapterno          content

  1        1          abc           1            BLOB(size:4217)  
  2        1          abc           2            BLOB(size:3193)
  3        1          abc           3            BLOB(size:3501)

O / p有很多这样的数字......

  <0d0a3120 496e2074 68652062 6567696e 6e696e67 20476f64 20637265 61746564 20746865 20686561 76656e20 616e6420 74686520 65617274 682e0d0a...>

这里,我需要在文本视图中显示文本内容。我在这里缺少什么?

3 个答案:

答案 0 :(得分:0)

我认为问题是NSData到NSString的转换。如果您的Sqlite字符串不是以空值终止的,则使用以下行进行转换应该有帮助。

NSString* nStr = [[NSString alloc] initWithData:cData
                                     encoding:NSUTF8StringEncoding];

答案 1 :(得分:0)

  NSMutableArray *ar=[[NSMutableArray alloc] init];
 NSString *strQuery=[NSString stringWithFormat:@"select content from content where name = \"%@\" and chapterno = %@",chapName,chapNo];
 const char *sql =[mStr UTF8String];

    sqlite3_stmt *sqlStmt;
    if(sqlite3_open([self.dbPath UTF8String], &amp;database)==SQLITE_OK) 
    {
        if(sqlite3_prepare_v2(database, query, -1, &amp;compiledStmt, NULL)==SQLITE_OK){
         while (sqlite3_step(sqlStmt)==SQLITE_ROW) {
            len = sqlite3_column_bytes(sqlStmt, 0);
            NSData *cData = [[NSData alloc]initWithBytes:sqlite3_column_blob(sqlStmt, 0) length:len];

            NSString *nstr = [NSString stringWithUTF8String:[cData bytes]];
            myTextView.text = nstr;

         [ar addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:[NSData dataWithBytes:sqlite3_column_blob(compiledStmt, 1) length:sqlite3_column_bytes(compiledStmt, 1)],@"data1",
                                  [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStmt, 2)],@"data2",nil]];
    }
    else {
                NSLog(@"Invalid query");
            }
 NSArray *arToReturn=([ar count]>;0)?[NSArray arrayWithArray:ar]:nil;
        ar=nil;
return arToReturn;
    }

请执行以下代码,让我通知任何问题和生成的查询。

答案 2 :(得分:0)

我找到了一种最简单的备用方式。

因为,我从数据库中获取书名(从第一个表格视图)和章节号(从第二个表格视图)并将其传递到详细视图页面。

让我们说,我的书名是数学,物理,地理......章节用数字(1,2,3 ......)。只需要保存文件名为

  [booknamechpatername.txt]
#book name- Maths
  chapter1-->> maths1.txt
  chapter2-->> maths2.txt
  ...
#book name - Physics
  chapter1 -->>  physics12.txt
  ...
  geography21.txt
 ...so on..

并将其拖至iphone资源或所需的任何文件夹。 现在,将该文件存储到字符串中并显示到UITextView中。

-(void)loadFile{
   NSError *error;
   NSArray *dirPath = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
   NSString *docDir = [dirPath objectAtIndex:0];
   if (!docDir) {
       NSLog(@"Doc dir not found");
    }
   NSString *str = [[NSBundle mainBundle]pathForResource:[NSString stringWithFormat:@"%@%@",chapName,chapNo] ofType:@"txt"];

   NSString *content = [NSString stringWithContentsOfFile:str encoding:NSUTF8StringEncoding error:&error];
   myTextView.text = content;
}

并在 viewDidLoad

中调用它
 [self loadFile];

否则,如果您只想通过数据库,此链接https://github.com/jblough/bible-ios会有所帮助。