2012-05-29 4 views
9

यह एक अधिक डिज़ाइन प्रश्न हो सकता है, लेकिन यहां जाता है। मैं एक एंड्रॉइड ऐप लिख रहा हूं जो स्थानीय SQLite डेटाबेस (एकाधिक तालिकाओं के साथ) का उपयोग करता है जो हर समय और फिर MySQL डेटाबेस के साथ समन्वयित करता है। मैं केवल अपने डेटाबेस में संशोधित पंक्तियों को अद्यतन करना चाहता हूं। ऐसा करने के लिए, मैं प्रत्येक पंक्ति में "last_modified" कॉलम जोड़ रहा हूं जो उस पंक्ति को इंगित करता है जब उस पंक्ति को जोड़ा/अपडेट/प्रतिस्थापित/आदि किया गया था।"LastModified" फ़ील्ड को अपडेट करने के लिए SQLite ट्रिगर का उपयोग

मैं डेटाबेस संचालन के लिए नया हूं, लेकिन मैंने देखा है कि एक ट्रिगर ऐसा करने का सबसे अच्छा तरीका हो सकता है। मेरे पास ट्रिगर, SQLite, और एंड्रॉइड से संबंधित कुछ प्रश्न हैं।

मैंने यह लिंक पढ़ा है: on update current_timestamp with SQLite यह मूल रूप से कहता है कि मैं सही दृष्टिकोण का उपयोग कर रहा हूं। मेरे प्रश्न हैं:

  1. मुझे db.execSQL("CREATE TRIGGER...") कथन कहां रखा जाना चाहिए? टेबल बनाने से पहले या बाद में?
  2. क्या मैं अपने डेटाबेस में प्रत्येक तालिका के लिए एक ही ट्रिगर का उपयोग कर सकता हूं? यानी, ट्रिगर स्वचालित रूप से पता लगा सकता है कि कौन सी तालिका और पंक्ति अपडेट/डाली/प्रतिस्थापित/आदि जा रही है। और उस पंक्ति के "last_modified" फ़ील्ड को सेट करने के लिए अधिसूचित करें, या क्या मुझे प्रत्येक तालिका के लिए एक अलग ट्रिगर बनाना है?
  3. चूंकि मैं डेटाबेस संचालन के लिए काफी नया हूं, क्या आप एंड्रॉइड ट्रिगर स्टेटमेंट प्रदान कर सकते हैं जो उपर्युक्त व्यवहार करता है, या उदाहरण के लिए संसाधन प्रदान करता है?

या यदि ट्रिगर्स एक बुरा विचार है, तो क्या कोई बेहतर विकल्प हैं?

धन्यवाद।

उत्तर

25

आप के लिए एक छोटा और प्रभावी जवाब:

  1. के बाद, तो ट्रिगर संदर्भ के लिए एक वैध टेबल है।
  2. आपको प्रभावित होने वाली प्रत्येक तालिका/कॉलम संयोजन के लिए CREATE TRIGGER निष्पादित करने की आवश्यकता है। डेटाबेस मानता है क्योंकि किसी अन्य तालिका में last_modified कॉलम है जो आप चाहते हैं कि यह वही व्यवहार करे ...
  3. आपके लिंक में ट्रिगर निष्पादन योग्य है (मैंने इसे स्वयं उपयोग किया है), बस तालिका/कॉलम बदलें नाम।

अन्त में, इस तरह एक ट्रिगर का उपयोग सबसे आसान तरीका मुझे पता है बनाए रखने के लिए last_modified या last_accessed टाइमस्टैम्प है।

मेरे ट्रिगर (जावा रूप में):

private static final String UPDATE_TIME_TRIGGER = 
    "CREATE TRIGGER update_time_trigger" + 
    " AFTER UPDATE ON " + TABLE_NAME + " FOR EACH ROW" + 
    " BEGIN " + 
     "UPDATE " + TABLE_NAME + 
     " SET " + TIME + " = current_timestamp" + 
     " WHERE " + ID + " = old." + ID + ";" + 
    " END"; 

अलावा

SQLite website आप कार्रवाई के प्रत्येक प्रकार के लिए एक ट्रिगर बनाने की आवश्यकता के अनुसार।दूसरे शब्दों में, आप नहीं कर सकते उपयोग:

CREATE TRIGGER trigger_name 
    AFTER UPDATE, INSERT ... 

अपने अंतिम टिप्पणी आप सबसे अच्छा तरीका हमारे उद्देश्य के लिए एक सम्मिलित बयान को संभालने के लिए पता लगा हो सकता है से:

CREATE TABLE foo (
    _id INTEGER PRIMARY KEY, 
    last_modified TIMESTAMP NOT NULL DEFAULT current_timstamp); 

इस तालिका में, आपको एक INSERT कथन के लिए टाइमस्टैंप ट्रिगर बनाने की आवश्यकता नहीं है, क्योंकि यह पहले से ही किया जा चुका है। (मजेदार तथ्य: INTEGER PRIMARY KEY अंतर्निहित AUTOINCREMENT NOT NULL के साथ-साथ हमारे _id कॉलम के लिए डिफ़ॉल्ट वृद्धिशील मान जोड़ता है।)

+0

शानदार लग रहा है! धन्यवाद। तो आपके उदाहरण में, "TIME" आपका "last_modified" फ़ील्ड है, और "आईडी" प्रत्येक पंक्ति के लिए केवल प्राथमिक_आईडी फ़ील्ड है? – jmhend

+0

एक और सवाल। क्या अद्यतन करने और INSERTING दोनों पर एक ही ट्रिगर समर्थन ट्रिगर करने का कोई तरीका है? – jmhend

+1

या INSERTING के लिए ट्रिगर होने की बजाय, "last_modified" के लिए केवल DEFAULT मान होने पर CURRENT_TIMESTAMP हो, आह? – jmhend

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