2010-11-13 14 views
5

मैं एंड्रॉइड और उसके डेटाबेस एपीआई से परिचित होने की कोशिश कर रहा हूं। मैं एक वर्ग कि SQLiteOpenHelper से विरासत बना लिया है और इस मैं कैसे डेटाबेसSQLiteDatabase.insertOrThrow फेंक नहीं है लेकिन डेटा डाला नहीं गया है

@Override 
public void onCreate(SQLiteDatabase db) { 

    try { 
     db.execSQL("CREATE TABLE " + FUELS_TABLE_NAME + " (" 
       + "_ID INTEGER PRIMARY KEY AUTOINCREMENT, " 
       + "DATE_OF_FUELS DATE DEFAULT CURRENT_TIME," 
       + "SELLER_POSITION TEXT DEFAULT 'unknown'," 
       + "AMOUNT REAL" 
       + ");" 
     ); 
    } catch (SQLException e) { 
     Log.e(DATABASE_NAME, e.toString()); 
    } 
} 

डीबी के लिए डेटा जोड़ने के लिए इस्तेमाल किया समारोह में तालिका बनाने है भीतर implemeneted निम्नलिखित एक ही कक्षा

है
public void addNewFuel(float amount) { 

    // Create the content to insert into the database 
    ContentValues newEntry = new ContentValues(); 
    newEntry.put("amount", amount); 

    // Get database handler 
    try { 
     db = getWritableDatabase(); 
    } catch (SQLException e) { 
     Log.e(DATABASE_NAME, e.toString()); 
     return; 
    } 

    // Begin transaction and insert data 
    long returnedValue; 
    db.beginTransaction(); 
    try { 
     returnedValue = db.insertOrThrow(FUELS_TABLE_NAME, null, newEntry); 
     Log.v(DATABASE_NAME, "return value " + returnedValue); 
    } catch (SQLException e) { 
     Log.e(DATABASE_NAME, e.toString()); 
    } finally { 
     db.endTransaction(); 
    } 

    db.close(); 
} 

लेकिन स्पष्ट रूप से कोई डेटा नहीं जोड़ा गया है। रिटर्न वैल्यू हमेशा होता है 1. विधि फेंक नहीं देती है, और जब मैं डीबी को एडीबी के साथ खींचता हूं और इसकी सामग्री को पूरी तरह खाली करता हूं।

मैं समझ नहीं पा रहा हूं कि मैं क्या खो रहा हूं।

किसी भी सुझाव की सराहना की जाएगी।

धन्यवाद, एस

उत्तर

-3

benritz के देखें सही समाधान के लिए इस सवाल का जवाब। यह उत्तर गलत है, लेकिन दुर्भाग्य से मैं इसे हटाने में सक्षम नहीं हूं क्योंकि यह एक स्वीकृत पोस्ट है।

/******* सही नहीं !!

चूंकि आप SQLiteOpenHelper से विरासत में हैं, इसलिए getWritableDatabase() पर आपका कॉल पहले से ही एक डीबी लेनदेन शुरू करता है। SQLiteOpenHelper API से:

लेन-देन के लिए सुनिश्चित डेटाबेस एक समझदार राज्य में हमेशा होता है बनाने के लिए उपयोग किया जाता है।

इस प्रकार आप db.beginTransaction() और db.endTransaction() कॉल करने के लिए की जरूरत नहीं है। उन बाहरी लेनदेन कॉल आपके आवेषण को गड़बड़ कर रहे हैं। मैंने अपने प्रोजेक्ट में एक ही परिदृश्य को प्लग किया और पाया कि वही इंडेक्स (मेरे मामले में 6), उन लेनदेन विधियों का उपयोग करते समय वापस कर दिया गया था। जब मैं कॉल हटा देता हूं तो मुझे वांछित परिणाम मिलते हैं (एकाधिक रिकॉर्ड डाले जाते हैं)।

सही नहीं !! *******/

+1

आपको बहुत बहुत धन्यवाद। अब यह काम कर रहा है। मैं वास्तव में सोच रहा हूं कि कॉल गड़बड़ कैसे करता है, और क्यों सम्मिलित नहीं होता है। वैसे भी, बहुत बहुत धन्यवाद! – emitrax

+0

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

+5

यह वास्तव में अजीब है! SQLiteOpenHelper के लिए स्रोत कोड निश्चित रूप से डेटाबेस निर्माण और अद्यतन को छोड़कर किसी भी लेनदेन को नहीं खोलता है। तो getWriteableDatabase() कॉल रिटर्न के बाद, डेटाबेस के लिए कोई लेनदेन सक्रिय नहीं है! या तो कुछ वास्तव में खराब है, या यह जवाब फर्जी है। – Nakedible

29

मैकस्ट्रेच का जवाब गलत है। getWritableDatabase() आपके कोड के लिए कोई लेनदेन नहीं बनाता है, दस्तावेज़ों की उद्धृत रेखा ऑनक्रेट और ऑन अपग्रेड विधियों के लिए उपयोग किए जाने वाले लेन-देन का जिक्र करती है जिसका अर्थ है कि आपको उन विधियों में लेनदेन कोड जोड़ने की आवश्यकता नहीं है। आपको अभी भी किसी भी अन्य विधि के लिए लेनदेन कोड जोड़ने की आवश्यकता है जिसके लिए लेनदेन की आवश्यकता है।

emitrax का कोड db.setTransactionSuccessful() के रूप में सही ढंग से काम नहीं कर रहा है जिसका अर्थ है कि लेनदेन db.endTransaction() द्वारा रोलबैक किया जाएगा।

+1

वैसे यह बहुत अधिक समझ में आता है – Bilthon

+0

स्पष्ट रूप से, यह सही जवाब है, मैकस्ट्रेच की नहीं। – lilbyrdie

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