从sqlite db iphone sdk导入多个记录

时间:2010-03-01 22:07:50

标签: iphone database sqlite uitableview

我需要一些帮助!请。我正在尝试开发一个非常简单的应用程序,基本上只是一个简单的书籍阅读器。理想情况下,第一个视图将是一个列出章节名称的uitableview,然后选择该行会将您带到一个详细视图,该视图具有分成段的章节。请注意,段实际上是表中的记录。所以我试图用db表中的多个记录填充uitext视图。从这个数据库中获取所有数据的过程就是我搞砸了所有数据的过程。我在网上搜索了一些教程,我找到了一个非常有用的here。我一步一步地完成了它,这是有道理的,这一切都是有道理的。但是我没有使用他提供的数据库,而是想尝试插入我自己的数据库,它拥有所有内容,我想要查看它,它不会工作。它抛出一个很好的*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSString stringWithUTF8String:]: NULL cString'错误,我无法弄清楚。这听起来很熟悉还是对任何人都有意义? readFromDB方法的代码是:

-(void) readTextFromDatabase {
// Setup the database object
sqlite3 *database;

// Init the animals Array
textAr = [[NSMutableArray alloc] init];

// Open the database from the users filessytem
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    // Setup the SQL Statement and compile it for faster access
    const char *sqlStatement = "select * from books";//This is where I'm running into trouble
    sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
        // Loop through the results and add them to the feeds array
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
            // Read the data from the result row
            NSString *aChapter = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
            NSString *aSection = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];


            // Create a new text object with the data from the database
            Text *text = [[Text alloc] initWithChapter:aChapter Section:aSection];

            // Add the text object to the text Array
            [textAr addObject:text];

            [text release];
        }
    }
    // Release the compiled statement from memory
    sqlite3_finalize(compiledStatement);

}
sqlite3_close(database);

除了切换某些变量的名称外,我没有更改该代码的任何部分,除了我提到的地方可能会导致一些问题。我将“select * from animals”语句更改为“select * from books”,其中animals是旧表的名称,books是我想要使用的新db中的表的名称。我认为这不会太大,但显然确实如此。我认识到这不是一个非常整洁的问题,但如果有任何人可以帮助我超越我面临的这面墙,我将不胜感激。感谢!!!

1 个答案:

答案 0 :(得分:1)

我在使用sqlite时遇到了同样的问题,我无法回想起空字符串何时出现(可能来自行中的NULL值),但我使用此代码来解决问题:

+ (NSString*)stringWithCharsIfNotNull: (char*)chars
{
    if ( chars == NULL )
        return nil;
    else
        return [[NSString stringWithUTF8String: chars] 
                stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
}