0

アプリケーションで使用されているSQLとコアデータがあります。ここで、いくつかの変更を加えた場合は、SQLクエリを使用してSQLデータベースを更新します。フェッチ要求を行って配列を印刷すると、同じ古いものが表示されます。アプリを終了して再起動しない限り、値です。この動作を理解できません。SQLデータベースで変更が行われた場合、それらの変更はコアデータテーブルに反映されますか?そうでない場合は、更新された値をcoredataに適切に保存する必要がありますか?それにより、データが重複または冗長になりますか?これは、値を更新するために使用されているコードです。
値を含む配列があります。

   - (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に保存した内容に関係なく、常に以前の古い値を表示する配列を出力しましたが、同じ場所でsqldbの値を出力します。sqlselectを使用して選択します。値はそれを配列に入れてから投稿しますか?

4

1 に答える 1

1

いいえ、それは Core Data の仕組みではありません。データベースの形式は文書化されておらず、いじってはいけません。

ここでの本当の問題は、なぜ SQL を使用する必要があると思いますか? ということだと思います。いくつかのレコードを更新しているようです。これは、「ネイティブ」コア データを使用すると非常に簡単です。

于 2012-10-01T10:41:08.457 に答える