2015-07-16 11 views
12

मैंने एक क्वेरी लिखी है जो viewWillAppear पर आग लगती है। एक त्वरित नेविगेशन के साथ उस स्क्रीन पर वापस आने पर परिणामस्वरूप sqlite3_prepare_v2 पर क्रैश हो रहा है।
मुझे क्या लगता है कि दुर्घटना पिछली क्वेरी के कारण अंतिम रूप में नहीं है।
मैं dispatch_async का उपयोग कर डेटाबेस ऑपरेशन को कॉल कर रहा हूं क्योंकि मैं पहले रिमोट डेटा अपडेट कर रहा हूं और फिर इसे डेटाबेस में सहेज रहा हूं।
कोड इस तरह दिखता है:sqlite3_prepare_v2 क्रैश - पहले से ही पिछली क्वेरी

-(void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self reloadData]; 
} 

-(void)reloadData 
{ 
    [self getRemoteActivities:^(BOOL finished) { 
     if(finished){ 
      if([TGProjectHandler hasExistingSession]) 
      { 
       [self getActivities]; 

      } 
      else 
       [self login]; 
     } 
    }]; 
} 

आपके विचारों और समाधान:

- (NSMutableArray*)GetAllInvitations:(NSString*)ActivityId 
{ 
    NSMutableArray *arrInvitations = [[NSMutableArray alloc]init]; 

    sqlite3_stmt *statement = nil; 

    @try { 
     const char *sql = "SELECT * FROM Invitation where ActivityId = ?"; 

     if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) { 

      sqlite3_bind_text(statement, 1, [ActivityId UTF8String], -1, SQLITE_TRANSIENT); 
      while (sqlite3_step(statement) == SQLITE_ROW) { 

       char *dbString; 

       Invitation *invitation = [[Invitation alloc]init]; 

       dbString = (char *)sqlite3_column_text(statement, 0); 
       NSString *Id = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; 
       [invitation setId:Id]; 

       dbString = (char *)sqlite3_column_text(statement, 1); 
       NSString *childName = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; 
       [invitation setChildName:childName]; 

       dbString = (char *)sqlite3_column_text(statement, 2); 
       NSString *response = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; 
       [invitation setResponse:response]; 

       dbString = (char *)sqlite3_column_text(statement, 3); 
       NSString *invitationId = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; 
       [invitation setInvitationId:invitationId]; 

       dbString = (char *)sqlite3_column_text(statement, 4); 
       NSString *isCoGaurdian = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; 
       [invitation setIsCoGaurdian:isCoGaurdian]; 

       dbString = (char *)sqlite3_column_text(statement, 5); 
       NSString *activityId = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; 
       [invitation setActivityId:activityId]; 

       dbString = (char *)sqlite3_column_text(statement, 6); 
       NSString *picture = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; 
       [invitation setPicture:picture]; 

       dbString = (char *)sqlite3_column_text(statement, 7); 
       NSString *invitationUserId = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; 
       [invitation setInvitedUserId:invitationUserId]; 

       dbString = (char *)sqlite3_column_text(statement, 8); 
       NSString *roleId = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; 
       [invitation setRoleId:roleId]; 

       dbString = (char *)sqlite3_column_text(statement, 9); 
       NSString *status = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; 
       [invitation setStatus:status]; 

       [arrInvitations addObject:invitation]; 
      } 
     } 
     else 
     { 
      NSLog(@"Failed to create table: %s", sqlite3_errmsg(database)); 
     } 


    } 
    @catch (NSException *exception) { 

     NSLog(@"Error in GetAllInvitations : %@", exception.description); 
    } 
    @finally { 

     sqlite3_finalize(statement); 
    } 

    return arrInvitations; 
} 


- (NSMutableArray*)GetAllActivities{ 

    NSMutableArray *arrProjects = [[NSMutableArray alloc]init]; 

    sqlite3_stmt *statement = nil; 

    @try { 
     const char *sql = "SELECT * FROM Activity"; 

     if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) { 
      NSLog(@"success"); 
      while (sqlite3_step(statement) == SQLITE_ROW) { 

       ......... 

       activity.arrInvitations = [self GetAllInvitations:activityId]; 

       [arrProjects addObject:activity]; 
      } 
     } 
     else 
     { 
      NSLog(@"Prepare-error #%i: %s", sqlite3_prepare_v2(database, sql, -1, &statement, NULL), sqlite3_errmsg(database)); 
     } 
    } 
    @catch (NSException *exception) { 

     NSLog(@"Error in GetAllActivities : %@", exception.description); 
    } 
    @finally { 

     sqlite3_finalize(statement); 
    } 

    return arrProjects; 
} 

मैं GetAllActivitiesviewWillAppear से बोल रहा हूँ:

dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL); 

       dispatch_async(myQueue, ^{ 
        [self parseActivityResponse:data]; // Sqlite operation here 
        dispatch_async(dispatch_get_main_queue(), ^{ 
         // Update the UI 
         if(loaderImageview) 
          [loaderImageview removeFromSuperview]; 
         [tableActivities reloadData]; 

        }); 
       }); 

क्वेरी इस प्रकार है?

+1

तो जब ऐप क्रैश हो जाता है (या फंस जाता है), तो क्या आपके पास एकाधिक थ्रेड से समान डेटाबेस कनेक्शन पर sqlite3 कॉल हैं? यदि ऐसा है तो संभवतः एक आसान समाधान है। इसके अलावा - क्या आपके पास डीबग कंसोल से क्रैश के बारे में कोई जानकारी है? – Artal

+1

@ आर्टल: डाटाबेस कॉल सिंगलटन क्लास में है, मुझे लगता है कि वे एक ही डेटाबेस कनेक्शन साझा करते हैं। कंसोल पर कुछ भी नहीं दिखता है। – Nitish

+1

और क्या एक ही समय में विभिन्न धागे द्वारा कॉल किए जा रहे हैं? – Artal

उत्तर

6

के साथ श्रृंखलाबद्ध कतार बनाएँ:

dispatch_queue_t myQueue = dispatch_queue_create("My Queue", DISPATCH_QUEUE_SERIAL); 

और उस डेटाबेस के लिए अनुक्रमिक अभिगम का प्रबंधन करना चाहिए।

+1

इससे कुछ और नेविगेशन में दुर्घटना में देरी हुई लेकिन फिर मुझे फिर से दुर्घटना मिली। – Nitish

+0

@ नीतीश हमम ठीक है। आपके SQLite3 कोड में आपको कोई त्रुटि रिपोर्टिंग नहीं है। कृपया इसे अपडेट करें और देखें कि क्या यह आपको कोई सुराग देता है। अगर ऐसा नहीं है तो मैं स्टैकट्रैक देखना चाहता हूं। – trojanfoe

+0

ऐसा किया गया लेकिन त्रुटि gettable नहीं है। यह sqlite3_prepare_v2 पर अटक गया है। मैंने प्रश्न में अपना कोड अपडेट किया है। – Nitish

4

एक बात जो मुझे नोटिस है viewWillAppear में आप getActivities पर कॉल करते हैं लेकिन आप GetAllActivities के शरीर को पेस्ट करते हैं। यह एक लंबा शॉट है लेकिन आप सुनिश्चित हैं कि आप अपनी GetAllActivities विधि को सही तरीके से कॉल करें? और जहां से GetAllInvitations विधि कहा जाता है?

संबंधित मुद्दे