1

这一定是一个愚蠢的问题,但我无法让我的查询工作。好像我的数据库是空的(我仔细检查过,不是)。它是一个简单的SELECT * FROM table查询。这就是我尝试的方式:

+(MyDatabase *)database{
    if (database == nil) {
        database = [[MyDatabase alloc] init];
    }
    return database;
}
- (id)init
{
    self = [super init];
    if (self) {
        NSString *sqliteDb = [[NSBundle mainBundle] pathForResource:@"personsDB" ofType:@"sqlite3"];
        if (sqlite3_open([sqliteDb UTF8String], &database) != SQLITE_OK) {
            NSLog(@"Fail to open Database.");
        }
    }
    return self;
}

-(NSArray *)getAllRows{
    NSMutableArray *retArray =  [[NSMutableArray alloc] init];
    NSString *query = @"SELECT * FROM persons";

    sqlite3_stmt *statement;
    NSLog(@"checking SQLITE_OK?");
    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
        NSLog(@"SQLITE_OK");
        while (sqlite3_step(statement) == SQLITE_ROW) {
            int personID = sqlite3_column_int(statement, 0);
            char *personChars = (char *) sqlite3_column_text(statement, 1);
            int gender = sqlite3_column_int(statement, 2);
            int related = sqlite3_column_int(statement, 3);

            NSString *person = [[NSString alloc] initWithUTF8String:personChars];
            MyDBInfo *info = [[MyDBInfo alloc] initWithpersonID:personID person:person gender:gender related:related ];

            [retArray addObject:info];
        }
        sqlite3_finalize(statement);
    }
    return retArray;
}

我认为这就是所有有趣的东西。

在我的日志中,我得到了checking SQLITE_OK?,但没有SQLITE_OK。我没有得到Fail to open Database.,所以我假设那里一切都很好。

我的数据库已满,并且有一个名为persons. 我对sqlitein很陌生iOS apps

谢谢你。

4

1 回答 1

3
  1. 您确定 db 包含在您的捆绑包中吗?的默认行为sqlite3_openSQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,因此如果它不存在,它将在您的设备/模拟器上创建,因此您不会看到Fail to open Database. sqlite3_open_v2如果您不想要,请使用SQLITE_OPEN_CREATE. 无论如何,我有时会在我的 xcode 项目中添加文件,但它们不会自动包含在我的包中。在项目导航器顶部选择目标,点击目标,在主面板中选择目标,选择“Build Phases”,看看你的db是否包含在“Copy Bundle Resources”中。

  2. 可能不相关,但我总是将数据库从捆绑包复制到文档文件夹(如果它不存在的话)。

  3. 如果我没有收到预期的 SQLITE_OK,我总是查看我的返回代码或记录我的错误消息和错误代码(这可能会报告未找到有问题的表,这可以让您识别问题)。

因此,

NSLog(@"%s db err '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(contactDB), sqlite3_errcode(contactDB));
于 2012-06-26T23:39:09.000 回答