2013-03-25 27 views
5

tôi đã thực hiện update() của ContentProvider và thông báo cho người quan sát sử dụng getContext().getContentResolver().notifyChange(uri, null);notifyChange với uri thay đổi từ contentProvider.update()

nhu cầu rõ ràng của tôi là bất cứ khi nào chỉ là một hàng được thực hiện tôi muốn thông báo với uri cụ thể liên tiếp, nhưng không thể tìm cách để làm như vậy. truy vấn bổ sung như "select id where selectionArgs" có thể thực hiện điều này nhưng đây sẽ là một cách ngu xuẩn.

onchange(boolean, uri) lấy uri hoàn chỉnh thay vì hàng cụ thể, dễ hiểu vì điều này là do ContentProvider.update() đang gửi giống nhau. phương pháp

some code for more clarity 

cập nhật() của MyContentProvider

@Override 
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 

     Log.d("TAG", "update " + uri.getPath()); 

     int count = 0; 
     switch (uriMatcher.match(uri)) { 
     case BOOKS: 
      count = booksDB.update(DATABASE_TABLE, values, selection, selectionArgs); 
      break; 
     case BOOK_ID: 
      count = booksDB.update(DATABASE_TABLE, values, 
        _ID + " = " + uri.getPathSegments().get(1) 
          + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), 
        selectionArgs); 
      break; 
     default: 
      throw new IllegalArgumentException("Unknown URI " + uri); 
     } 

     if (count == 1) { 
      Cursor c = query(uri, new String[] { _ID }, selection, selectionArgs, null); 
      long rowId = Long.valueOf(c.getString(c.getColumnIndex(_ID))); 
      uri = ContentUris.withAppendedId(CONTENT_URI, rowId); 
     } 
     getContext().getContentResolver().notifyChange(uri, null); 
     return count; 

    } 

tôi sẽ cập nhật bảng một số cách như

getContentResolver().update(MyContentProvider.CONTENT_URI, values1, MyContentProvider._ID+"<?", new String[]{"3"})); 

thẳng thắn nói, mã đã hầu như không liên quan đến câu hỏi, chỉ cần cố gắng để cung cấp cho bạn một số ngữ cảnh

+0

Một số mã có thể có ích. Làm thế nào để bạn cập nhật nhiều hàng? – sandrstar

+0

Hãy chắc chắn rằng bạn gọi 'setNotificationUri (ContentResolver cr, Uri uri)' trên con trỏ được trả về bởi phương thức 'query()' của nhà cung cấp nội dung yout. Thông tin thêm tại http://stackoverflow.com/questions/7915050/cursorloader-not-updating-after-data-change. –

Trả lời

8

Trong phương pháp cung cấp dịch vụ của bạn, chỉ cần trả lại uri với id nối

@Override 
public Uri insert(Uri uri, ContentValues values) { 
    Log.i(TAG, "insert " + uri); 
    final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 
    final int match = URI_MATCHER.match(uri); 

    Uri returnUri; 
    switch (match) { 
     case MESSAGE: { 
      long _id = db.insert(MessageContract.MessageEntry.TABLE_NAME, null, values); 
      if (_id > 0) 
       returnUri = ContentUris.withAppendedId(MessageContract.MessageEntry.CONTENT_URI, _id); 
      else 
       throw new android.database.SQLException("Failed to insert row into " + uri); 
      break; 
     } 

     default: 
      throw new UnsupportedOperationException("Unknown uri: " + uri); 
    } 

    getContext().getContentResolver().notifyChange(returnUri, null); 


    return returnUri; 
} 

Và đăng ký quan sát của bạn với đúng đối với con cháu.

getContentResolver().registerContentObserver(MessageContract.MessageEntry.CONTENT_URI, true, mContentObserver); 

Để có được id từ một Uri bạn có thể sử dụng ContentUris.parseId(uri)

1

Thật không may tôi không thể đề xuất giải pháp dễ dàng (vì tôi không biết mã đầy đủ và cập nhật Bạn cần chạy), có một số cách chúng tôi có thể thử (một số trong số chúng tôi đã triển khai trong các ứng dụng của tôi):

  • Cung cấp id trong ContentValues - cách này sẽ không áp dụng cho trường hợp của bạn và cần vòng lặp với các cuộc gọi đến notifyChange();
  • Cung cấp Uri cụ thể cho các yêu cầu có truy vấn (chỉ một số ứng dụng cụ thể cần nhiều truy vấn khác nhau trong lựa chọn, thường dễ dàng hơn bao gồm tham số truy vấn trong Uri). Sau khi một phần khác của chương trình nhận được thông báo với cụ thể Uri nó sẽ có thể kiểm tra xem 'mục hiện tại' đã được cập nhật chưa và hành động thích hợp (ví dụ: trường hợp đơn giản nhất với danh sách bài viết và một bài viết mở trong hoạt động riêng biệt; bài viết trong nền từ máy chủ Bạn có thể cần phải cập nhật bài viết hiện đang mở cũng như vậy, cần phải biết nếu nó đã được cập nhật). Bạn sẽ có thể kiểm tra mục cụ thể ở bên cạnh người quan sát bằng cách chỉ nhận được Uri, bởi vì nó (Uri) sẽ chứa (các) tham số bạn đã sử dụng cho truy vấn;
+0

>> Bạn có thể kiểm tra mục cụ thể ở bên cạnh người quan sát bằng cách sử dụng Uri nhận được, bởi vì nó (Uri) sẽ chứa tham số <<. tôi muốn nó đúng: (trong trường hợp của tôi uri chỉ đơn giản là những gì tôi gửi trong truy vấn cập nhật và không liên quan đến các thông số tự động. Tôi đoán một trong những cần phải làm điều đó bằng tay trong ContentProvider # update().và câu hỏi của tôi là về cách làm điều đó. –

+0

Ý tôi là, Bạn có thể giới thiệu Uri cụ thể như BASE/updateItemsWith/dateLater/ thay vì sử dụng BASE/updateItemsWith và cung cấp lựa chọn trong các đối số cập nhật. Sau đó, trong quan sát Bạn sẽ có thể có BASE/updateItemsWith/dateLater/ và kiểm tra mục cụ thể bằng cách sử dụng nó. – sandrstar

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