-1

我已经使用 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 ^^ 谢谢!

更新:不,它一直是“人”。经过两个小时的失败和这个问题的开始,我终于想到“那么,为什么不使用清洁剂?它永远不会起作用,但给它一个机会......”显然,它起作用了...... . -_-' 出于某种原因,该项目只需要一个干净的...谢谢您的帮助,无论如何!


正如我在更新中所说,出于某种原因,该项目只需要一个干净的......

当然调用准备两次不是一个好主意。抱歉,我发布的代码很脏,仅用于测试。很高兴知道打开可能有权限问题,我会检查一下!非常感谢您的帮助!

4

1 回答 1

0

sqlite 经常因打开数据库文件的权限而失败,并且放置了整个目录文件。

于 2012-04-24T20:10:03.490 回答