2012-10-04 117 views

回答

37

這是使用ContentProvider的bulkInsert。

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 [] values數組中有更多ContentValues時,只調用一次。

+0

這將*不*完成剩餘的插入,如果一個失敗的權利? – Anthony

+0

如果在try/catch塊中調用setTransactionSuccessful之前有任何異常,則這將恢復/回滾每一個插入。總之,如果有例外,你將不會得到任何插入。 – Warlock

+0

我收到一個錯誤,說'變量'表'可能沒有被初始化'。將聲明設置爲'String table =「」;'解決了這個問題。 –

3

我一直在搜索找到一個教程來實現這一點在活動端和內容提供者端。我從上面使用了「術士的」答案,它在內容提供商方面表現很好。我使用this post的答案在活動結束時準備ContentValues數組。我還修改了我的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()之間執行最小任務,當然在這兩個函數調用之間沒有數據庫操作。

代碼源:Udacity

相關問題