2011-10-02 15 views
9

के लिए रैपर फ़ंक्शन मुझे आईपैड/टैबलेट डिवाइस के लिए ऑफ़लाइन HTML5 वेब ऐप बनाने की आवश्यकता है जहां उपयोगकर्ता सर्वर से डेटासेट (डेटा की तालिका) डाउनलोड कर सकता है और उसे डिवाइस पर स्टोर कर सकता है। उपयोगकर्ता तब सर्वर से डिस्कनेक्ट कर सकता है और डिवाइस पर स्थानीय रूप से डेटा को संपादित/संपादित कर सकता है। यह उन लोगों के लिए है जो दूरदराज के इलाकों में काम करते हैं जहां कोई सेलुलर कवरेज नहीं है और डेटा एकत्र करने/अपडेट करने की आवश्यकता है। जब वे कार्यालय में वापस आते हैं तो वे डेटा को सर्वर पर वापस सिंक/अपलोड कर सकते हैं। एचटीएमएल 5 होने की वजह यह है कि यह मंच अज्ञेयवादी है, यानी इसे आईओएस, एंड्रॉइड आदि पर चलाया जा सकता है, जब तक कि इसका एक आधुनिक वेब ब्राउजर है जो एचटीएमएल 5 का समर्थन करता है।इंडेक्सड डीबी

अब मैंने पहले ही एचटीएमएल 5 स्थानीय स्टोरेज (डेटा के लिए) और एचटीएमएल 5 ऑफ़लाइन एप्लिकेशन कैश (पृष्ठों/सीएसएस/जेएस/छवियों के लिए) का उपयोग कर सिस्टम बनाया है और यह छोटे डेटासेट के साथ उचित रूप से अच्छी तरह से काम करता है (मैं देख सकता हूं ऑफ़लाइन होने पर संपादित करें और सहेजें और ऑनलाइन होने पर लोड/सिंक करें)। अब मुझे डेटा की 10,000 पंक्तियों को स्केल करने की आवश्यकता है। यह काम करता है लेकिन यह इंटेल क्वाड कोर 8 जीबी मशीन पर लोड करते समय 10secs के लिए ब्राउज़र धीमा है और ब्राउज़र को लटकता है।

तो मैं कर दिया है स्थानीय भंडारण की तुलना में कुछ बेहतर विकल्प शोध किया गया:

1) WebSQL: मिलती है एसक्यूएल भाषा का प्रयोग डेटा को क्वेरी करने में सक्षम हो सकता है और कर सकते हैं आदि समस्या यह अब पदावनत है एक नहीं होगा अब समर्थित रहें, इसलिए मैं इसके लिए कुछ समय बनाने का निवेश नहीं करना चाहता हूं।

2) इंडेक्सड डीबी: ऑब्जेक्ट स्टोर का उपयोग करता है (जो तकनीकी रूप से मैं पहले से ही स्थानीय स्टोरेज एपीआई का उपयोग कर ऑब्जेक्ट्स संग्रहीत कर रहा हूं और जेएसओएन का उपयोग करके भंडारण कर रहा हूं)। संभावित रूप से तेज़ है क्योंकि यह एसक्यूएल लाइट बैकएंड के साथ इंडेक्स का उपयोग करता है। डेटाबेस बनाने जैसे सरल कार्यों को करने के लिए बॉयलरप्लेट कोड बहुत सारे हैं, इसमें जोड़कर, इसे पढ़ना, इसे फिर से चालू करना। मैं सिर्फ select(xyc, abc).where(abc = 123).limit(20) जैसी सरल क्वेरी करना चाहता हूं लेकिन इसके बजाय इसे करने के लिए बहुत सारे जावास्क्रिप्ट कोड लिखना है। तालिकाओं, किसी भी उदाहरण के बीच जुड़ने के लिए कोई अपना कोड कैसे लिखता है?

मुझे एक jQuery plugin मिला है जो जीवन को आसान बना सकता है। क्या आसपास के अन्य पुस्तकालय हैं जो इंडेक्सड डीबी का उपयोग करने के दर्द को कम करते हैं?

बहुत धन्यवाद!

+1

मेरा मानना ​​है कि वेबएसक्यूएल को इंडेक्सड डीबी के पक्ष में छोड़ दिया गया है ... –

+1

वेबएसक्यूएल के लिए देखें, ऐप्पल 5.0.1 अब वेबएसक्यूएल डेटा जारी नहीं है। दूसरे शब्दों में, यह आपके ऐप के स्थानीय डेटाबेस को अपंग करेगा। फोनगैप का कामकाज है। https://issues.apache.org/jira/browse/CB-330 – Wytze

उत्तर

1

क्या आपने [लॉनचेयर] [1] माना है? यह अंतर्निहित भंडारण से एक अच्छा अमूर्तता प्रदान करता है, डेटा पूछताछ, एकत्रण और पेजिंग करने के लिए प्लगइन भी हैं। क्वेरी किए जाने का एक उदाहरण के रूप में:

// basic searching 
    this.where('record.name === "brian"', 'console.log(records)') 
    this.where('record.name != ?', username, 'console.log(records)') 

    // sorting results 
    this.where('name === "brian"').asc('active', 'console.log(records)') 

केवल संभावित वापसी मैं देख सकता हूँ कि यह माइग्रेशन को संभालने के लिए प्रकट नहीं होता है और सामान्य किया जा रहा बनाने अनुक्रमित आदि

का एक तरीका है करने के लिए प्रकट नहीं होता है जुड़ने के संबंध में, इंडेक्सड डीबी को एक दस्तावेज उन्मुख (कोई एसक्यूएल) स्टोर नहीं बनाया गया है, जो एक रिलेशनल डेटाबेस नहीं है, हालांकि यह एक आम परिदृश्य है, ऐसा लगता है कि दो विकल्प हैं:

1) डेटा आइटमों पर कर्सर को फिर से घुमाएं 2) यदि उपरोक्त बहुत धीमा है, तो आप एक समर्पित कुंजी मान ऑब्जेक्ट स्टोर भी बना सकते हैं जो कि कर सकता है n प्रासंगिक स्टोर में अनुक्रमित लुकअप करने के लिए इस्तेमाल किया जाना चाहिए। आपके पास शामिल होने वाली आवश्यकताओं की संख्या के आधार पर, यह एक कोर हो सकता है।

+0

धन्यवाद @ साइडबैप मैंने इसे देखा है। ऐसा लगता है कि यह डिफ़ॉल्ट रूप से स्थानीय भंडारण का समर्थन करता है। जबकि मैं पसंद करता हूं अगर यह डिफ़ॉल्ट रूप से WebSQL करता है क्योंकि यह बहुत तेज़ है लेकिन मुझे नहीं लगता कि एडेप्टर के क्रम को बदलने का विकल्प है। WebSQL 200 सेकंड पंक्तियों को 2 सेकंड से कम में पूछ सकता है। इंडेक्सड डीबी में 15 सेकंड लगते हैं। लगभग 10,000 पंक्तियों के बाद स्थानीय भंडारण लटका हुआ है। – zuallauz

4

मेरे पास एक खुला स्रोत web database wrapper है जो इंडेक्सड डीबी और वेबस्क्ल दोनों का समर्थन करता है।

संस्करण माइग्रेशन को समझ के पीछे संभाला जाता है। संस्करण 2.

schema_ver2 = { 
    version: 2, 
    size: 2 * 1024 * 1024, // 2 MB 
    stores: [{ 
     name: 'ydn_obj', 
     keyPath: 'id.value', 
     indexes: [{ 
      name: 'age', 
      type: 'INTEGER' // type is require for WebSql 
     }] 
    }] 
} 
db = new ydn.db.Storage('db name', schema_ver2) 

Query के लिए निम्न कोड migrates (या प्रारंभ) बहुत लचीला और शक्तिशाली है।उदाहरण के लिए:

q = db.query('customer').when('age', '>=', 18 , '<', 25).where('sex', '=', 'FEMALE') 
young_girls = q.fetch(10, 2); // limit and offset 

अधिक कुशल कुंजी रेंज क्वेरी के साथ फिर से उम्र अनुक्रमणित है यदि:

q = db.query('customer', 'age').bound(18, 25, true).where('sex', '=', 'FEMALE') 

यह भी transaction समर्थन करते हैं।

p123 = db.tkey('player', 123); 
db.runInTransaction(function() { 
    p123.get().success(function(p123_obj) { 
     p123_obj.health += 10; 
     p123.put(p123_obj); 
    }); 
}, [p123]); 
3

linq2indexeddb आज़माएं। इसमें आपके द्वारा पूछे जाने वाले क्वेरी इंटरफ़ेस + indexeddb shim for websql के साथ WebSQL API भी समर्थित है।

0

मुझे लगता है कि जेएसस्टोर आपके लिए काम करेगा।

चलें आपकी क्वेरी एसक्यूएल में कुछ इस तरह दिखता कहते हैं -

चयन * TABLE_NAME से जहां स्तम्भ 1 = 'एबीसी' सीमा 20

JsStore में - यह उन सभी लोगों

var Connection = new JsStore.Instance("YourDbName"); 
Connection.select({ 
    From: "table_name" 
    Where: { 
     Column1: 'abc', 
    }, 
    Limit:20, 
    OnSuccess:function (results){ 
     console.log(results); 
    }, 
    OnError:function (error) { 
     console.log(error); 
    } 
}); 

आप तो JsStore का उपयोग कर क्वेरी की तरह एसक्यूएल लिख सकते हैं।

संबंधित मुद्दे