2017-06-11 11 views
5

मैं एंड्रॉइड आर्किटेक्चर घटक से एंड्रॉइड की रूम पर्सिस्टेंस लाइब्रेरी का उपयोग कर रहा हूं हाल ही में Google I/O पर घोषित किया गया। चीजें काम करने लगते हैं, लेकिन मैं निम्नलिखित त्रुटि हो रही है: Note, Tag, और JoinNotesTags:विदेशी कक्ष में कॉलम के बारे में एंड्रॉइड रूम संकलन-समय चेतावनी एक सूचकांक का हिस्सा नहीं है। इसका क्या मतलब है?

Warning:tagId column references a foreign key but it is not part of an index. This may trigger full table scans whenever parent table is modified so you are highly advised to create an index that covers this column.

मेरे डेटाबेस 3 टेबल है। टैग्स के लिए नोट्स मैपिंग को संभालने के लिए कई से अधिक रिश्ते हैं, इसलिए JoinNotesTags तालिका। टेबल स्पष्ट हैं:

  • Note.id और Tag.id दोनों प्राथमिक कुंजी
  • JoinNotesTags.noteId संदर्भ Note.id
  • JoinNotesTags.tagId संदर्भ Tag.id

विदेशी कुंजी की कमी JoinNotesTags मेज पर परिभाषित कर रहे हैं कर रहे हैं।

"CREATE TABLE IF NOT EXISTS `JoinNotesTags` (
    `id` INTEGER PRIMARY KEY AUTOINCREMENT, 
    `noteId` INTEGER, 
    `tagId` INTEGER, 
    FOREIGN KEY(`noteId`) REFERENCES `Note`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , 
    FOREIGN KEY(`tagId`) REFERENCES `Tag`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION 
)" 

यहाँ और उस वर्ग के लिए इसी @Entity एनोटेशन है: संदर्भ के लिए, JoinNotesTags तालिका के लिए CREATE TABLE बयान है

@Entity(
     indices = arrayOf(Index(value = *arrayOf("noteId", "tagId"), unique = true)), 
     foreignKeys = arrayOf(
       ForeignKey(
         entity = Note::class, 
         parentColumns = arrayOf("id"), 
         childColumns = arrayOf("noteId"), 
         onDelete = ForeignKey.CASCADE), 
       ForeignKey(
         entity = Tag::class, 
         parentColumns = arrayOf("id"), 
         childColumns = arrayOf("tagId")) 
     ) 
) 

आप @Entity टिप्पणी से देख सकते हैं, tagIdहैnoteId के साथ एक समग्र अद्वितीय अनुक्रमणिका में शामिल है। मैंने पुष्टि की है कि इस सूचकांक को सही ढंग से और साथ ही स्वत: जनरेट json स्कीमा फ़ाइल में परिभाषित किया गया है:

"CREATE UNIQUE INDEX `index_JoinNotesTags_noteId_tagId` 
    ON `JoinNotesTags` (`noteId`, `tagId`)" 

तो, मेरे सवाल: इस चेतावनी (अभी भी अल्फा जारी) में सिर्फ एक बग कक्ष पुस्तकालय है - यानी संकलन-समय विश्लेषण इस तथ्य को याद कर रहा है कि tagId इस समग्र अनुक्रमणिका का हिस्सा है? या क्या मेरे पास वास्तव में एक अनुक्रमण समस्या है जिसे मुझे पूर्ण तालिका स्कैन से बचने के लिए हल करने की आवश्यकता है?

+0

हमें आपकी _table_ परिभाषाएं, आपके जावा कोड को नहीं देखना चाहिए। विशेष रूप से, मेरा मानना ​​है कि त्रुटि यह नहीं है कि 'tagId' कॉलम में कोई अनुक्रमणिका नहीं है, लेकिन यह एक विदेशी कुंजी को संदर्भित करता है जो अनुक्रमित नहीं है। –

+0

@TimBiegeleisen, प्रश्न 'JoinNotesTags' के लिए तालिका परिभाषा को शामिल करने के लिए अपडेट किया गया। लेकिन रिकॉर्ड के लिए, 'टैग.आईडी' एक प्राथमिक कुंजी है। इसके अलावा, चेतावनी का कहना है कि यह मुद्दा 'tagId' कॉलम के साथ है - मूल तालिका में कॉलम नहीं जो संदर्भित करता है (' टैग.आईडी')। – mikejonesguy

उत्तर

5

जब आप Tag तालिका को संशोधित करते हैं, तो डेटाबेस को JoinNotesTags तालिका में संबंधित पंक्तियों को देखने की आवश्यकता हो सकती है। कुशल होने के लिए, requires an indextagId कॉलम पर।

आपकी समग्र अनुक्रमणिका उस के लिए उपयोगी नहीं है; way how indexes work की वजह से, खोजी जाने वाली कॉलम इंडेक्स में बाएं कॉलम (ओं) होना चाहिए।

आपको केवल tagId कॉलम पर एक अनुक्रमणिका जोड़नी चाहिए। (आप समग्र अनुक्रमणिका में कॉलम के क्रम को स्वैप कर सकते हैं, लेकिन फिर आपको noteId के साथ एक ही समस्या होगी।)

+4

क्या आप एक नमूना चित्र जोड़ सकते हैं – Idee

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