2013-09-07 8 views
5

Così, ho utilizzato MagicalRecord per sviluppare un'app per iPad, e recentemente dopo essermi trasferito in un negozio di migrazione automatica sono stato sperimentando alcuni problemi. Ho bisogno di sincronizzare il mio file .db da un dispositivo a un altro, quindi ho bisogno che tutti i dati siano nel .db, ma sembra che con la modalità di registrazione WAL abilitata (l'impostazione predefinita per gli archivi di migrazione automatica di Magical Record) no importa come io lo salvo persiste solo le modifiche ai file .db-wal o .db-shm. Sono passato a un normale negozio SQLite e tutto ha funzionato bene. Quindi, la mia domanda è, con il journal WAL abilitato, devo fare qualcosa di speciale per ottenere effettivamente i dati di base da salvare nel database principale, o dovrò semplicemente disabilitarli?Dati principali Modalità WAL non persistente modifiche a .db, solo .db-wal e .db-shm

risposta

4

Modificare la modalità del giornale. Hai il Magical Record source, dopo tutto. Cambiare la modalità journal SQLite su DELETE e la modalità journal verrà cancellata dopo ogni transazione. Disabilitare il journalling è una pessima idea, non farlo. Ma usare una modalità diversa dovrebbe andare bene.

Core Data non offre alcuna API per la manipolazione del giornale una volta aperto l'archivio permanente. SQLite è un dettaglio di implementazione e Core Data non espone i dettagli interni di SQLite. Il più vicino possibile è il parametro options quando si configura lo stack Core Data, che è dove è possibile cambiare la modalità journal (e dove MR lo cambia).

+0

Ok, penso che lo farò. Ho solo bisogno di capire il modo migliore per salvare le mie modifiche su MagicalRecord con CocoaPods. Grazie! – Wizecoder

0

Il file -wal fa parte del database; è necessario sincronizzarlo insieme al file .db.

In alternativa, è possibile copiare i dati nel file di database principale eseguendo un checkpoint.

+6

Quando si utilizzano i dati di base, non si ha accesso all'handle diretto di SQLite, quindi non c'è modo di eseguire manualmente un checkpoint (o addirittura di utilizzare una chiamata 'sqlite3_ *'). –