2013-02-26 76 views
1

我正在做一个项目在ios中,我有下一个问题: 我正在使用现有的数据库,并且第一步(打开数据库)工作正常,但当时我尝试读取我遇到错误的数据。从ios中的现有数据库中读取数据

控制台仅显示:2013年2月26日14:46:59.999 MyApp的[66537:C07]问题读取数据

-(void) openDB 
{ 
    @try { 
     NSFileManager *fileMgr = [NSFileManager defaultManager]; 
     NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"data.db"]; 
     BOOL success = [fileMgr fileExistsAtPath:dbPath]; 
     if(!success) 
     { 
      NSLog(@"Cannot locate database file '%@'.", dbPath); 
     } 
     if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)) 
     { 
      NSLog(@"An error has occured."); 
     } 
    } 
    @catch (NSException *exception) { 
     NSLog(@"An exception occured: %@", [exception reason]); 
    } 
} 

-(void) getData{ 
    NSString *sql = @"SELECT * FROM frases"; 
    sqlite3_stmt * stmt; 

    if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil) != SQLITE_OK) { 
     NSLog(@"problem reading data"); 
    } 
} 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self openDB]; 
    [self getData]; 
} 
+1

登录数据库的错误:'的NSLog(@ “数据库错误: '%s' 的。” sqlite3_errmsg(分贝));'。数据库中很可能没有名为'frases'的表。另外,摆脱'try/catch'块。只要做一般的错误检查。 – rmaddy 2013-02-26 18:11:29

+0

谢谢。确切地说......但是,当我用数据库浏览器打开文件时,表格出现。会是什么呢? – Fede 2013-02-26 18:21:48

+0

从设备/模拟器中删除应用程序,并进行干净的构建。数据库可能存在旧版本,并且没有正确更新。请记住,由于数据库位于资源包中,因此它将为只读数据库。 – rmaddy 2013-02-26 18:30:46

回答

-1

- (无效)的getData { 的NSString * SQL = @“SELECT * FROM frases“; sqlite3_stmt * stmt;

if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil) != SQLITE_OK) { 
    NSLog(@"problem reading data"); 
}else{ 
    sqlite3_stmt *compiledstatement; 
    const char *selectStatement = [sql UTF8String]; 
    sqlite3_prepare_v2(sqlDatabase, selectStatement, -1, &compiledstatement, NULL); 

    if (sqlite3_step(compiledstatement) == SQLITE_DONE) {} 
    else NSLog(@"Failed!"); 
    sqlite3_finalize(compiledstatement); 
} 

}

这是我应该怎样做。有一个通用函数,只需传入变量。

-(void)readDB:(NSString *)queryString { 
    NSString *docsDir; 
    NSArray  *dirPaths; 
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    docsDir  = [dirPaths objectAtIndex:0]; 

    strDatabasePath   = [NSString stringWithString:[docsDir stringByAppendingPathComponent:@"database.db"]]; 
    NSFileManager *filemgr = [NSFileManager defaultManager]; 

    if ([filemgr fileExistsAtPath: strDatabasePath] == YES) 
    { 
     const char *dbpath = [strDatabasePath UTF8String]; 
     if (sqlite3_open(dbpath, &sqlDatabase) == SQLITE_OK) 
     { 
      const char* beginString = "BEGIN;"; 
      sqlite3_stmt *compiledstatement; 
      sqlite3_prepare_v2(sqlDatabase, beginString, -1, &compiledstatement, NULL); 
      if (sqlite3_step(compiledstatement) == SQLITE_DONE) {} 
      else DLog(@"Failed!"); 
      sqlite3_finalize(compiledstatement); 

      DLog(@"QUERY : %@",queryString); 

      const char *selectStatement = [queryString UTF8String]; 

      sqlite3_prepare_v2(sqlDatabase, selectStatement, -1, &compiledstatement, NULL); 
      //sqlite3_bind_text(compiledstatement,1,[statusString UTF8String],-1,SQLITE_TRANSIENT); 

      if (sqlite3_step(compiledstatement) == SQLITE_DONE) {} 
      else DLog(@"Failed!"); 
      sqlite3_finalize(compiledstatement); 


      const char* endString="END;"; 
      sqlite3_prepare_v2(sqlDatabase, endString, -1, &compiledstatement, NULL); 
      if (sqlite3_step(compiledstatement) == SQLITE_DONE) {} 
      else DLog(@"Failed!"); 
      sqlite3_finalize(compiledstatement); 

      sqlite3_close(sqlDatabase); 
     } 
     else DLog(@"Failed to open table"); 
    } 
} 

NSString *queryString; 
queryString = @"SELECT * FROM frases"; 
[self readDB:queryString]; 

希望这有助于...记住要关闭数据库(sqlite3_close(sqlDatabase);)..

+0

这不是必需的。不需要'BEGIN;'和'END'对数据库执行定期查询。 – rmaddy 2013-02-26 18:12:22