すべての一括挿入がデータベースに行われた後、ただ1つの通知が必要です。 bulkInsert()関数を使用する例を示してください。 インターネットで適切な例が見つかりません。助けてください!!!!androidのbulkInsert()関数の使い方は?
7
A
答えて
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回だけ呼び出します。
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
関連する問題
- 1. nHibernate BulkInsert Identity列?
- 2. ローカルクラスのfriend関数の使い方は?
- 3. jQueryのajax関数の使い方は?
- 4. このphp関数の使い方は?
- 5. mode_rewrite関数の使い方
- 6. greasemonkey関数の使い方
- 7. opencv setOpenGlDrawCallback関数の使い方は?
- 8. distHaversine関数の使い方は?
- 9. 関数ポインタの使い方は?
- 10. Robomongo、カスタム関数の使い方は?
- 11. SendMessage/PostMessage関数の使い方は?
- 12. memcpy()関数の使い方は?
- 13. lua_pop()関数の使い方は?
- 14. QTextStream :: readLine関数の使い方は?
- 15. sscanf関数のFORMAT部分の使い方(または一般的なsscanf関数の使い方)
- 16. jQueryのtrim()関数の使い方
- 17. SikuliのPython OpenCV関数の使い方
- 18. PyCUDAの `prepare`関数の使い方
- 19. Javascript Promiseベースの関数の使い方
- 20. OpenCV cvProjectPoints2関数の使い方
- 21. erlangリストの使い方:map関数
- 22. boost regex formatter、カスタム関数の使い方
- 23. 非メンバ関数ロックの使い方
- 24. Androidタブレットエミュレータの使い方は?
- 25. android:カスタムカラーの使い方は?
- 26. Androidファイルシステムの使い方は?
- 27. Android Fragmentsの使い方は?
- 28. EnumWindowsコールバック関数の使用方法は?
- 29. removeClass()コールバック関数の使用方法は?
- 30. XQuery fn:idref()関数の使用方法は?
これは、右に失敗した場合、残りの挿入を*終了しません。 – Anthony
これは、try/catchブロックでsetTransactionSuccessfulを呼び出す前に例外がある場合は、1つ1つの挿入を元に戻し/ロールバックします。要するに、例外がある場合は、全く挿入されません。 – Warlock
'変数 'テーブル'が初期化されていない可能性があります。宣言を 'String table =" ";;に設定すると問題が解決しました。 –