2012-10-04 40 views
7

Tôi chỉ muốn một thông báo duy nhất sau khi tất cả chèn hàng loạt được thực hiện vào cơ sở dữ liệu. Vui lòng cung cấp một ví dụ để sử dụng hàm bulkInsert(). Tôi không thể tìm thấy một ví dụ thích hợp trên internet. Hãy giúp tôi!!!!Cách sử dụng hàm bulkInsert() trong android?

Trả lời

37

Đây là bulkInsert sử dụng Trình cung cấp nội dung.

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

Chỉ gọi nó một lần khi bạn sẽ có thêm giá trị ContentValues ​​trong ContentValues ​​[].

+0

Điều này sẽ * không * hoàn tất các lần chèn còn lại nếu một lỗi không đúng? – Anthony

+0

Thao tác này sẽ hoàn nguyên/khôi phục từng lần chèn một nếu có bất kỳ ngoại lệ nào trước khi gọi setTransactionSuccessful trong khối try/catch đó. Trong ngắn hạn nếu có một ngoại lệ, bạn sẽ nhận được không có chèn ở tất cả. – Warlock

+0

Tôi gặp lỗi nói rằng 'Biến 'bảng' có thể chưa được khởi tạo'. Đặt khai báo thành 'String table =" ";' giải quyết vấn đề. –

3

Tôi đã tìm kiếm vĩnh viễn để tìm hướng dẫn để triển khai điều này ở bên hoạt động và bên cung cấp nội dung. Tôi đã sử dụng câu trả lời "Warlock" từ phía trên và nó hoạt động tốt ở phía bên cung cấp nội dung. Tôi đã sử dụng câu trả lời từ this post để chuẩn bị mảng ContentValues ​​ở cuối hoạt động. Tôi cũng đã sửa đổi ContentValues ​​của mình để nhận từ một chuỗi các giá trị được phân cách bằng dấu phẩy (hoặc các dòng mới, dấu chấm, dấu chấm phẩy). Điều này trông giống như sau:

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

Tôi không thể tìm thấy cách tách biệt hơn để gắn chuỗi tách được phân tách thẳng vào mảng ContentValues ​​cho bulkInsert. Nhưng chức năng này cho đến khi tôi tìm thấy nó.

0

Thử phương pháp này.

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

Câu trả lời của Warlock sẽ chèn toàn bộ hoặc không có hàng nào. Ngoài ra, thực hiện các tác vụ tối thiểu giữa setTransactionSuccessful()endTransaction() và tất nhiên không có hoạt động cơ sở dữ liệu giữa hai cuộc gọi chức năng này.

Mã nguồn: Udacity

Các vấn đề liên quan