Domanda

Va bene, naturalmente è possibile, che è nessun problema. Nel mio codice che ho più oggetti con cui lavoro, e hanno bisogno di essere dati persistenti. Per fare questo ho usato la codifica oggetto e la loro memorizzazione in un file di dati. Come ad esempio:

-(NSString *)dataFilePath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFilename];
}

E poi più avanti in un'altra sezione di codice:

NSMutableData *data = [[NSMutableData alloc] init];
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        NSLog(@"Test 4");
        [archiver encodeObject:playerTwo forKey:@"PlayerTwoObject"];
        [archiver encodeObject:singlePlayer forKey:@"SinglePlayer"];
        [archiver encodeObject:playerOne forKey:@"PlayerOneObject"];
        [archiver encodeObject:settings forKey:@"Settings"];


        [archiver finishEncoding];
        [data writeToFile:[self dataFilePath] atomically:YES];
        [singlePlayer release];
        [playerOne release];
        [playerTwo release];
        [settings release]; 

E che salva gli oggetti. So che funziona, perché io possa stipulare con questo codice:

unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]]];
    SettingsObject *settings = [unarchiver decodeObjectForKey:@"Settings"];
    Player *test = [unarchiver decodeObjectForKey:@"PlayerOneObject"];
    NSLog(@"Power On Settings Test: %d,%d", [settings playerOneStartingLife], [settings singlePlayerStartingLife]);
    NSLog(@"Power On Player Test: %@,%d", [test name], [test life]);

Cool! Così ora posso archiviare i miei oggetti, e li leggere. Quindi questo è dove il problema entra in gioco. in una classe diversa tiro fuori uno degli oggetti che sto memorizzazione e lavorare con esso. Non tutti, ho letto solo uno. E poi ho salvarlo di nuovo dopo che ho cambiato le impostazioni. Ma ho solo salvarlo:

NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:singlePlayer forKey:@"SinglePlayer"];
    [archiver finishEncoding];
    [data writeToFile:[self dataFilePath] atomically:YES];
    [singlePlayer release];

Dopo che ho fatto che, tutto il resto degli oggetti che ho memorizzati vengono rimossi. Ora sono confuso, perché ho pensato che stavo solo la modifica della sola chiave "SinglePlayer", ma a quanto pare che rimuove in qualche modo il resto di loro? È che supossed per succedere? Ho avuto alcuni problemi con il rilascio del Archiver, vorrei che incidono su di esso a tutti ... non penso che avrebbe fatto. Qualcuno ha qualche informazione su questo, perché io non voglio avere a prendere tutti gli oggetti e li ri-codificare se solo Voglio modificare uno di loro ...

Grazie per il vostro aiuto!

È stato utile?

Soluzione

Si crea una nuova Archiver, con un oggetto di dati emtpy. Si scrive l'oggetto SinglePlayer nei dati, ma non si memorizza il resto dei dati nello stesso, nuovo archivio creato.

Per fare ciò, estrarre dall'archivio tutto memorizzato in precedenza archivio, quindi regolare l'oggetto singleplayer archivio e salvarlo di nuovo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top