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
risposta
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.
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.
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
Mi dispiace non aver risposto. Non ho il tempo di passare l'overflow dello stack come un tempo. –
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.
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"
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.
entropyDb ha una funzione di auto replica che possa gestire questo
- 1. Database di sincronizzazione sqlite con mysql
- 2. Sincronizzazione del modello di database parziale dal server al client
- 3. Sincronizzazione database SQLite dalla memoria al file
- 4. La sincronizzazione del database MySQL tra due server utilizzando PHP
- 5. Sincronizzazione database online/offline - MySQL/PHP
- 6. Replica mysql - server slave su un database
- 7. sbloccare efficacemente un database SQLite
- 8. Utilizzo di un database SQLite in Libgdx
- 9. database di sviluppo laravel database sqlite inesistente
- 10. Differenza tra database MySQL/SQLite/etc?
- 11. Sincronizzazione di database tally con C# Applicazione
- 12. Sincronizzazione tra due database
- 13. Sincronizzare i database MySQL locali con un database cloud
- 14. Aggiornamento database sqlite quando il database del server viene aggiornato
- 15. copia l'intero database su un altro database del server
- 16. synchronize database sqlite Android
- 17. Strumento di sincronizzazione o migrazione del database
- 18. Sincronizzazione tra database SQL Lite su un dispositivo Android e database SQL Server
- 19. Database SQLite, multithreading, serrature e sincronizzazione dell'account su Android
- 20. Creare un database MySQL con file .SQL
- 21. Come trasformare un database MSSQL nel database SQLite per Android
- 22. Mock un database MySQL in Python
- 23. libreria javascript per l'archiviazione lato client con sincronizzazione lato server
- 24. CQRS, database di reporting di sincronizzazione DDD
- 25. Sincronizzazione di SQLite con SQLServer tramite Sync Framework
- 26. esiste un limite alle dimensioni di un database SQLite?
- 27. Come rimuovere un database MySQL?
- 28. Più file per un singolo database SQLite
- 29. multipla Sincronizzazione Database - SignalR con la messaggistica backplane
- 30. Sincronizzazione database di Access in un Distributed App
Siete disposti a sincronizzare la creazione di una caduta delle tabelle? – Macarse
sì ... significa che voglio sincronizzarmi con il server ogni volta che ne avrò bisogno ... tramite la transazione wireless non connetti iphone al PC – user123589
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