【发布时间】:2010-01-28 15:38:23
【问题描述】:
这是我的第一个基于 SQLite 的 iPhone 应用程序,我正试图让它从我的数据库中读取菜单层次结构。
数据库似乎注册良好,因为编译语句没有错误(尝试输入有效的表名进行测试)但由于某种原因 sqlite3_step(compiledStmt) 不等于 SQLITE_ROW 好像暗示那里没有数据;有哪些。
sqlite3 *database;
menu = [[NSMutableArray alloc] init];
if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
const char *sqlStmt = "SELECT * FROM Menu";
sqlite3_stmt *compiledStmt;
if (sqlite3_prepare_v2(database, sqlStmt, -1, &compiledStmt, NULL) == SQLITE_OK) {
while (sqlite3_step(compiledStmt) == SQLITE_ROW) {
NSString *aTitle = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStmt, 1)];
MenuItem *menuItem = [[MenuItem alloc] init];
menuItem.title = aTitle;
[menu addObject:menuItem];
[menuItem release];
}
}
else {
NSLog(@"There is an error with the SQL Statement");
}
sqlite3_finalize(compiledStmt);
}
sqlite3_close(database);
【问题讨论】:
-
我不开发 iPhone 应用程序,只是根据我所知道的进行调试。你能在到达
sqlite3_step()之前打印出compiledStmt的内容吗?我看到它的位置,但我不知道它在哪里被初始化。sqlite3_prepare_v2做什么,准备声明?在你调用sqlite3_step()之前它的内容是什么? -
你能使用 Core Data 吗?如果是这样,我建议您采用“手动”方法:developer.apple.com/macosx/coredata.html
-
话虽如此,如果 sqlite3_step(compiledStmt) 没有返回 SQLITE_ROW,它会返回什么?
-
AHHH 你为什么不使用 SQLite 包装器?!?!!我敢打赌,如果你这样做了,你的问题就会消失一半。
-
哦,这是个主意,将您的 SQL 语句更改为“从菜单中选择 count(*)”。那应该总是返回一行,而且一旦你得到那一行,你就会知道菜单实际上有多少行。如果它为零,那么您的问题不在于您发布的代码。
标签: iphone objective-c sqlite