2011-04-02 11 views
22

के साथ SQLite क्या किसी भी तरह से एंड्रॉइड फोन पर सी ++ के साथ SQLite का उपयोग करना संभव है? मुझे कोई दस्तावेज नहीं मिला है कि यह कैसे संभव हो सकता है।एंड्रॉइड एनडीके

+1

http://code.google.com/p/sqlite-ndk/ - यह छोटा सा उदाहरण कैसे SQLite उपयोग करने के लिए भी शामिल है, लेकिन यह भी sqlite3ndk आप 'संपत्ति' (2.3+) निर्देशिका में संग्रहीत डेटाबेस के लिए पहुँच देता है। आप पाठ्यक्रम SQLite से सीधे SQLite का उपयोग कर सकते हैं क्योंकि स्रोतों में कोई बदलाव नहीं आया है। – kibab

उत्तर

13

एनडीके के माध्यम से अंतर्निहित SQLite का उपयोग करना संभव नहीं है (या जब मैंने इसे देखा तो छह महीने पहले नहीं था), जिसे केवल जावा के साथ एक्सेस किया जा सकता है। हालांकि SQLite के अपने स्वयं के पूरी तरह से अलग C++ निर्माण में लिंक करना संभव हो सकता है।

+7

न केवल "मई" यह काम करता है लेकिन यह करता है। मैंने बस अपनी परियोजना में "sqlite.c" जोड़ा: इसमें संपूर्ण डेटाबेस –

+2

@bitbox शामिल है: मुझे इस समाधान से रूचि है, क्या आप इससे निपटने के तरीके के बारे में अधिक जानकारी दे सकते हैं? –

1

अस्वीकरण: मैंने केवल इस विधि का उपयोग स्टैंडअलोन एक्जिक्यूटिव के लिए किया है, न कि पुस्तकालय जो जेएनआई कार्यों को लागू करते हैं। यह एक .so या नहीं के लिए काम कर सकता है। इसके अलावा, मैं एक कस्टम एंड्रॉइड डिवाइस के साथ काम नहीं कर रहा हूं।

आप एनडीके के माध्यम से निर्मित SQLite का उपयोग कर सकते हैं लेकिन यह समर्थित कुछ की तुलना में हैक का अधिक है। आपको एक एंड्रॉइड स्रोत वितरण से sqlite3.h और libsqlite.so को रिक्त करने और उनका उपयोग करके संकलित करने की आवश्यकता है। अपनी एप्लिकेशन स्रोत निर्देशिका में sqlite3.h डालें और आपको समाप्त होने के लिए लिंकिंग चरण के लिए कहीं भी बाहर/yourapp निर्देशिका या बिल्ड/प्लेटफ़ॉर्म/एंड्रॉइड-एक्स/आर्क-आर्म/usr/lib के तहत .so को रखना होगा। मेरे पास यह दोनों जगहों पर है लेकिन मुझे यकीन नहीं है कि वास्तव में किसकी आवश्यकता है।

आप libsqlite से लिंक करना समाप्त कर देंगे। इसलिए आपने प्रदान किया है लेकिन बाइनरी सिस्टम libsqlite.so को एक लक्ष्य डिवाइस पर ठीक से चलाएगा।

43

बस से SQLite3 समामेलन स्रोत फ़ाइल डाउनलोड: http://www.sqlite.org/download.html

और फिर Android.mk में अपने LOCAL_SRC_FILES चर को sqlite3.c जोड़ें।

+1

सरल लेकिन सटीक उत्तर। धन्यवाद! –

+0

हाय गैबर, मैं बस अपने एंड्रॉइड ऐप में sqlite3 लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं। मैंने अपनी परियोजना में मेरे jni फ़ोल्डर में sqlite3.c और sqlite3.h आयात किया। मुझे आगे क्या करना चाहिये? – idish

+1

वाह 140 400+ लाइनें, सी इसके सर्वोत्तम – user457015

3

SQLite एंड्रॉइड बाइंडिंग http://www.sqlite.org/android/doc/trunk/www/index.wiki देखें जो एंड्रॉइड लक्ष्य 15 (4.0.3) और अधिक के लिए sqlite3 को शामिल करने का वर्णन करता है। यह नीचे कॉपी किया गया है।

SQLite एंड्रॉयड बाइंडिंग

SQLite पुस्तकालय एंड्रॉयड पर्यावरण का अभिन्न हिस्सा है। जावा एप्लिकेशन और सामग्री प्रदाता Android.database.sqlite नामस्थान में इंटरफ़ेस का उपयोग करके SQLite तक पहुंचते हैं। एंड्रॉयड के अंतर्निहित SQLite समर्थन का उपयोग करने का

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

इस परियोजना में कोड की अनुमति देता है एंड्रॉयड NDK उपयोग करने के लिए SQLite के एक कस्टम संस्करण बनाने के लिए एक आवेदन पत्र आवेदन साथ भेज दिया अभी भी मानक जावा इंटरफेस का उपयोग करने में बरकरार रखते हुए।

सामान्य उपयोग

स्थापना

Android API लेवल 15 (एंड्रॉयड 4.0.3) और अधिक से अधिक समर्थित हैं। यदि लक्ष्यीकरण API स्तर 16 या इससे अधिक है, तो इस प्रोजेक्ट को की डिफ़ॉल्ट "ट्रंक" शाखा का उपयोग करें। या, एपीआई स्तर 15 के लिए, "एपीआई-लेवल -15" शाखा का उपयोग करें। यह 15 से कम एपीआई स्तर को लक्षित करना संभव नहीं है।

इस प्रोजेक्ट से निम्न फ़ाइलों को एप्लिकेशन प्रोजेक्ट में समतुल्य स्थानों में कॉपी करें।

jni/Android.mk 
jni/Application.mk 
jni/sqlite/*    (copy contents of directory recursively) 
src/org/sqlite/database/* (copy contents of directory recursively) 

इसके बाद, निर्देशिका संरचनाओं में इन फ़ाइलों को शामिल होना चाहिए।

src/org/sqlite/os/*   (copy contents of directory recursively) 

निर्देशिका "JNI/SQLite /" sqlite3.h और sqlite3.c स्रोत फ़ाइलों की प्रतियां शामिल हैं:

एपीआई स्तर 15 के लिए केवल, भी निम्न कॉपी। उनके बीच, उनमें SQLite लाइब्रेरी के लिए स्रोत कोड शामिल है। यदि आवश्यक हो, तो SQLite आवश्यक विशिष्ट संस्करण के लिए स्रोत के साथ इन्हें प्रतिस्थापित करें। यदि SQLite किसी भी विशेष प्री-प्रोसेसर मैक्रोज़ के साथ संकलित किया गया है, तो उन्हें "jni/sqlite/Android.mk" फ़ाइल (jni/Android.mk नहीं) में जोड़ें।

एक बार परियोजना में फ़ाइलों को जोड़ा गया है, तो परियोजना की मूल निर्देशिका में "ndk-build" आदेश चलाएं। यह जेएनई/निर्देशिका में कस्टम कोड (कस्टम SQLite संस्करण सहित) को साझा पुस्तकालयों में संकलित करता है जो एप्लिकेशन के साथ के साथ डिवाइस पर तैनात किए जाएंगे। मान लें कि यह सफल है, जब तक आप स्रोत या जेनी/निर्देशिका संरचना के भीतर मेकफ़ाइल संशोधित नहीं करते हैं, तो आपको को फिर से "ndk-build" चलाने की आवश्यकता नहीं है।

एप्लीकेशन प्रोग्रामिंग

क्लासेस में निर्मित एंड्रॉयड SQLite इंटरफेस रहते "android.database.sqlite" नाम स्थान में बनाते हैं। यह इंटरफेस "org.sqlite.database.sqlite" नामस्थान के अलावा, सभी समान वर्गों को प्रदान करता है। इसका अर्थ यह है कि SQLite के कस्टम संस्करण का उपयोग करने के लिए एप्लिकेशन को संशोधित करने के लिए, आमतौर पर की सभी चीजों को "org.sqlite.database.sqlite" स्रोत स्रोत के भीतर सभी घटनाओं "android.database.sqlite" को प्रतिस्थापित करना है।

उदाहरण के लिए, निम्नलिखित:

import android.database.sqlite.SQLiteDatabase;

साथ प्रतिस्थापित किया जाना चाहिए:

import org.sqlite.database.sqlite.SQLiteDatabase;

साथ ही android.database.sqlite में कक्षाओं के सभी उपयोगों की जगह।

android.database.SQLException
android.database.DatabaseErrorHandler

एक तरफ नाम स्थान परिवर्तन से

, वहाँ:

org.sqlite.database.SQLException
org.sqlite.database.DatabaseErrorHandler

बजाय

: * नाम स्थान, आवेदन भी निम्न दो का उपयोग सुनिश्चित किया जाना चाहिएस्टॉक एंड्रॉइड इंटरफ़ेस से अन्य अंतर हैंअनुप्रयोगों के बारे में पता होना चाहिए:

SQLiteStatement.simpleQueryForBlobFileDescriptor() API उपलब्ध नहीं है। संयोजन क्रम "यूनिकोड" उपलब्ध नहीं है। संयोजन क्रम "LOCALIZED", जो आमतौर पर सिस्टम के वर्तमान लोकेल के साथ बदलता है, हमेशा SQL12 के संयोजन बिनरी में निर्मित के बराबर होता है।

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