2009-06-22 19 views
7

Ho creato un'app in xcode con sqlite3.Voglio creare un pulsante denominato sync da sincronizzare con il mio database mysql nel mio server. Qualche suggerimento sul processo di sincronizzazione? Per favore mi faccia sapere.Sincronizzazione di un database client SQLite con un database di server MySQL

+0

Siete disposti a sincronizzare la creazione di una caduta delle tabelle? – Macarse

+0

sì ... significa che voglio sincronizzarmi con il server ogni volta che ne avrò bisogno ... tramite la transazione wireless non connetti iphone al PC – user123589

+0

Si tratta di una sincronizzazione a due vie? I record possono essere creati, letti, aggiornati e cancellati, sia sul server che sul client tra una sincronizzazione e l'altra? (Suggerimento: vuoi rispondere "no" a questa domanda se puoi.) – cduhn

risposta

4

Utilizzare un servizio Web sul server per restituire sia un numero di versione dello schema che un ultimo timestamp aggiornato. Se il client non è aggiornato, effettua una seconda chiamata per ottenere lo schema aggiornato e/o nuovi dati.

3

Credo che tu stia dicendo che hai un server MySql in esecuzione su un computer e stai eseguendo un'applicazione con un'istanza sqlite e vuoi aggiornare il server sqlite se ci sono nuovi dati sul server MySql.

vorrei farlo in questo modo

1) Assicurarsi che sia la tabella sul computer e sul app hanno la stessa struttura. Includi un ultimo campo aggiornato

2) Per verificare chi è più aggiornato, ottenere l'ultima riga dalla chiave univoca e quindi confrontare il campo aggiornato.

3) Quando il campo più aggiornato appartiene al server, capire quante righe sono diverse e iniziare a copiarle in un ciclo do ... while() o comunque si preferisce.

Se si implementa questo codice sia sul server che sul client, questi possono aggiornarsi reciprocamente o se si preferisce aggiornare solo il client.

Le specifiche dipendono dalla lingua che si desidera utilizzare e dalla quantità di tempo che si desidera mettere in sviluppo.

+0

Questo è interessante e voglio saperne di più. perché non so davvero come iniziare. Ho mySql Server in esecuzione su un computer e ho un'applicazione con un'istanza sqlite. Voglio creare un pulsante Sync nella mia app che scaricherà i nuovi dati dal server MySQL. – ludo

+0

Mi dispiace non aver risposto. Non ho il tempo di passare l'overflow dello stack come un tempo. –

0

alcune domande:

  • Si sta tentando una sincronizzazione a due vie, o semplicemente tirando gli aggiornamenti dal server?
  • Quali operazioni di aggiornamento sono accettabili? Inserimento/aggiornamento/eliminazione? Nei database replicati, le eliminazioni vengono solitamente evitate.

Se è necessario solo inserire inserti/aggiornamenti dal server, è possibile creare uno script PHP, che restituisce le istruzioni SQLite da eseguire. Lo script php prenderebbe un parametro dell'ultima sequenza/ora di aggiornamento dal client.

Se si intende eseguire la sincronizzazione a due vie, è necessario considerare fusioni e risoluzione dei conflitti. Per due vie, è meglio per ogni lato avere una coda di transazione. Basta registrare ogni istruzione CRUD eseguita sul database. Durante la sincronizzazione, applicare queste istruzioni e quindi troncare la coda.

8

Ti rendiamo conto che questo è un problema non banale. Ho scritto una biblioteca per realizzare questo per un'applicazione commerciale l'anno scorso e ci sono voluti circa 6 mesi per arrivare a dove ero felice con esso.

Lasciando da parte l'argomento per l'utilizzo della porta 80 e HTTP (TCP/IP) per evitare problemi di firewall e supporto, è necessario progettare un protocollo. Dal momento che il mio progetto era molto intuitivo, sono andato con un protocollo binario (piuttosto che con il bloated xml) che poteva gestire qualsiasi dato. Volevo anche che fosse bidirezionale in modo da poter INSERIRE i dati e anche eseguire richieste. Ho usato CGI/FastCGI sul server.

Il protocollo binario che ho progettato è abbastanza semplice (sempre migliore) e interrompe i trasferimenti di grandi dimensioni in blocchi di una dimensione definita dall'utente (circa 600k sembra essere buono). Ogni blocco ha un'intestazione seguita dai dati.

Sebbene questo protocollo possa essere utilizzato per la trasmissione di qualsiasi tipo di dati, in genere viene utilizzato per i dati di stile del database come suggerito dalla domanda. Per adattarlo, ho deciso di utilizzare un approccio a righe/colonne per il design. I dati vengono memorizzati una riga alla volta, ovvero ognuna delle colonne viene memorizzata per la riga uno, quindi tutte le colonne per la riga 2 ... riga n.

Il formato di un unico data colonne è:

' Col1Type   1Bytes - BYTE  ' Data Type (REMSQL_TEXT etc)     
' Col1Len   4Bytes - DWORD ' Length in bytes the Column Data       - up to 4.2GB 
' Col1Data   nBytes - BYTE  ' String data 

(in C, un BYTE è CHAR)

Ciò significa che ogni colonna ha un descrittore di tipo di dati. Tutti i tipi di dati possono essere rappresentati con:

REMSQL_NONE = 0 ' DataType undefined 
REMSQL_QUAD = 1 ' 64-bit signed integer     
REMSQL_DBLE = 2 ' 64-bit IEEE floating point number 
REMSQL_TEXT = 3 ' STRING - (CHAR) string of Ascii Bytes          
REMSQL_BLOB = 4 ' BLOB - (CHAR) string of Binary Bytes          
REMSQL_NULL = 5 ' NULL - Empty Column 

Questi tipi di dati coincidere con SQLite tipi di dati fondamentali e sono numericamente equivalenti a SQL3 tipi di dati fondamentali enumerazione.

In questo modello, se un campo è vuoto (NULL), sono necessari solo 5 byte per memorizzarlo. Ad esempio, se un campo contiene 200 byte di testo, sono necessari solo 205 byte per memorizzarlo. Il vantaggio maggiore consiste nell'analisi dei dati poiché è possibile saltare le colonne senza leggere tutti i 200 byte per trovare un carattere di terminazione.

L'intestazione Chunk dovrebbe contenere cose come, il numero di righe, numero di colonne, totale byte ecc ecc Se si utilizza DWORD (interi a 64 bit senza segno) allora il limite teorico per un pezzo è 4.2gigs che dovrebbe essere sufficiente anche per trasmissione di rete locale.

L'implementazione richiede la scrittura di wrapper SQLite/MYSQL per questa funzionalità. Io uso il protocollo binario esclusivamente, che prende un po 'di tempo, ma in sostanza sono necessari i seguenti funzioni: lato client: SendRequest() - invia la richiesta, attende la risposta

Server Side: ProcessRequest() - riceve una richiesta, i processi e restituisce la risposta

Nel mio caso, la risposta può essere! 00 MB di dati o più. Recupero l'intero set di dati da MySQL e lo salviamo su disco sul server. Quindi restituisco un blocco vuoto che contiene le metriche del set di dati. Il client richiede quindi il set di dati in blocchi di 600k, uno per uno. Se la connessione viene persa, riprende da dove era stata interrotta.

Infine, il set di dati era principalmente testo (nomi indirizzi ecc.) Così maturo per la compressione. La sicurezza era un grosso problema in questo caso, quindi la crittografia era essenziale. Questo è un po 'più complicato da implementare, ma in pratica si comprime l'intero blocco, il pad su una lunghezza che è un multiplo del codice a blocchi BLOCKSIZE e lo crittografa.

Nel processo di tutto ciò che scrivo una classe di stringa builder molto veloce, un'implementazione di crittografia AES in ASM, e una libreria intera FastCGI (www.coastrd.com)

Così come ho detto, non banale . Presto renderò disponibile questa libreria. Se vuoi controllare, mandami una email.

Una volta scritta la comunicazione, è possibile iniziare a progettare la sincronizzazione. Vorrei usare un hash per ogni record o una semplice bandiera booleana. Se qualcosa cambia sul server, basta inviare l'intero record e sovrascriverlo sul lato client (supponendo che tu stia cercando di mantenere sincronizzati i client ...)

Se scrivi il tuo, per favore pubblica qui la tua esperienza !

PS. Pensare di cambiare il titolo da più cercare amichevole .. Forse qualcosa di simile:

"Sincronizzazione di un database SQLite client con un database server MySQL"

0

SQuirreL SQL (in Java utilizzando Hibernate) ha un plugin DBCopy ad esso. Potrebbe essere possibile scrivere una copia del database usando questo. Non l'ho provato, ma questa è la prima direzione che vorrei seguire.

0

entropyDb ha una funzione di auto replica che possa gestire questo

Problemi correlati