2012-10-31 7 views
5

मैं वर्तमान में एक आईओएस ऐप पर काम कर रहा हूं जिसमें पूर्ण टेक्स्ट खोज होगी। खोज SQLite डेटाबेस पर एक चयन कथन करके किया जाता है, लेकिन समस्या यह है कि डेटाबेस में कई मानों में स्कैंडिनेवियाई अक्षरों (Æ, Ö, Á आदि) होते हैं और मुझे हेक्स मान प्राप्त किए बिना कथन को परिवर्तित करने में समस्या हो रही है पत्रों के लिए।स्कैंडिनेवियाई अक्षरों को सुरक्षित रखने के दौरान SQLite के लिए सही ढंग से एनएसएसटींग को एन्कोड करने के लिए कैसे करें

यहाँ मैं वर्तमान में क्या कर रहा है:

const char *sql = [[NSString stringWithFormat: 
        @"SELECT %@\ 
        FROM Customer c\ 
        JOIN Customer_Metadata cm ON c.CustomerId = cm.CustomerId\ 
        WHERE cm.Name LIKE '%%%@%%'\ 
        ORDER BY cm.Name", kCustomerSelect, searchString] UTF8String]; 

अब kCustomerSelect कॉलम मैं चयन करना चाहते हैं एक निरंतर है, और searchString उपयोगकर्ता इनपुट शामिल हैं।

यह सामान्य लैटिन अक्षरों के लिए एक आकर्षण की तरह काम करता है, लेकिन अगर मैं एक खोज स्ट्रिंग के रूप में उदाहरण के साथ पास करता हूं, तो मुझे सेंट \ xc3 \ xb6 मिलता है। मुझे पता है कि यूटीएफ 8 एन्कोडेड स्ट्रिंग को लॉग आउट करने से स्ट्रिंग का सही प्रतिनिधित्व नहीं होगा, लेकिन समस्या यह है कि मेरा चयन कथन मुझे कोई परिणाम नहीं दे रहा है।

मैं क्वेरी निष्पादित करने से पहले SQLite3_open() को कॉल कर रहा हूं और SQLite दस्तावेज़ से * * डेटाबेस के लिए डिफ़ॉल्ट एन्कोडिंग UTF-8 होगा यदि sqlite3_open() या sqlite3_open_v2() को देशी में रखा जाता है और मूल में यूटीएफ -16 बाइट ऑर्डर अगर sqlite3_open16() का उपयोग किया जाता है। "*।

मैंने UTF8String को cStringUsingEncoding: के साथ बदलकर अलग-अलग एन्कोडिंग का प्रयास करके विभिन्न एन्कोडिंग का उपयोग करने का प्रयास किया है। उनमें से कोई भी काम नहीं किया है (नहीं कि मैं उन्हें उम्मीद कर रहा था, लेकिन कम से कम कोशिश करना चाहता था)।

कोई भी और सभी सहायता, या सुझावों की सराहना की जाएगी।

संपादित करें अब मैंने डेटाबेस पर एक ही चयन कथन चलाने के लिए SQLite डेटाबेस ब्राउज़र का उपयोग करने का प्रयास किया है और मुझे कोई परिणाम नहीं मिल रहा है। यह मुझे विश्वास दिलाता है कि मेरे ग्राहक_Metadata तालिका को बनाने के लिए FTS3 का उपयोग करके मेरे साथ कुछ करने का हो सकता है।

MrDresden

उत्तर

0

यदि आप एफटीएस 3 का उपयोग कर रहे हैं, तो डिफ़ॉल्ट टोकनेज़र जो भी आप चाहते हैं वह करने वाला नहीं है।

जब तक एक विशिष्ट tokenizer की आभासी सारणी FTS मेज, डिफ़ॉल्ट tokenizer, "सरल" बनाने के लिए इस्तेमाल बयान बनाएँ, प्रयोग किया जाता है भाग के रूप में निर्दिष्ट किया जाता है।सरल टोकननाइज़र निम्नलिखित नियमों के अनुसार किसी दस्तावेज़ या मूल एफटीएस पूर्ण-पाठ क्वेरी से टोकन निकालता है:

एक शब्द पात्र पात्रों का एक संक्षिप्त अनुक्रम है, जहां पात्र पात्र सभी अल्फान्यूमेरिक वर्ण हैं और यूनिकोड कोडपॉइंट मानों वाले सभी वर्ण अधिक हैं 128 के बराबर या उसके बराबर। दस्तावेजों को शब्दों में विभाजित करते समय अन्य सभी पात्रों को त्याग दिया जाता है। उनका एकमात्र योगदान आसन्न शर्तों को अलग करना है।

- http://www.sqlite.org/fts3.html#tokenizer

आप एक कस्टम tokenizer उपयोग करें, या अगर आईसीयू या unicode61 tokenizers आप के लिए काम करेंगे देखने के लिए की आवश्यकता होगी। उन लोगों के बारे में जानकारी उपर्युक्त लिंक में हैं।

+0

अफसोस की बात है, आईसीयू और यूनिकोड 61 दोनों की कोशिश करने के बाद, मुझे अभी भी परिणाम नहीं मिलते हैं। जैसा कि आप कहते हैं मुझे कस्टम टोकननाइज़र बनाने की आवश्यकता हो सकती है। – Hrafn

0

इस तरह आपकी क्वेरी लिखें:

const char *sql = [[NSString stringWithFormat: 
       @"SELECT %@\ 
       FROM Customer c\ 
       JOIN Customer_Metadata cm ON c.CustomerId = cm.CustomerId\ 
       WHERE cm.Name LIKE ?\ 
       ORDER BY cm.Name", kCustomerSelect] UTF8String]; 

के बाद आप, बयान तैयार searchString बाँध: जब तक डेटाबेस UTF-8 है

sqlite3_bind_text(statement, 1, [[NSString stringWithFormat:@"%%%@%%", searchString] UTF8String], -1, SQLITE_TRANSIENT); 

, तो आप ग्रीक, रूसी, जापानी, और निश्चित रूप से विभिन्न स्कैंडिनेवियाई पात्रों का उपयोग कर पाठ दर्ज कर सकते हैं।

संपादित करें: मैंने अभी आपका संपादन देखा है। यदि डेटा ठीक से नहीं बनाया गया था, तो यह निश्चित रूप से एक मुद्दा होगा।

+0

सहायता के लिए धन्यवाद। मैंने आपके सुझाव की कोशिश की लेकिन मुझे अभी भी "विशेष" पत्रों के परिणाम नहीं मिल रहे हैं। मैं वास्तव में सोच रहा हूं कि मुझे अपने एफटीएस 3 टेबल के लिए एक विशेष टोकनाइज़र खोजने की जरूरत है। – Hrafn

+0

बस एक साइड नोट (पल के लिए तत्काल समस्या को अनदेखा कर रहा है) - स्ट्रिंग स्वरूपों पर आपको 'sqlite_bind_xxx' का उपयोग करने का कारण यह है क्योंकि' sqlite_bind_xxx' उद्धरण वाले स्ट्रिंग मान जैसे मामलों को सही तरीके से संभालता है। एसक्यूएल इंजेक्शन हमलों को भी हल करता है। एफटीएस मुद्दे के साथ शुभकामनाएँ। – rmaddy

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

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