我已经使用 SqlManager 在 sqlite 中创建了一个简单的数据库,然后我将文件 (Person.sqlite) 复制到了一个简单的 xcode 项目中的资源中,并使用此代码访问数据库,但数据库似乎没有加载。init 中的函数 sqlite3_open 返回 0(一切正常),而 getAllPersons 中的 sqlite3_prepare 返回无法在数据库中找到我的数据库中的表“Persona”,所以我相信问题在于我无法访问真正的数据库。可能是打开的,没有找到数据库,创建一个新的空数据库......那么为什么会发生这种情况?我给出数据库路径的方式不正确?([[NSBundle mainBundle] pathForResource:@"Person" ofType:@"sqlite"];) 确实,定义路径 (sqLiteDb) 的变量上的 nslog 返回 null,但我尝试了其他几种方法来调用此路径,但都是错误的。
- (id)init
{
self = [super init];
if (self) {
NSString *sqlLiteDb = [[NSBundle mainBundle] pathForResource:@"Persone" ofType:@"sqlite"];
NSLog(@"Path db: %@",sqlLiteDb);
if(sqlite3_open([sqlLiteDb UTF8String], &database) != SQLITE_OK){
NSLog(@"Failed to open database");
}else {
NSLog(@"Database opened");
}
}
return self;
}
- (NSArray *) getAllPersons{
NSMutableArray *returnArray=[[NSMutableArray alloc] init];
NSString *query= @"SELECT Nome FROM Persona";
sqlite3_stmt *statement;
NSLog(@"%d", sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL));
printf( "could not prepare statemnt: %s\n", sqlite3_errmsg(database) );
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL) == SQLITE_OK){
NSLog(@"kndvnspò");
while (sqlite3_step(statement)==SQLITE_ROW) {
int uniqueId = sqlite3_column_int(statement, 0);
char *nomeChar =(char *) sqlite3_column_text(statement, 1);
char *cognomeChar =(char *) sqlite3_column_text(statement, 2);
NSString *nome= [[NSString alloc] initWithUTF8String:nomeChar];
NSString *cognome= [[NSString alloc] initWithUTF8String:cognomeChar];
PersonInfo *info= [[PersonInfo alloc] initWithUniqueId:uniqueId nome:nome cognome:cognome];
[returnArray addObject:info];
}
sqlite3_finalize(statement);
}
return returnArray;
}
抱歉,我相信解决方案很简单,但我仍然不太喜欢 xcode ^^ 谢谢!
更新:不,它一直是“人”。经过两个小时的失败和这个问题的开始,我终于想到“那么,为什么不使用清洁剂?它永远不会起作用,但给它一个机会......”显然,它起作用了...... . -_-' 出于某种原因,该项目只需要一个干净的...谢谢您的帮助,无论如何!
正如我在更新中所说,出于某种原因,该项目只需要一个干净的......
当然调用准备两次不是一个好主意。抱歉,我发布的代码很脏,仅用于测试。很高兴知道打开可能有权限问题,我会检查一下!非常感谢您的帮助!