在數據庫完成所有批量插入後,我只需要一個通知。 請提供一個使用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 [] values數組中有更多ContentValues時,只調用一次。
3
我一直在搜索找到一個教程來實現這一點在活動端和內容提供者端。我從上面使用了「術士的」答案,它在內容提供商方面表現很好。我使用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
相關問題
- 1. 如何使用EntityFramework BulkInsert?
- 2. Android bulkInsert進度值?
- 3. 如何在android上使用setIcon函數
- 4. 如何在條件中使用onClick函數或在函數中調用它? Android
- 5. 如何顯示在android中使用textview使用哪個函數?
- 6. 在Android中,如何使用視圖引用調用父函數?
- 7. 如何在SQLite數據庫的onCreate()函數中使用getWritableDatabase? (Android)
- 8. Buildfire - bulkInsert錯誤
- 9. 在Mongo NodeJS中使用bulkinsert處理錯誤
- 10. 如何在onTouch函數中使用while循環? (Android)
- 11. 如何在android中使用等待函數?
- 12. 如何:在Android中使用AudioManager startBluetoothSco()函數
- 13. 如何在android中使用公共變量裏面的函數?
- 14. 如何在Android中使用wait()函數時同步執行?
- 15. 在Android中使用_splitpath函數NDK
- 16. 在android中使用sqlite的strftime函數
- 17. 在Android中使用類構造函數
- 18. 如何在函數中使用grep(x)
- 19. 如何在c中使用mmap()函數
- 20. 如何在c中使用substring函數?
- 21. 如何在php函數中使用_e()?
- 22. 如何在SSRS中使用SumProduct函數?
- 23. 如何在SpringBoard-Class.h中使用函數?
- 24. 如何在bash中使用函數?
- 25. 如何在jQuery中使用show函數?
- 26. 如何在Python中使用librt函數?
- 27. 如何在Swift 3.0中使用函數
- 28. 如何在pymongo中使用mongo函數?
- 29. 如何在Python中使用str.find()函數
- 30. 如何在mysql中使用to_char函數
這將*不*完成剩餘的插入,如果一個失敗的權利? – Anthony
如果在try/catch塊中調用setTransactionSuccessful之前有任何異常,則這將恢復/回滾每一個插入。總之,如果有例外,你將不會得到任何插入。 – Warlock
我收到一個錯誤,說'變量'表'可能沒有被初始化'。將聲明設置爲'String table =「」;'解決了這個問題。 –