2012-10-01 32 views
0

我有SQL以及核心数据,我application.Now被使用,如果我做出一些改变假设,更新SQL数据库使用SQL查询我有那些更新made.If我做获取请求和打印阵列我看到相同的旧值,除非我退出应用程序并重新启动它。我无法理解这种行为。我想知道如果在sql db中进行了更改,那么这些更改会反映在核心数据表中吗?如果没有,那么我是否必须将更新后的值保存在coredata中,是否会导致重复或冗余数据? 这是被用于更新的值的代码:
我有一个数组包含值:对核心数据中所反映的sql所做的更改是否反映出来?

- (void) updateGeneraldata3 :(NSArray*) marrDataUpdate 
    { 
                            sqlite3 *database; 
sqlite3_stmt *update_statement = nil; 

if(sqlite3_open([strDatabasePath UTF8String], &database) == SQLITE_OK) 
{ 
    NSString *strMQueryupdate = [NSString stringWithFormat:@"UPDATE zform_general_data1 SET zChk_Mild='%@', zChk_CTV='%@', zChk_DOA='%@',   zChk_ALS1='%@' where zautonumber='%@'",[marrDataUpdate objectAtIndex:0],[marrDataUpdate objectAtIndex:1],[marrDataUpdate objectAtIndex:2],[marrDataUpdate objectAtIndex:3],autoNumberTextField.text]; 

    const char *sql = [strMQueryupdate UTF8String]; 

    if (sqlite3_prepare_v2(database, sql, -1, &update_statement, NULL) != SQLITE_OK) { 
     NSLog(@"update fails"); 
    } 
    else 
    { 

     sqlite3_bind_text(update_statement, 1, [[marrDataUpdate objectAtIndex:0] UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(update_statement, 2, [[marrDataUpdate objectAtIndex:1] UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(update_statement, 3, [[marrDataUpdate objectAtIndex:2] UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(update_statement, 4, [[marrDataUpdate objectAtIndex:3] UTF8String], -1, SQLITE_TRANSIENT);   
     int success = sqlite3_step(update_statement); 
     sqlite3_reset(update_statement); 
     if (success == SQLITE_ERROR){} 
     else {} 
    } 
    sqlite3_finalize(update_statement); 
    } 
    sqlite3_close(database); 

    } 
                    And after update there is a background function which is executed after every 60 seconds of time .Now if i change the value of these fields on the view using the respective text fields, it updates the value in db using the above code which is also being executed after a certain interval of time :                       


-(void) functServerPostingData 

{ 

@try 
    { 
    @autoreleasepool { 


    generalDataObject = [[GeneralData alloc] init]; 
    generalData1_Array=[[NSArray alloc]init]; 
      [self checkUsedAutoNumber]; 
    NSError *error; 
    NSManagedObjectContext *mocGeneral1 = [self managedObjectContext]; 
    NSEntityDescription *entityDescriptionGeneral1 = [NSEntityDescription 
                 entityForName:@"Form_General_Data1" inManagedObjectContext:mocGeneral1]; 
    NSFetchRequest *requestGeneral1; 

    requestGeneral1 = [[NSFetchRequest alloc] init]; 

    [requestGeneral1 setEntity:entityDescriptionGeneral1]; 

    generalData1_Array=[mocGeneral1 executeFetchRequest:requestGeneral1 error:&error]; 
    NSLog(@"generalData1_Array :%@",generalData1_Array); 
       if(!generalData1_Array) 
    { 

     NSLog(@"Error fetching Login: %@", [error localizedDescription]); 
     abort(); 

    } 


    for(int i = 0; i< [generalData1_Array count]; i++) { 
     for (int j=0;j<[[strAutoNumber componentsSeparatedByString:@","] count] ; j++) 
     { 

      if([[[generalData1_Array objectAtIndex:i] Autonumber ] isEqualToString: [[strAutoNumber componentsSeparatedByString:@","]objectAtIndex:j]]) 
      { 
       generalDataObject.AutoNumber=[NSString stringWithFormat:@"%@",[[generalData1_Array objectAtIndex:i] Autonumber ]]; 

       generalDataObject.Chk_Mild =[[generalData1_Array objectAtIndex:i]Chk_Mild]; 

       generalDataObject.Chk_CTV=[[generalData1_Array objectAtIndex:i]Chk_CTV]; 


       generalDataObject.Chk_PAU=[[generalData1_Array objectAtIndex:i]Chk_PAU]; 
            generalDataObject.Transient=[[generalData1_Array objectAtIndex:i]Transient]; 

       generalDataObject.Chk_ALS1= [[generalData1_Array objectAtIndex:i]Chk_ALS1]; 


       [generalDataObject startPostServerData]; 
      } 
     } 
    } 

    if (generalDataObject.checkRequest==TRUE) 
    { 
     [appDelegate CheckInternetConnection]; 
     if(appDelegate.internetWorking==-1) 
     { 
     } 
     else { 
      serverLinkToHit = [NSString stringWithFormat:@"%@/ReceiveData.aspx?m=InsertData&t=GeneralData",[serverLinkSettings getServerLink ]]; 
      [generalDataObject readServerData:serverLinkToHit postServerData:generalDataObject.finalDataString]; 
     } 

    } 
    generalDataObject = nil; 
     requestGeneral1=nil; 
     requestGeneral2=nil; 
    } 
    } 
@catch (NSException *exception) 
    { 
    [ExceptionLog LogEntry:exception :@"Error while entering data functServerPostingData"]; 
} 


} 

我已打印阵列总是显示先前的旧值不考虑我在文本字段和保存已输入在db.However,在同一个地方,我打印的SQL数据库的值他们更新。我用sql select来选择值把它放在一个数组,然后发布?

+0

您是直接访问CoreData的SQLite后备存储吗? – Eimantas

+0

@Eimantas是的,我正在使用SQL。 – user1693436

+1

不要这样做。这是一个非常糟糕的做法。 CoreData是对象图,而不是数据库。 – Eimantas

回答

1

不。这不是核心数据的工作原理。数据库的格式没有记录,你不应该玩它。

我觉得这里真正的问题是:为什么你认为你需要使用SQL?看起来你只是更新了一些记录。这是使用“原生”核心数据非常直接。

+0

我正在考虑使用SQL,因为核心数据并没有显示出我的最新值,但是SQL确实如此。正如前面的评论所述,这不是正确的做法。可能我必须看看为什么核心数据没有更新我的值。 – user1693436

+0

核心数据不会自动同步管理的对象上下文_之间的数据。但你可以听取更新事件并合并它们。 –

+0

好吧,我会分别在核心数据中插入值。 – user1693436

相关问题