数据库在iphone +错误磁盘i / o错误中格式错误

时间:2012-10-18 10:46:50

标签: iphone ios sqlite

我有超过5000条记录要从服务器加载到我的应用程序并插入数据库。 在成功插入后插入这些记录时,我遇到了这种错误,我的应用程序崩溃了。

数据库在iPhone +错误磁盘i / o错误

中格式错误

以下是可能有用的代码段,在这里我逐个获取5个类别的记录并将它们插入数据库

    if (tag==1) {
        NSMutableDictionary *catDic=[dic valueForKeyPath:@"GetAllRecords.results.categories.category"];
        [self performSelectorInBackground:@selector(insertDataInCategoryMaster:) withObject:catDic];

        NSMutableDictionary *levelDic=[dic valueForKeyPath:@"GetAllRecords.results.levels.level"];
        [self performSelectorInBackground:@selector(insertDataInLevelMaster:) withObject:levelDic];

        NSMutableDictionary *queDic=[dic valueForKeyPath:@"GetAllRecords.results.questions.question"];

        [self performSelectorInBackground:@selector(insertDataInQueMaster:) withObject:queDic];

        [self getQueCatLevelData:2];
    }
    else if(tag==2){

        NSMutableDictionary *queDic=[dic valueForKeyPath:@"GetAllRecords.results.questions.question"];
        [self performSelectorInBackground:@selector(insertDataInQueMaster:) withObject:queDic];

        [self getQueCatLevelData:3];

    }
    else if(tag==3){

        NSMutableDictionary *queDic=[dic valueForKeyPath:@"GetAllRecords.results.questions.question"];
        [self performSelectorInBackground:@selector(insertDataInQueMaster:) withObject:queDic];

        [self getQueCatLevelData:4];
    }//and so on for 5 also

在每个insertDataInQueMaster中我正在做的事情。

         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
        for(NSDictionary *queDictionary in dictionary)
        {

            NSString *strQuery = [NSString stringWithFormat:@"insert into QuestionMaster values(%d,'%@','%@',%d,%d,%d,%d,%d,0,'%@')",[[queDictionary valueForKey:@"questionid"]intValue], [queDictionary valueForKey:@"questiontext"],[queDictionary valueForKey:@"answertext"],[[queDictionary valueForKey:@"categoryid"]intValue],[[queDictionary valueForKey:@"levelid"] intValue],[[queDictionary valueForKey:@"status"]intValue],[[queDictionary valueForKey:@"RangeFrom"]intValue],[[queDictionary valueForKey:@"RangeTo"]intValue],[queDictionary valueForKey:@"Fact"]];

            [NSNumber requestWithSynchronousExcuteQuery:strQuery withReturnningError:&error];

            if(error)
            {
                NSLog(@"error description:%@",[[error userInfo] description]);
                [[NSUserDefaults standardUserDefaults]setBool:NO forKey:@"FirstTime"];
            }

        }

        count++;
        [[NSUserDefaults standardUserDefaults]setInteger:count forKey:@"CheckCount"];
        [[NSUserDefaults standardUserDefaults]synchronize];
        [pool drain];

当App在AppDelegate.m中加载时,我正在做这些事情,在背景中也是如此 错误来自成功在数据库中插入少量记录后,我认为数据库打开和插入没有问题。

我希望我很清楚, 请评论是否有任何混淆。 等待回复。 提前致谢。

1 个答案:

答案 0 :(得分:2)

欢呼,我得到了这个简单的解决方案

我刚放置

  @synchronized(self)
  {
      //My Whole Code  for Background methods goes here
  }

就是这样,它解决了我的错误并崩溃了。

@synchronized()指令锁定一段代码以供单个线程使用。其他线程被阻塞,直到线程退出受保护的代码 - 也就是说,当执行继续超过@synchronized()块中的最后一个语句时。

@synchronized()指令将任何Objective-C对象作为唯一参数,包括self。