2012-10-04 2 views
7

Ich möchte nur eine einzige Benachrichtigung, nachdem alle Masseneinfügung in die Datenbank erfolgt ist. Geben Sie ein Beispiel für die Verwendung der Funktion bulkInsert() an. Ich kann kein richtiges Beispiel im Internet finden. Bitte helfen !!!!Wie verwendet man die Funktion bulkInsert() in Android?

Antwort

37

Dies ist BulkInsert mit ContentProvider.

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; 
} 

Nennen Sie es nur einmal, wenn Sie mehr in contentcontent [] Werte Array haben.

+0

Dies wird * nicht * die verbleibenden Einsätze beenden, wenn einer nicht richtig geht? – Anthony

+0

Dadurch wird jedes einzelne Einfügeelement zurückgesetzt/zurückgesetzt, wenn vor dem Aufruf von setTransactionSuccessful in diesem try/catch-Block eine Ausnahme auftritt. Kurz gesagt, wenn es eine Ausnahme gibt, erhalten Sie überhaupt keine Beilage. – Warlock

+0

Ich habe eine Fehlermeldung erhalten, dass 'Variable 'Tabelle' möglicherweise nicht initialisiert wurde'. Setzen Sie die Deklaration auf 'String table =" ";' löste das Problem. –

3

Ich suchte für immer ein Tutorial, um dies auf der Aktivitätsseite und Inhaltsanbieter Seite zu implementieren. Ich habe "Warlocks" -Antwort von oben verwendet und es funktionierte großartig auf der Seite des Inhaltsanbieters. Ich habe die Antwort von this post verwendet, um das Array ContentValues ​​am Ende der Aktivität vorzubereiten. Ich änderte auch meine ContentValues, um von einer Reihe von kommagetrennten Werten (oder neuen Zeilen, Punkten, Semikolons) zu erhalten. Welche sah wie folgt aus:

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); 

ich nicht eine sauberere Weg finden, könnte die abgegrenzte Split-String direkt auf die content Array für bulkInsert zu befestigen. Aber das funktioniert, bis ich es finde.

0

Versuchen Sie diesen Ansatz.

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); 
    } 
} 

Warlocks Antwort fügt entweder alle oder keine Zeilen ein. Führen Sie auch minimale Aufgaben zwischen setTransactionSuccessful() und endTransaction() aus und natürlich keine Datenbankoperationen zwischen diesen beiden Funktionsaufrufen.

Code Quelle: Udacity

Verwandte Themen