我无法从数据库中选择数据。也许它只是到了这里的早期,但它看起来好像我从来没有得到任何返回,但我把断点放在while语句中停止,它永远不会到达代码的那一部分。我弄乱了吗?我确实省略了create语句,因为它很长,我不认为它是相关的,因为它确实包含IF NOT EXISTS
。我还验证了我的所有数据都在数据库中。
sqlite3 *database;
if(sqlite3_open([[self dataFilePath] UTF8String], &database)
!= SQLITE_OK) {
sqlite3_close(database);
NSAssert(0,@"Failed to open database");
}
NSString *createSQL = @"--CREATE STATEMENT HERE --";
char *errorMsg;
if(sqlite3_exec (database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
sqlite3_close(database);
NSAssert(0,@"Error creating table: %s", errorMsg);
}
NSString *query = @"SELECT name, number FROM DATA";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
int myNumber = sqlite3_column_int(statement, 1);
char *name = (char *)sqlite3_column_text(statement, 0);
NSString *message = [NSString stringWithFormat:@"Number: %d, Name: %@", myNumber,name];
//DO MORE STUFF HERE.
}
sqlite3_finalize(statement);
}
sqlite3_close(database);
dateFilePath方法:
-(NSString*)dataFilePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:@"Spaces.sqlite"];
}
答案 0 :(得分:0)
你正在选择姓名和号码..但是从什么地方开始?你需要完成你的SQL查询语句..
答案 1 :(得分:0)
您说您检查过数据是否在那里,您是否在模拟器的Documents文件夹中查看了副本,或者您是否在Xcode项目中检查了副本? (如果可以,你真的需要在模拟器上检查应用程序的Documents文件夹中数据库的内容。)我问的原因是,一个非常常见的错误是假设成功调用sqlite3_open
意味着它找到了你的数据库它没有。如果找不到您的数据库,它将为您创建一个空白数据库。
如果您在编译之前准备好了数据库,我真的鼓励您使用sqlite3_open_v2
而不是sqlite_open
,如下所述:SQLite will not prepare query when accessing database in Xcode
所以,如果这是问题,我建议:
重置您的模拟器(通过模拟器菜单上的“重置内容和设置”,或者只是删除应用程序并重新安装)以删除那里的任何空白数据库。
确保数据库包含在您的包中,如上面的链接所述。
请确保以编程方式将数据库从捆绑包复制到文档,如下所述:Unable to connect SQLite Database in iOS
并按上述两个链接中的任何一个使用sqlite3_open_v2
。