8
votes

Comment utiliser la fonction Bulkinsert () dans Android?

Je veux seulement une seule notification après que toute l'insertion en vrac soit effectuée dans la base de données. Veuillez fournir un exemple d'utilisation de la fonction Bulkinsert (). Je ne trouve pas d'exemple approprié sur Internet. S'il vous plaît aider !!!!


0 commentaires

3 Réponses :


38
votes

Ceci est Bulkinsert à l'aide de contenuProvider.

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


4 commentaires

Ce sera pas finir les inserts restants si l'on échoue non?


Cela reviendra / resserrera chaque insert unique s'il y a une exception avant d'appeler settransactionCessUnful dans ce bloc d'essai / prise. En bref s'il y a une exception, vous n'obtiendrez aucun insert.


J'ai eu une erreur disant variable 'Table' n'aurait peut-être pas été initialisée . Définition de la déclaration à Table de chaîne = ""; a résolu le problème.


C'est une bonne aide. Mais j'ai peur de ne pas être écrasé l'application?



5
votes

J'ai cherché à toujours trouver un didacticiel pour implémenter cela sur le côté de l'activité et du fournisseur de contenu. J'ai utilisé la réponse de "Warrlock" d'en haut et j'ai fonctionné super sur le côté fournisseur de contenu. J'ai utilisé la réponse de Ce message pour préparer le tableau de contenuValues ​​sur l'activité de l'activité. J'ai également modifié mes observations de contenu pour recevoir d'une chaîne de valeurs séparées par des virgules (ou de nouvelles lignes, périodes, semi-colons). Ce qui ressemblait à ceci:

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


0 commentaires

0
votes

Essayez cette approche.

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


0 commentaires