2012-10-04 20 views
7

मुझे डेटाबेस में सभी थोक प्रविष्टि के बाद केवल एक ही अधिसूचना चाहिए। कृपया bulkInsert() फ़ंक्शन का उपयोग करने के लिए एक उदाहरण प्रदान करें। मुझे इंटरनेट पर एक उचित उदाहरण नहीं मिल रहा है। कृपया सहायता कीजिए!!!!एंड्रॉइड में bulkInsert() फ़ंक्शन का उपयोग कैसे करें?

उत्तर

37

यह सामग्री प्रदाता का उपयोग करके थोक है।

public int bulkInsert(Uri uri, ContentValues[] values){ 
    int numInserted = 0; 
    String table; 

    int uriType = sURIMatcher.match(uri); 

    switch (uriType) { 
    case PEOPLE: 
     table = TABLE_PEOPLE; 
     break; 
    } 
    SQLiteDatabase sqlDB = database.getWritableDatabase(); 
    sqlDB.beginTransaction(); 
    try { 
     for (ContentValues cv : values) { 
      long newID = sqlDB.insertOrThrow(table, null, cv); 
      if (newID <= 0) { 
       throw new SQLException("Failed to insert row into " + uri); 
      } 
     } 
     sqlDB.setTransactionSuccessful(); 
     getContext().getContentResolver().notifyChange(uri, null); 
     numInserted = values.length; 
    } finally {   
     sqlDB.endTransaction(); 
    } 
    return numInserted; 
} 

इसे केवल एक बार कॉल करें जब आपके पास ContentValues ​​[] मान सरणी में अधिक सामग्रीवृत्त होंगे।

+0

यह * शेष * विफल होने पर शेष प्रविष्टियों को समाप्त नहीं करेगा *? – Anthony

+0

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

+0

मुझे एक त्रुटि मिली है कि 'वेरिएबल' टेबल 'प्रारंभ नहीं किया जा सकता है'। घोषणा को 'स्ट्रिंग टेबल = "" पर सेट करना; "समस्या हल हो गई। –

3

मैंने गतिविधि पक्ष और सामग्री प्रदाता पक्ष पर इसे लागू करने के लिए हमेशा एक ट्यूटोरियल खोजने के लिए खोज की। मैंने ऊपर से "वारलॉक" का जवाब दिया और यह सामग्री प्रदाता पक्ष पर बहुत अच्छा काम किया। गतिविधि गतिविधि पर ContentValues ​​सरणी तैयार करने के लिए मैंने this post से उत्तर का उपयोग किया। मैंने अल्पविराम से अलग मूल्यों (या नई लाइनों, अवधि, अर्ध कोलन) की एक स्ट्रिंग से प्राप्त करने के लिए अपने ContentValues ​​को भी संशोधित किया। जो इस तरह देखा:

ContentValues[] bulkToInsert; 
    List<ContentValues>mValueList = new ArrayList<ContentValues>(); 

    String regexp = "[,;.\\n]+"; // delimiters without space or tab 
    //String regexp = "[\\s,;.\\n\\t]+"; // delimiters with space and tab 
    List<String> splitStrings = Arrays.asList(stringToSplit.split(regexp)); 

    for (String temp : splitStrings) { 
     Log.d("current student name being put: ", temp); 
     ContentValues mNewValues = new ContentValues(); 
     mNewValues.put(Contract.KEY_STUDENT_NAME, temp); 
     mNewValues.put(Contract.KEY_GROUP_ID, group_id); 
     mValueList.add(mNewValues); 
    } 
    bulkToInsert = new ContentValues[mValueList.size()]; 
    mValueList.toArray(bulkToInsert); 
    getActivity().getContentResolver().bulkInsert(Contract.STUDENTS_CONTENT_URI, bulkToInsert); 

मैं bulkInsert के लिए ContentValues ​​सरणी के लिए सीधे चित्रित विभाजन स्ट्रिंग संलग्न करने के लिए एक क्लीनर रास्ता नहीं मिल सका। लेकिन जब तक मुझे यह पता नहीं चलता तब तक यह कार्य करता है।

0

इस दृष्टिकोण को आजमाएं।

public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) { 
    final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 

    switch (sUriMatcher.match(uri)) { 

     case CODE_WEATHER: 
      db.beginTransaction(); 
      int rowsInserted = 0; 
      try { 
       for (ContentValues value : values) { 


        long _id = db.insert(WeatherContract.WeatherEntry.TABLE_NAME, null, value); 
        if (_id != -1) { 
         rowsInserted++; 
        } 
       } 
       db.setTransactionSuccessful(); 
      } finally { 
       db.endTransaction(); 
      } 

      if (rowsInserted > 0) { 
       getContext().getContentResolver().notifyChange(uri, null); 
      } 


      return rowsInserted; 

     default: 
      return super.bulkInsert(uri, values); 
    } 
} 

वारॉक का उत्तर या तो सभी या कोई पंक्ति नहीं डालें। साथ ही, setTransactionSuccessful() और endTransaction() और निश्चित रूप से इन दो फ़ंक्शन कॉल के बीच कोई डेटाबेस संचालन के बीच न्यूनतम कार्य करें।

कोड स्रोत: उदारता