我试图通过测试用例将数据插入sqlite数据库中的一个表中。
以下是测试方法:
-(void)testAddContact2
{
[ContactsModel getInstance].mContactName = @"Arvind";
[ContactsModel getInstance].mContactNo = @"556";
[ContactsModel getInstance].mContactDob = @"July 10, 1988";
[ContactsModel getInstance].mContactGender = @"Male";
[ContactsModel getInstance].mContactEmail = @"arv@bnsad.co";
[ContactsModel getInstance].mContactLatitude = @"33";
[ContactsModel getInstance].mContactLongitude = @"44";
STAssertFalse(([[ContactsModel getInstance] addNewContact] == TRUE),@"passed");
}
这是我试图测试的方法:
-(BOOL)addNewContact
{
BOOL tempFlag = NO;
sqlite3_stmt *statement;
sqlite3 *mDiaryTemp = nil;
const char *dbpath = [[UseDb getInstance].mDatabasePathDb UTF8String];
if (sqlite3_open(dbpath, &mDiaryTemp) == SQLITE_OK)
{
NSString *insertSQL1=[NSString stringWithFormat:@"INSERT INTO CONTACTS VALUES(\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\")",
[ContactsModel getInstance].mContactName,
[ContactsModel getInstance].mContactNo,
[ContactsModel getInstance].mContactGender,
[ContactsModel getInstance].mContactDob,
[ContactsModel getInstance].mContactEmail,
[ContactsModel getInstance].mContactLatitude,
[ContactsModel getInstance].mContactLongitude];
const char *insert_stmt1 = [insertSQL1 UTF8String];
sqlite3_prepare_v2(mDiaryTemp, insert_stmt1, -1, &statement, NULL);
NSString *tempName = [NSString stringWithFormat:@"%@",[ContactsModel getInstance].mContactName];
tempName = [tempName stringByAppendingString:@" "];
NSString *tempNo = [NSString stringWithFormat:@"%@",[ContactsModel getInstance].mContactNo];
tempName = [tempName stringByAppendingString:tempNo];
[[ShowContactsViewController getInstance].phoneContacts addObject:tempName];
NSLog(@"%d",[[ShowContactsViewController getInstance].phoneContacts count]);
// NSLog(@"%d",sqlite3_step(statement));
if (sqlite3_step(statement) == SQLITE_DONE)
{
sqlite3_finalize(statement);
sqlite3_close(mDiaryTemp);
tempFlag = YES;
}
else
{
sqlite3_finalize(statement);
sqlite3_close(mDiaryTemp);
tempFlag = NO;
}
}
if(tempFlag)
{
return YES;
}
else
{
return NO;
}
}
以下情况总是失败:if (sqlite3_step(statement) == SQLITE_DONE)
我之前发布过类似的问题,但是当我使用共享实例而不是新对象时问题得到了解决。但是在这里,即使在使用共享实例之后我也无法插入。
答案 0 :(得分:0)
在iOS上,您应该考虑使用CoreData而不是直接使用SQLite。默认情况下,CoreData会持久存储到SQLite,并且它具有更加友好的文档。此外,由于CoreData不是C API,它将与您的其他Objective-C代码更好地互操作。使用CoreData时,还有很好的Xcode集成,可以让您轻松定义模式。在许多情况下,您还可以避免编写SQL查询。
答案 1 :(得分:0)
尝试在insertSQL1
的最末端添加一个分号,并查看它的位置。还要确保在此语句中没有替换转义字符。
编辑:
@“INSERT INTO CONTACTS VALUES(\”%@ \“,\”%@ \“,\”%@ \“,\”%@ \“,\”%@ \“,\”%@ \ “\ ”%@ \“)>>取代;<<<” ...
http://www.sqlite.org/syntaxdiagrams.html#sql-stmt-list