2012-05-02 34 views
14

Tôi đã tạo một lớp cơ sở dữ liệu và đóng gói một số phương thức. Tuy nhiên, khi xây dựng dự án ...Ký hiệu không xác định cho kiến ​​trúc i386: "_sqlite3_open", được tham chiếu từ: lỗi

Undefined symbols for architecture i386: 
"_sqlite3_open", referenced from: 
    -[MyDataBase openOrCreateDatabase:] in MyDataBase.o 
"_sqlite3_exec", referenced from: 
    -[MyDataBase createTable:] in MyDataBase.o 
    -[MyDataBase InsertTable:] in MyDataBase.o 
    -[MyDataBase UpdataTable:] in MyDataBase.o 
    -[MyDataBase querryTableByCallBack:] in MyDataBase.o 
"_sqlite3_close", referenced from: 
    -[MyDataBase closeDatabase] in MyDataBase.o 
"_sqlite3_get_table", referenced from: 
    -[MyDataBase querryTable:] in MyDataBase.o 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

đây là một số phương pháp quan trọng:

tạo cơ sở dữ liệu:

-(BOOL)openOrCreateDatabase:(NSString*)dbName 
{ 
self.m_dbName = dbName; 
NSArray *path =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
NSString *documentsDirectory = [path objectAtIndex:0]; 
if(sqlite3_open([[documentsDirectory stringByAppendingPathComponent:dbName] UTF8String],&m_sql) !=SQLITE_OK) 
{ 
NSLog(@"创建数据库失败"); 
return NO; 
} 
return YES; 
} 

tạo bảng:

-(BOOL)createTable:(NSString*)sqlCreateTable 
{ 
if (![self openOrCreateDatabase:self.m_dbName]) { 
    return NO; 
} 
char *errorMsg; 
if (sqlite3_exec (self.m_sql, [sqlCreateTable UTF8String],NULL, NULL, &errorMsg) != 
SQLITE_OK) 
{ 
    NSLog(@"创建数据表失败:%s",errorMsg); 
    return NO; 
} 
[self closeDatabase]; 
return YES; 
} 

đóng cơ sở dữ liệu :

-(void)closeDatabase 
{ 
sqlite3_close(self.m_sql); 
} 

//insert 

-(BOOL)InsertTable:(NSString*)sqlInsert 
{ 
if (![self openOrCreateDatabase:self.m_dbName]) { 
    return NO; 
} 
char* errorMsg = NULL; 
if(sqlite3_exec(self.m_sql, [sqlInsert UTF8String],0, NULL, &errorMsg) ==SQLITE_OK) 
{ [self closeDatabase]; 
    return YES;} 
else { 
    printf("更新表失败:%s",errorMsg); 
    [self closeDatabase]; 
    return NO; 
} 
return YES; 
} 

bảng cập nhật:

-(BOOL)UpdataTable:(NSString*)sqlUpdata{ 
if (![self openOrCreateDatabase:self.m_dbName]) { 
    return NO; 
} 
char *errorMsg; 
if (sqlite3_exec (self.m_sql, [sqlUpdata UTF8String],0, NULL, &errorMsg) !=SQLITE_OK) 
{ 
    [self closeDatabase]; 
    return YES; 
}else { 
    return NO; 
} 

return YES; 
} 

chọn hồ sơ:

-(NSArray*)querryTable:(NSString*)sqlQuerry 
{ 
if (![self openOrCreateDatabase:self.m_dbName]) { 
    return nil; 
} 
int row = 0; 
int column = 0; 
char* errorMsg = NULL; 
char** dbResult = NULL; 
NSMutableArray* array = [[NSMutableArray alloc] init]; 
if(sqlite3_get_table(m_sql,[sqlQuerry UTF8String], &dbResult, &row,&column,&errorMsg) == SQLITE_OK) 
{ 
    if (0 == row) { 
     [self closeDatabase]; 
     return nil; 
    } 
    int index = column; 
    for(int i =0; i < row ; i++) {  
     NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; 
     for(int j =0 ; j < column; j++) { 
      if (dbResult[index]) { 
       NSString* value = [[NSString alloc] initWithUTF8String:dbResult[index]]; 
       NSString* key = [[NSString alloc] initWithUTF8String:dbResult[j]]; 
       [dic setObject:value forKey:key]; 
       [value release]; 
       [key release]; 
      } 
      index ++; 
     } 
     [array addObject:dic]; 
     [dic release]; 
    } 
    }else { 
    printf("%s",errorMsg); 
    [self closeDatabase]; 
    return nil; 
    } 
    [self closeDatabase]; 
    return [array autorelease]; 
} 
+1

Bạn có liên kết sqlite3.dylib không? –

Trả lời

35

Bạn cần phải thêm thư viện libsqlite vào quá trình liên kết. Điều này có thể được thực hiện trong Cài đặt dự án, xem https://stackoverflow.com/a/7623043/1091195.

+0

cảm ơn bạn! bạn tiết kiệm cho tôi rất nhiều thời gian! – NJUHOBBY

Các vấn đề liên quan