2012-10-04 4 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 ​​[] 값 배열에 더 많은 ContentValues가있을 때 한 번만 호출하십시오.

+0

오른쪽 삽입에 실패하면 나머지 삽입이 완료되지 않습니다. – Anthony

+0

try/catch 블록에서 setTransactionSuccessful을 호출하기 전에 예외가 발생하면 매 삽입마다 되돌릴/롤백합니다. 간단히 말해, 예외가 있으면 삽입하지 않을 것입니다. – Warlock

+0

'변수 '테이블'이 초기화되지 않았을 수 있습니다. '라는 오류가 나타납니다. 선언을'String table = "";로 설정하면 문제가 해결됩니다. –

3

나는 활동 측면과 콘텐츠 제공 업체 측면에서이를 구현하는 자습서를 찾기 위해 영원히 수색했다. 위의 "Warlock 's"답변을 사용했으며 콘텐츠 제공 업체 측면에서 훌륭하게 작동했습니다. 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

관련 문제