【问题标题】:inserting into SQLite database插入 SQLite 数据库
【发布时间】: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,它也关闭得很好,我仍然面临这个冻结问题。

标签: ios sqlite


【解决方案1】:

从您的以下代码中删除 [db close]; :或中断循环。

   if ([db hadError])
    {
        NSLog(@"database error");
        NSLog(@"Err in inserting %d: %@", [db lastErrorCode], [db lastErrorMessage]);
        [db close];  // Remove this line, or break the loop.
        break;

    }

它的冻结是因为当错误执行时,它会关闭数据库但不会退出循环,这就是为什么在下一次迭代中它尝试执行数据库操作但你已经在上一次迭代中关闭了 DATA 库。

【讨论】:

  • 我试过那个东西,没有帮助。实际上,如果连接或查询创建出错,我的控制就在 if 循环中。所以如果发现错误,那么它会简单地关闭数据库并返回控件。谢谢你,但没有帮助。
  • 也许,但是,尽管如此,这个错误子句应该关闭数据库(当你离开循环时会发生这种情况)并且绝对应该 @ 987654323@。或者继续close 数据库,然后return 不仅退出循环,还退出方法。但是不要close数据库而是留在这个循环中。
  • @ Rob:感谢您的更多澄清。现在可能是 @stallone 的作品。
  • @Rob & Divya:- 感谢您的帮助。我正在触发选择查询以获取 id 并且结果集未关闭,数据库已关闭。 b'se 其中它被冻结了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多