2012-10-04 9 views
7

すべての一括挿入がデータベースに行われた後、ただ1つの通知が必要です。 bulkInsert()関数を使用する例を示してください。 インターネットで適切な例が見つかりません。助けてください!!!!androidのbulkInsert()関数の使い方は?

答えて

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がある場合は、1回だけ呼び出します。

+0

これは、右に失敗した場合、残りの挿入を*終了しません。 – Anthony

+0

これは、try/catchブロックでsetTransactionSuccessfulを呼び出す前に例外がある場合は、1つ1つの挿入を元に戻し/ロールバックします。要するに、例外がある場合は、全く挿入されません。 – Warlock

+0

'変数 'テーブル'が初期化されていない可能性があります。宣言を 'String table =" ";;に設定すると問題が解決しました。 –

3

私はこれをアクティビティ側とコンテンツプロバイダ側で実装するためのチュートリアルを探していました。私は上記の "Warlockの"答えを使用し、それはコンテンツプロバイダ側で素晴らしい仕事をした。 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()の間の最小限のタスクを実行します。もちろん、これらの2つの関数呼び出しの間にデータベース操作はありません。

コードソース:Udacity

関連する問題