2011-05-09 69 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