วิธีที่ดีที่สุดในการซิงโครไนซ์ HTML5 DB โลคัล (WebSQL Storage, SQLite) กับเซิร์ฟเวอร์ (ซิงค์แบบ 2 ทาง) [ปิด]


151

ฉันกำลังพัฒนาแอปพลิเคชันเว็บมือถือ (สำหรับ iPhone และ Android) ด้วยฐานข้อมูลท้องถิ่น (โดยใช้ html5 webstorage) ดังนั้นแอปของฉันยังคงใช้งานได้เมื่อผู้ใช้ออฟไลน์

มันทำงานได้อย่างสมบูรณ์ แต่ฉันต้องการบันทึกข้อมูลในเครื่องบนเซิร์ฟเวอร์ ดังนั้นฉันต้องซิงโครไนซ์ฐานข้อมูลโลคัลกับฐานข้อมูลบนเซิร์ฟเวอร์ การซิงโครไนซ์สามารถทำได้เพียงวิธีเดียว แต่ในอนาคตฉันต้องการซิงโครไนซ์ทั้งสองทาง (เซิร์ฟเวอร์ <-> ฐานข้อมูลท้องถิ่น)

(หรือจะเป็นเรื่องปกติในอนาคตสำหรับแอปพลิเคชันเว็บมือถือ) แต่ฉันไม่พบห้องสมุดที่ทำเช่นนั้น

ฉันรู้ว่า google กำลังทำเช่นนั้นในเว็บแอปบนอุปกรณ์เคลื่อนที่ (เช่น gmail) และฉันพบว่าโครงการ WSPLเป็นโครงการ google แต่ไม่มีซอร์สให้ดาวน์โหลด

หากฉันไม่สามารถหาวิธีแก้ปัญหาได้ฉันจะสร้างห้องสมุดเพื่อทำสิ่งนั้นเนื่องจากการซิงค์แบบทางเดียวดูไม่ยาก แต่ฉันสงสัยว่ามีวิธีแก้ไขปัญหาอื่นหรือไม่


2
ฉันไม่ทราบว่ามี libs ใด ๆ หรือไม่ แต่วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการจัดเก็บเวลาการแก้ไขและการถ่ายโอนการเปลี่ยนแปลงไปยังระเบียนที่ใหม่กว่าบันทึกในอีกด้านหนึ่งและโอนย้ายการเพิ่มและการลบ มันอาจจะบ้าไปแล้วถ้านาฬิกาในท้องที่และนาฬิกาของเซิร์ฟเวอร์ไม่ซิงค์กัน แต่คุณจะนึกถึงบางสิ่ง - การโพสต์เป็นความคิดเห็นเนื่องจากอาจเป็นประโยชน์มากและไม่ได้ให้คำตอบแก่คุณ
Ivan Vučica

ขอบคุณอิวาน คุณพูดถูกแล้วถ้านาฬิกาในเครื่องและเซิร์ฟเวอร์ไม่ซิงค์กันอาจจะยุ่ง ... ฉันเพิ่งพบว่า: quickconnect.pbworks.com/Using-Enterprise-Synchronization มันบอกว่ามันสามารถซิงโครไนซ์ HTML 5 DB ท้องถิ่น DB ในเซิร์ฟเวอร์ ฉันจำเป็นต้องมีมองลึกลงไปในนั้นและดูว่ามันสามารถทำงานนอกกรอบ QuickConnect ...
ซามูเอล

ฉันพบวิธีแก้ไขปัญหาอื่น: impel.simulacre.org/blog/…ดูดี แต่คุณจะต้องใช้ห้องสมุด Mootools และ Impel ORM ...
Samuel

1
CouchDB เป็นอย่างไร couchdb.apache.org
julianm

4
หัวข้อสำหรับการอภิปรายกองแลกเปลี่ยนสำหรับคำถาม ที่จุดหนึ่งโพสต์เช่นนี้ได้รับการยอมรับในการแลกเปลี่ยนสแต็ค แต่ไม่อีกต่อไป
casperOne

คำตอบ:


70
  • ฉันสร้าง JS lib ขนาดเล็กชื่อWebSqlSyncเพื่อซิงโครไนซ์ WebSql DB ในเครื่องกับเซิร์ฟเวอร์ (ไคลเอนต์ <-> เซิร์ฟเวอร์) ใช้งานง่ายและรวมไว้ในรหัสของคุณ:

https://github.com/orbitaloop/WebSqlSync

  • โครงการโอเพ่นซอร์สQuickConnectมีไลบรารี JS เพื่อซิงโครไนซ์ HTML5 SQLite DB โลคัลกับฐานข้อมูลเซิร์ฟเวอร์ (MySQL หรืออื่น ๆ ):

http://quickconnect.pbworks.com/Using-Enterprise-Synchronization

ในการใช้ lib นี้คุณต้องใช้ DataAccessObject ของเฟรมเวิร์กเพื่อเข้าถึงฐานข้อมูลของคุณ มันทำงานได้โดยการจัดเก็บคำขอ SQL ทั้งหมดที่ใช้กับฐานข้อมูล (ยกเว้นการเลือกแน่นอน) และส่งไปยังเซิร์ฟเวอร์ เป็นเรื่องที่ยอดเยี่ยมในการจัดการการลบ แต่มันค่อนข้างหนักถ้าคุณมีการอัปเดตจำนวนมากและเซิร์ฟเวอร์จำเป็นต้องใช้ภาษา SQL เดียวกัน ...

  • โครงการอื่นจากQuickConnectคือ native SQLite synch (ใน Objective C สำหรับ iOS หรือ Mac OS และใน Java สำหรับ Android):

http://www.quickconnectfamily.org/qcdbsync/ (ฉันคิดว่ามันเก็บประวัติของคำขอ SQL ทั้งหมดด้วย)

  • และฉันเพิ่งพบห้องสมุด JS อีกสัญญา: persistenceJS

https://github.com/zefhemel/persistencejs

"persistence.js เป็นไลบรารี mapper แบบสัมพันธ์เชิงวัตถุ Javascript แบบอะซิงโครนัสคุณสามารถใช้ในเบราว์เซอร์และบนเซิร์ฟเวอร์ (และคุณสามารถแชร์แบบจำลองข้อมูลระหว่างกันได้")

พวกเขามีโมดูลซิงค์ฐานข้อมูล: DOC ของ persistence.synch.js

(ทำงานร่วมกับ HTML5 DB SQLite หรือ Google Gears บนไคลเอนต์และ MySQL บนเซิร์ฟเวอร์)

  • และยังมีImpel.inTouch มันดูใช้งานง่ายมาก (พร้อมไฟล์ php) แต่คุณต้องใช้เฟรมเวิร์ก Mootools ในฝั่งไคลเอ็นต์:

http://impel.simulacre.org/api/Impel.inTouch

  • Sencha นอกจากนี้ยังมีบริการให้ตรงกัน: Sencha.io ดูดี แต่ขึ้นอยู่กับกรอบของ Sencha Touch:

http://www.sencha.com/products/io/


สวัสดีซามูเอล js lib นั้นได้ผลสำหรับคุณหรือไม่
Mathias Conradt

การซิงค์ฐานข้อมูลไม่ใช่ลำดับความสำคัญของฉันในตอนนี้ดังนั้นฉันแค่ยอมแพ้รอวิธีแก้ปัญหาที่ได้มาตรฐานและมีประสิทธิภาพมากขึ้น ...
ซามูเอล

3
หลังจากทดสอบทั้งหมดแล้วฉันคิดว่าฉันจะพัฒนา JS lib ขนาดเล็กของตัวเองเพื่อซิงโครไนซ์ WebSQL กับเซิร์ฟเวอร์ DB มันจะเป็นคู่ซิงค์ (เซิร์ฟเวอร์ <-> ในท้องถิ่น) และจะไม่มีการอ้างอิงใด ๆ ฉันจะโพสต์ลิงก์ไปยังโค้ดที่นี่เมื่อเสร็จแล้ว
Samuel

2
ฉันได้ส่งมอบเวอร์ชั่นแรกของโซลูชันการซิงค์ของตัวเองชื่อ WebSqlSync: github.com/orbitaloop/WebSqlSync (คำตอบสำหรับ cf ด้านล่าง)
ซามูเอล

1
สวัสดีทุกคนฉันเริ่มปลั๊กอินที่คงอยู่เพื่อการซิงโครไนซ์ที่สงบ มันยังอยู่ในการพัฒนา แต่ถ้าใครต้องการตรวจสอบ: github.com/robertokl/persistencejsและตัวอย่างการทำงานในฝั่งเซิร์ฟเวอร์ / ลูกค้าที่มี ruby ​​บนราง: github.com/robertokl/persistencejs-restfulSync-example
robertokl

18

ผมได้พัฒนาวิธีการแก้ปัญหาการซิงค์ทั่วไปเรียกว่าWebSqlSync

มันไม่ได้ขึ้นอยู่กับกรอบงานใด ๆ มีให้ที่นี่: https://github.com/orbitaloop/WebSqlSync

แตกไฟล์ README:

WebSqlSync

ซิงโครไนซ์ฐานข้อมูล WebSql แบบโลคัลโดยอัตโนมัติ (SQLite ในเนวิเกเตอร์) กับเซิร์ฟเวอร์ (ซิงค์ 2 ทาง: ไคลเอนต์ <-> เซิร์ฟเวอร์)

ง่ายมากที่จะรวมเข้ากับแอพที่มีอยู่ของคุณและใช้งานง่ายมาก (2 ฟังก์ชันในการโทร: initSync และ syncNow)

การใช้

เริ่มต้น

คุณต้องเริ่มต้น lib (เช่นในแต่ละการเริ่มต้น)

มันจะสร้าง 2 ตารางโดยอัตโนมัติ (หากยังไม่มีอยู่หนึ่งจะเก็บองค์ประกอบใหม่หรือปรับเปลี่ยนทั้งหมด (ตาราง new_elem) และหนึ่งเพื่อเก็บวันที่ของการซิงค์ครั้งล่าสุด (ตาราง sync_info) นอกจากนี้ยังจะสร้างทริกเกอร์ SQLite ใน เพื่อดู INSERT หรือ UPDATE บนตารางที่คุณต้องการซิงโครไนซ์ (เพื่อแทรกองค์ประกอบที่แก้ไขในตาราง new_elem โดยอัตโนมัติ):

DBSYNC.initSync(TABLES_TO_SYNC, webSqlDb, sync_info, 'http://www.myserver.com', callBackEndInit);

โดยที่ TABLES_TO_SYNC เป็นรายการของตารางที่คุณต้องการซิงค์กับเซิร์ฟเวอร์เช่น:

TABLES_TO_SYNC = [
    {tableName : 'table1', idName : 'the_id'},
    {tableName : 'table2'} //if idName not specified, it will assume that it's "id"
];

ประสาน

ในการเริ่มการซิงโครไนซ์คุณจะต้องเรียกใช้ฟังก์ชัน syncNow คุณสามารถเรียกมันได้ทุก X วินาทีหรือหลังจากการเปลี่ยนแปลงบางอย่าง:

DBSYNC.syncNow(callBackSyncProgress, function(result) {
     if (result.syncOK === true) {
         //Synchronized successfully
     }
});

และนั่นคือทั้งหมดที่คุณต้องทำกับลูกค้า ทางฝั่งเซิร์ฟเวอร์คุณจะต้องเขียนรหัสโซลูชันของคุณเอง (แต่ไม่ซับซ้อน) และมีตัวอย่างบางส่วนใน PHP & Java อีกครั้งยินดีต้อนรับผลงาน


คุณจะบอกว่าสิ่งนี้ได้ผลดีแค่ไหนสำหรับคุณสรุปได้หนึ่งปีต่อมา? ฉันกำลังมองหาฐานข้อมูลลูกค้าที่ดีที่ใช้งานได้กับเบราว์เซอร์และอุปกรณ์เคลื่อนที่
Niklas

1
WebSQLSync ทำงานได้ดีมากโดยมีแอพมากกว่า 25 แอพพลิเคชั่น (iOS และ Android) WebSQL นั้นยอดเยี่ยมและรวดเร็วจริงๆ มันทำงานบน iOS, Android, Blackberry (รุ่นล่าสุดที่ฉันคิดว่า) และแน่นอนโครเมียมและซาฟารี แต่มันไม่ทำงานกับ IE และ Firefox เนื่องจาก API ได้รับการคิดค่าเสื่อมราคาโดย W3C ..
Samuel

เอาล่ะทั้งบวกและลบตรงนั้น ขอบคุณสำหรับการสรุป!
Niklas

2
คุณมีอะไรที่คล้ายกัน แต่สำหรับ localStorage และไม่ใช่ WebSQL?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.