【发布时间】:2014-12-31 12:36:04
【问题描述】:
我对 Sqlite 操作非常陌生, 直到现在我只对 UI + 一些 Web 服务进行操作
我面临的问题是,
我正在从终端创建一个表,并通过匹配表名从 Xcode 在其中插入值。 该表由4个字段组成,其中2个属于表,2个是外键。
当我插入 Query my app FREEZES 时。
它不会进一步移动,不允许任何操作。
这是我的查询
-(bool)insertMatchSampleQuest:(QuestionDTO*)questionDTO
{
NSMutableArray* matchQesA=[questionDTO matchQuesA];
NSLog(@"MTQ QuestionsArray :- %@",[matchQesA description]);
NSLog(@"MTQ QuestionsArray count :- %d",[matchQesA count]);
FMDatabase* db=[SqlLiteDAOFactory createConnection];
for(int i=0;i<[matchQesA count];i++)
{
MTQuestionDTO *mTQuestionDTO =[matchQesA objectAtIndex:i];
NSLog(@"value of testsample id is :- %@",questionDTO.testsampledid);
NSLog(@"value of sampletest id is :- %@",questionDTO.sampletestid);
NSLog(@"value of MTQ Question id :- %@",mTQuestionDTO.mtq_question_id);
NSLog(@"value of MTQ Question Text :- %@",mTQuestionDTO.mtq_question_text);
[db executeUpdate:@"insert into matchquestion (testsampledID,sampletestid,mtq_question_id,mtq_question_text) values(?,?,?,?)",questionDTO.testsampledid,questionDTO.sampletestid,mTQuestionDTO.mtq_question_id,mTQuestionDTO.mtq_question_text];
if ([db hadError])
{
NSLog(@"database error");
NSLog(@"Err in inserting %d: %@", [db lastErrorCode], [db lastErrorMessage]);
[db close];
}
}
[db close];
return TRUE;
}
当我 NSlog 值时,它会给我正确的值。 此外,当我从终端值触发相同的查询时,会将其插入数据库。
我正在向我的数组计数触发此查询。 我有整个数组,并且想将元素插入到表中直到数组计数。
为什么我的应用程序正在冻结,如果它的错误那么它必须进入错误块,它不会去那里, 所以我很难追踪它。
我犯了什么错误。
提前致谢。
【问题讨论】:
-
如果冻结,则表明您必须同时打开其他查询,这会阻止此查询。我们不可能根据提供的代码来确认这一点。您一次应该只有一个
FMDatabase对象(如果您从多个线程中使用它,请改用FMDatabaseQueue)。 -
嗨@ROb,请找到我上面的代码已编辑,希望有助于理解我在开始时创建FMDATABASE对象并在结束时处理的工作
-
@stallone:看我下面的答案
-
@stallone 谢谢,但我担心的是您是否可能在其他地方有一些完全独立的
FMDatabase实例可能会锁定相关数据库。 -
@Rob,如果我从查询中删除 testsampledID 字段,则数据会正确插入。该列是表的外键,我从选择查询中获取其值并应变到 NSString 并传递该 NSString。因此,删除该字段后,它可以正常工作。我检查了 Select query close DB,它也关闭得很好,我仍然面临这个冻结问题。