ios填充sqlite数据库错误,不写入最终条目

时间:2014-10-24 13:57:59

标签: ios sqlite sigabrt

更新的问题,请检查帖子的结尾

我正在制作一个iPhone应用程序,我希望当用户第一次午餐时,应用程序创建一个新数据库并用plist文件的数据填充它。

这是我的观点加载代码:

//get database path
NSString *symptomDatabasePath = [self symptomsDatabasePath];

//check if database exists and initialize if it doesn't
if(![[NSFileManager defaultManager] fileExistsAtPath:symptomDatabasePath])
{
    [self createAndPopulateDatabase];
}

我的症状数据库路径功能:

//get the path of the symptoms database
- (NSString *) symptomsDatabasePath
{
NSArray *pathsArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [pathsArray objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:@"symptoms.sqlite"];
}

最后我的createANdPopulateDatabase函数:

- (void) createAndPopulateDatabase
{
//get query to insert symptoms into database
NSArray *pathsArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [pathsArray objectAtIndex:0];
NSString *databaseDataFile = [documentsDirectory stringByAppendingPathComponent:@"symptomsDatabaseList.plist"];
NSString *symptomData = [NSString stringWithContentsOfFile:databaseDataFile encoding:NSUTF8StringEncoding error:NULL];

sqlite3 *database;
if (sqlite3_open([[self symptomsDatabasePath] UTF8String], &database)!=SQLITE_OK)
{
    sqlite3_close(database);
    NSAssert(0, @"Failed to open database");
}

NSString *createTableQuery = @"CREATE TABLE IF NOT EXISTS tbl_symptoms (symptomCode varchar(15) NOT NULL PRIMARY KEY,title varchar(255) NOT NULL,shortTitle varchar(255) NOT NULL,inclusions varchar(255) NOT NULL,exclusions varchar(255) NOT NULL,symptomCategory varchar(255) NOT NULL);";

char *errorMsg;
//create new table
if(sqlite3_exec(database, [createTableQuery UTF8String], NULL, NULL, &errorMsg)!=SQLITE_OK)
{
    sqlite3_close(database);
    NSAssert(0, @"Error creating table: %s", errorMsg);
}

NSString *insertQueryString = @"INSERT INTO tbl_symptoms (symptomCode, title, shortTitle, inclusions, exclusions, symptomCategory) VALUES ";
//array containing the seperate symptom data
NSArray *symptomArray = [symptomData componentsSeparatedByString:@"),"];
sqlite3_stmt *statement;
//nsmutable array with all queries
NSMutableArray *queryArray = [[NSMutableArray alloc] init];
//loop through the aray with symptoms build queries and store them in an array
for(int i=0; i<[symptomArray count]; i++)
{
     //create query string with insert command
    NSMutableString *insertString = [[NSMutableString alloc] initWithString:insertQueryString];
    //append the specific symptoms data
    [insertString appendString:[symptomArray objectAtIndex:i]];
    [insertString appendString:@");"];
    [queryArray insertObject:insertString atIndex:i];
}

    //insert data into database

for(int i=0; i<[queryArray count]; i++)
{
    const char *insertChar = [[queryArray objectAtIndex:i] UTF8String];

    if(sqlite3_prepare_v2(database, insertChar, -1, &statement, nil)!=SQLITE_OK)
    {
        sqlite3_close(database);
        NSAssert(0, @"Error filling table: %s", errorMsg);
    }
    if (sqlite3_step(statement)!=SQLITE_DONE)
    {
        NSAssert(0, @"Error inserting data into database: %s", errorMsg);
    }
    //finalize changes
}
sqlite3_finalize(statement);
sqlite3_close(database);
}

我的代码有点乱,因为我一直在尝试各种解决方案。无论如何,我在我的phlist文件中输入了我想输入的数据:

(&#39; Z27&#39;,&#39;害怕社会问题&#39;&#39;害怕社会问题&#39;,&#39;关心/恐惧如果患者存在社会问题,编码问题&#39;社会问题', (&#39; Z28&#39;,&#39;限制功能/残疾(Z)&#39;,&#39;限制功能/残疾(Z)&#39;,&#39;&#39; ,&#39;&#39;,&#39;社会问题'), (&#39; Z29&#39;,&#39;社会问题NOS&#39;,&#39;社会问题NOS&#39;,&#39;环境问题;装病&#39;,&#39;&# 39;,&#39;社会问题'

我的档案中有320个这样的条目,这些是最后3个,因为它们是我遇到麻烦的。

该应用程序会复制所有其他317个条目,但不会复制这些条目。我知道它最终会丢失a),但这是因为我的代码会在每个循环中附加它。

我收到SIGABRT错误和以下错误代码:

&#34;因未捕获的异常终止应用程序&#39; NSInternalInconsistencyException&#39;,原因:&#39;错误填写表:(null)&#39;&#34;

任何人都可以帮助我吗?我可能在sqlite3上做错了,虽然我不明白为什么它只复制最后3个条目。

同样早些时候它不会只复制最后一个条目,但是在我复制粘贴它以查看条目本身是否有问题之后,它开始不复制最后一个条目:

非常感谢任何帮助

更新

所以事实证明我得到了错误,因为我使用的是NSAssert。现在我使用NSLogs来记录我的错误,并且应用程序正确启动,但是在复制最后3个条目时我仍然会收到错误。

根据我的日志,sqlite3_prepare_v2和sqlite3_step函数失败,但仅限于最后3个条目:S

1 个答案:

答案 0 :(得分:1)

问题是你有聪明的报价。例如,我看到你有

..., 'Social problems’), ...

注意,你是用一个标准的撇号开始的,但是用一个单引号完成它。如果你仔细看,它们会有所不同。

用标准撇号替换那些智能引号,这应该可以解决当前问题。


我建议您记录SQL并仔细检查它。此外,当sqlite3_prepare_v2失败时,您没有记录相应的错误消息。你可以这样做:

if (sqlite3_prepare_v2(database, insertChar, -1, &statement, nil)!=SQLITE_OK) {
    NSLog(@"prepare failure: %s", sqlite3_errmsg(database));
    sqlite3_close(database);
    NSAssert(0, @"Error filling table");
}