दिलचस्प पोस्ट
माउसओवर पर, कैनवास से पिक्सेल रंग प्राप्त करें सेवा बनाम फैक्टरी के बारे में उलझनें एम्बेडेड एसवीजी के लिए एक शैली कैसे लागू करें? क्यों एक अज्ञात समारोह को परिभाषित करते हैं और इसे तर्क के रूप में jQuery पास करते हैं? PHP में खाली मान से डिफ़ॉल्ट ऑब्जेक्ट का निर्माण करना है? जब एक 'धुंधला' घटना होती है, तो मैं यह कैसे पता लगा सकता हूँ कि कौन सा तत्व फोकस * * पर गया? जावा में BigDecimal का वर्गमूल यूआरएल एन्कोडिंग स्पेस वर्ण: + या% 20? क्या एक पायथन डिक्शनरी हैश तालिका का उदाहरण है? क्लोन / गहरी प्रतिलिपि करने के लिए सबसे अच्छा तरीका क्या है। नेट जेनेरिक शब्दकोश <string, T>? सी #: चलाने की प्रक्रिया का पूरा रास्ता कैसे प्राप्त करें? LINQ के साथ वर्ग की संपत्ति द्वारा अलग मैं PHP के साथ एक JSON फ़ाइल को कैसे पार्स कर सकता हूं? क्यों जीसीसी के साथ x 86 पर पूर्णांक बह निकला एक अनंत लूप पैदा करता है? कई प्रकार के उत्पाद के लिए एक उत्पाद तालिका कैसे डिज़ाइन करें, जहां प्रत्येक उत्पाद के कई पैरामीटर हैं

एंड्रॉइड कॉलम '_id' मौजूद नहीं है?

मुझे नोटपैड उदाहरण में काम करने वाली किसी चीज के साथ परेशानी हो रही है। नोटपैड कोडोड / नोटपैडवि 1 सोल्यूशन से यहां कोड है:

String[] from = new String[] { NotesDbAdapter.KEY_TITLE }; int[] to = new int[] { R.id.text1 }; SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to); 

यह कोड ठीक काम करने लगता है लेकिन सिर्फ स्पष्ट होने के लिए, मैं एडीबी उपयोगिता चला रहा था और SQLite 3 चलाता हूं। मैं इस प्रकार स्कीमा का निरीक्षण किया:

sqlite> .checkma

 CREATE TABLE android_metadata (locale TEXT); CREATE TABLE notes (_id integer primary key autoincrement, title text not null, body text not null); 

सभी मुझे अच्छा लगता है


अब मेरे आवेदन पर, जो, जहां तक ​​मैं देख सकता हूं, मूल रूप से कुछ मामूली परिवर्तनों के साथ ही है। मैंने अपने कोड को सरल और सरलीकृत किया है, लेकिन समस्या बनी रहती है

 String[] from = new String[] { "x" }; int[] to = new int[] { R.id.x }; SimpleCursorAdapter adapter = null; try { adapter = new SimpleCursorAdapter(this, R.layout.circle_row, cursor, from, to); } catch (RuntimeException e) { Log.e("Circle", e.toString(), e); } 

जब मैं अपना आवेदन चलाता हूं, तो मुझे एक Log.e() और LogCat में निम्न प्रिंट मेरे Log.e() कथन से मिलता है:

लॉगकैट संदेश:

java.lang.IllegalArgumentException: स्तंभ '_id' मौजूद नहीं है

इसलिए, स्कीमा के बारे में क्या अलग है यह देखने के लिए वापस SQLite 3 पर जाएं:

sqlite> .checkma तालिका एंड्रॉइड_मैटडाटा (लोकेल पाठ) बनाएँ; टेबल मंडलियां बनाएं (_id पूर्णांक प्राथमिक कुंजी autoincrement, अनुक्रम पूर्णांक, त्रिज्या वास्तविक, x वास्तविक, y वास्तविक);

मुझे नहीं लगता कि मैं '_id' कैसे याद कर रहा हूं

मैंने क्या गल्त किया है?

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

वेब के समाधान से एकत्रित समाधान "एंड्रॉइड कॉलम '_id' मौजूद नहीं है?"

मैं देखता हूं, कर्सर एडाप्टर का दस्तावेज़ीकरण कहता है:

कर्सर में _id नामक स्तंभ शामिल होना चाहिए या यह वर्ग काम नहीं करेगा।

SimpleCursorAdapter एक व्युत्पन्न वर्ग है, इसलिए ऐसा लगता है कि यह कथन लागू होता है। हालांकि, यह वक्तव्य तकनीकी रूप से गलत है और कुछ नौसिखियों में भ्रामक है। कर्सर के लिए निर्धारित परिणाम में _id होना चाहिए, कर्सर को स्वयं नहीं।
मुझे यकीन है कि यह डीबीए के लिए स्पष्ट है क्योंकि इस प्रकार के लघुकोड दस्तावेज उनके लिए स्पष्ट हैं, लेकिन उन नए लोगों के लिए, जो बयान में अधूरे हैं, भ्रम का कारण बनता है। कर्सर हेरेटर या पॉइंटर्स की तरह होते हैं, इसमें डेटा ट्रांसस्वरिंग के लिए कोई तंत्र नहीं होता है, लेकिन इसमें कोई स्तंभ नहीं होता है

लोडर्स प्रलेखन में एक उदाहरण है जहां यह देखा जा सकता है कि _id प्रक्षेपण पैरामीटर में शामिल है।

 static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS, Contacts.CONTACT_PRESENCE, Contacts.PHOTO_ID, Contacts.LOOKUP_KEY, }; public Loader<Cursor> onCreateLoader(int id, Bundle args) { // ... return new CursorLoader(getActivity(), baseUri, CONTACTS_SUMMARY_PROJECTION, select, null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); } 

इसका उत्तर दिया गया है और मैं इसे और अधिक व्यापक बनाना चाहता हूं।

SimpleCursorAdapter के लिए आवश्यक है कि कर्सर के परिणाम सेट में "_id" नामक एक कॉलम शामिल होना चाहिए स्कीमा बदलने के लिए जल्दबाजी न करें यदि आपने अपनी तालिका में "_id" कॉलम को परिभाषित नहीं किया है प्रत्येक तालिका के लिए "पंक्तिबद्ध" नामक एक छिपी हुई कॉलम को स्वचालित रूप से SQLite जोड़ा गया आपको केवल यह करने की ज़रूरत है कि केवल स्पष्ट रूप से चुनें और इसे '_id' Ex के रूप में उपनाम दें

 SQLiteDatabase db = mHelper.getReadableDatabase(); Cursor cur = db.rawQuery( "select rowid _id,* from your_table", null); 

टिम वू कोड वास्तव में काम करता है …

यदि आप db.query प्रयोग कर रहे हैं, तो यह इस तरह होगा …

 db.query(TABLE_USER, new String[] { "rowid _id", FIELD_USERNAME, }, FIELD_USERNAME + "=" + name, null, null, null, null); 

इस त्रुटि के साथ मेरी समस्या का हल क्या था कि मैंने अपने डीबी क्वेरी में _id कॉलम को शामिल नहीं किया था जोड़ने कि मेरी समस्या हल

यह संभवतः अब प्रासंगिक नहीं है, लेकिन मैं आज ही एक ही समस्या को मारता हूं। कॉलम के नाम निकलते हैं केस संवेदी। मेरे पास एक _ID कॉलम था, लेकिन एंड्रॉइड को एक _id कॉलम की उम्मीद है

हां, मैं इस समस्या को ठीक करने के लिए SELECT स्ट्रिंग क्वेरी को भी बदलता हूं।

 String query = "SELECT t.*,t.id as _id FROM table t "; 

यदि आप SQL पर दस्तावेज़ पढ़ते हैं, तो INTEGER प्राथमिक कुंजी के किसी भी कॉलम को आंतरिक रूप से ROWID नाम दिया जाएगा, इसलिए प्रत्येक SELECT में किसी अन्य नाम को जोड़ने की समस्या नहीं है, किसी भी सामान्य उपयोगिताओं से विचलित करना, जो कुछ का लाभ ले सकते हैं तालिका को परिभाषित करने वाले स्तंभों का एक गणन

http://www.sqlite.org/autoinc.html

इसका उपयोग एयूटीइन्क्रैमेंट विकल्प के बजाय ROWID के रूप में करने के लिए अधिक सरल है जो कि _ID के कारण RIDID से विचलित हो सकता है _ID को ROWID के द्वारा टाइप करके इसका मतलब है कि प्राथमिक कुंजी को insert / insertOrThrow से लौटा दिया गया है; अगर आप एक ContentProvider लिख रहे हैं तो आप लौटे उरी में इस कुंजी का उपयोग कर सकते हैं

टेबल में एक _id कॉलम की कमी से निपटने का एक अन्य तरीका है कर्सरड्राफर का उपवर्ग जो कि यदि आवश्यक हो तो _id कॉलम जोड़ता है।

तालिकाओं या प्रश्नों में किसी भी परिवर्तन की आवश्यकता नहीं होने का इसका लाभ है।

मैंने इस तरह के एक वर्ग को लिखा है, और यदि यह कोई रुचि है तो इसे https://github.com/cmgharris/WithIdCursorWrapper पर मिल सकता है