2011-05-09 87 views
0

我在這裏遇到了這個問題。我有一個讀出XML文件的應用程序。這些信息被正確地存儲到一個NSMutableDictionary中。奇怪的SQLite3錯誤:找不到列

我想要做的下一件事就是使用SQLite3將該NSMutableDictionary中的所有元素添加到數據庫中。

在應用程序的委託,我創建使用的數據庫:

NSString *docsDir; 
NSArray *dirPaths; 

// Get the documents directory 
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

docsDir = [dirPaths objectAtIndex:0]; 

// Build the path to the database file 
databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"incidents.db"]]; 
NSFileManager *filemgr = [NSFileManager defaultManager]; 

if ([filemgr fileExistsAtPath: databasePath ] == NO) 
{ 
    const char *dbpath = [databasePath UTF8String]; 

    if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) 
    { 
     char *errMsg; 
     const char *sql_stmt = "CREATE TABLE IF NOT EXISTS INCIDENTS (ID INTEGER PRIMARY KEY, SERIAL TEXT, CI TEXT, FAMILY TEXT, DEVICEDESCRIPTION TEXT, LOCATION TEXT, SUBLOCATION TEXT, UPDOWN TEXT, PROBLEMDESCRIPTION TEXT, ADDINFO TEXT, PROBLEMLOCATION TEXT, PROBLEMCATEGORY TEXT, CONTFIRSTNAME TEXT, CONTLASTNAME TEXT, CONTSALUTATION TEXT, CONTPHONENUMBER TEXT, LOCALCALL TEXT, CICATEGORY TEXT, STATUS TEXT)"; 

     if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) 
     { 
      NSLog(@"Failed to create table"); 
     } 

     sqlite3_close(contactDB); 

    } else { 
     NSLog(@"Failed to open/create database"); 
    } 
} 

[filemgr release]; 

在其他類中,我使用的代碼:

NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO INCIDENTS (ID, SERIAL, CI, FAMILY, DEVICEDESCRIPTION, LOCATION, SUBLOCATION, UPDOWN, PROBLEMDESCRIPTION, ADDINFO, PROBLEMLOCATION, PROBLEMCATEGORY, CONTFIRSTNAME, CONTLASTNAME, CONTSALUTATION, CONTPHONENUMBER, LOCALCALL, CICATEGORY, STATUS) VALUES (\"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\")", [item objectForKey:@"ID"], [item objectForKey:@"Serial"], [item objectForKey:@"ConfigurationAlias"], [item objectForKey:@"Family"], [item objectForKey:@"DeviceDescription"], [item objectForKey:@"Location"], [item objectForKey:@"SubLocation"], [item objectForKey:@"UpDownIndicator"], [item objectForKey:@"ProblemDescription"], [item objectForKey:@"AdditionalInformation"], [item objectForKey:@"ProblemLocation"], [item objectForKey:@"ProblemCategory"], [item objectForKey:@"ContactPersonFirstName"], [item objectForKey:@"ContactPersonLastName"], [item objectForKey:@"ContactPersonSalutation"], [item objectForKey:@"ContactPersonPhoneNumber"], [item objectForKey:@"LocalCallNumber"], [item objectForKey:@"ConfigurationItemCategory"], [item objectForKey:@"Status"]]; 
const char *insert_stmt = [insertSQL UTF8String]; 
//NSLog(@"could not prepare statement: %s\n", sqlite3_errmsg(contactDB)); 
sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL); 
if(sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL) != SQLITE_DONE){ 
    NSLog(@"Error: Failed to prepare stmt with message '%s'", sqlite3_errmsg(contactDB)); 
} 
if (sqlite3_step(statement) == SQLITE_DONE) 
{ 
    NSLog(@"Succesfully added in DB"); 
} else { 
    NSLog(@"Failed to add incident in DB"); 
} 
sqlite3_finalize(statement); 
sqlite3_close(contactDB); 

我用得到的錯誤sqlite3_errmsg語句是: 2011-05-09 10:04:12.029 Fleet Manager[1053:207] Error: Failed to prepare stmt with message 'table INCIDENTS has no column named PROBLEMDESCRIPTION'

任何想法是怎麼回事?

編輯:它工作時,我刪除了添加的問題描述部分。仍然是一個問題,因爲它給我留下了一個空的列...

回答

4

從錯誤消息中可以明顯看出SQLite3數據庫中的表沒有PROBLEMDESCRIPTION列。我會推測,在某種程度上,你的創建語句有一個拼寫錯誤,它沒有被糾正,因爲如果它已經存在,你不重新創建表。

要驗證這一點,請使用sqlite3命令行工具打開數據庫並運行.schema INCIDENTS命令。


在一個不相關的音符,這是一個very bad idea插入使用-stringWithFormat:你應該總是使用sqlite_bind*(),以避免逃避保留字符的麻煩行數據。

+0

就是這樣。數據庫不會被重新創建!謝謝您的幫助:) – Joetjah 2011-05-09 11:37:22