Khi nào sử dụng Nhà cung cấp nội dung


103

Tôi hiểu rằng Nhà cung cấp nội dung được tạo ra để cho phép chia sẻ công khai dữ liệu giữa các ứng dụng. Tuy nhiên, tôi tự hỏi liệu có ai có suy nghĩ về việc tạo Nhà cung cấp nội dung để chỉ sử dụng trong ứng dụng của riêng bạn không. Sẽ có bất kỳ lợi thế để làm điều này? Bất kỳ nhược điểm?

Trước đây, tôi vừa triển khai SQliteOpenHelper để truy cập dữ liệu từ cơ sở dữ liệu của mình, nhưng tôi đang cân nhắc tạo Nhà cung cấp nội dung. Tôi cảm thấy như cách tiếp cận URI để yêu cầu dữ liệu rõ ràng và ngắn gọn. Mặt khác, liệu việc sử dụng Nhà cung cấp nội dung chỉ cho ứng dụng của tôi có thừa không (vì bên trong nó, tôi sẽ có lớp SQliteOpenHelper) và nhiều công việc hơn tôi cần?


2
Tôi đã tạo một thư viện để giúp nhà cung cấp nội dung dễ viết. Thậm chí dễ dàng hơn so với viết SQLiteOpenHelper thuần túy. github.com/coocood/VContentProvider
coocood

Câu trả lời:


59

Nếu bạn không định chia sẻ dữ liệu, đừng nghĩ đến Nhà cung cấp nội dung. Chúng rất mạnh mẽ nhưng khó viết và sẽ thật ngớ ngẩn khi triển khai chúng nếu bạn định sử dụng chúng trong nội bộ.

Tuy nhiên, tôi tự hỏi liệu có ai có suy nghĩ về việc tạo Nhà cung cấp nội dung để chỉ sử dụng trong ứng dụng của riêng bạn không.

Tất nhiên ... ví dụ, đối với một ứng dụng danh sách VIỆC CẦN LÀM cũ mà tôi đã viết, tôi phải viết một trình cung cấp nội dung để cho phép các ứng dụng khác truy xuất và truy cập các trạng thái nhiệm vụ. Đó là một phần của các yêu cầu, nhưng hơn thế nữa, nó có ý nghĩa và khiến ứng dụng đẹp hơn.


34
Tôi đồng ý với lời biện minh của bạn, nhưng tôi cũng nghĩ rằng điều quan trọng (đặc biệt là đối với những người mới bắt đầu) là một khi Nhà cung cấp nội dung được triển khai, bạn sẽ thu được rất nhiều lợi ích. Ví dụ: bạn có thể sử dụng CursorLoaderđể thực hiện các truy vấn không đồng bộ ... bạn có quyền truy cập vào một cá thể singleton (các ContentResolver) để thực hiện các truy vấn, v.v. Tất nhiên, bạn có thể triển khai Trình tải của riêng mình để sử dụng cho cơ sở dữ liệu SQLite của mình ... tất nhiên là bạn có thể thực hiện truy cập vào một trường hợp cơ sở dữ liệu duy nhất trên toàn bộ ứng dụng ... và tất nhiên là một ContentProvider không cần thiết trừ khi bạn muốn share
Alex Lockwood

11
dữ liệu với các ứng dụng khác. Điều đó nói rằng, có rất nhiều lợi ích đi kèm với việc triển khai Nhà cung cấp nội dung của riêng bạn, vì vậy bạn không nên xem xét nó chỉ vì ứng dụng của bạn không chia sẻ dữ liệu của nó.
Alex Lockwood

8
Vâng, bạn hoàn toàn đúng nhưng tôi vẫn nghĩ rằng nó không đáng để nỗ lực trong hầu hết các trường hợp. Tôi đã thực hiện ít nhất 12 ứng dụng Android khác nhau (được xuất bản lên Cửa hàng Play) và chưa bao giờ cần đến ContentProvider. Trên thực tế, ứng dụng cuối cùng mà chúng tôi đang làm việc ban đầu được tạo bằng a ContentProvidervà chúng tôi vừa xóa nó vì nó thực sự gây khó khăn khi sử dụng hơn mức cần thiết (tôi thậm chí đã viết một thư viện để giúp dễ dàng triển khai các ContentProviders cơ bản hơn : github.com/casidiablo/persistence nhưng tôi chưa bao giờ sử dụng nó XD).
Cristian

1
@Cristian cung cấp những lời khuyên thiết thực nhất. Ngay cả tài liệu Android cũng nói rằng chúng ta không nên sử dụng ContentProvidernếu không cần thiết - "Bạn không cần nhà cung cấp để sử dụng cơ sở dữ liệu hoặc các loại lưu trữ liên tục khác nếu việc sử dụng hoàn toàn nằm trong ứng dụng của riêng bạn và bạn không cần bất kỳ tính năng nào được liệt kê ở trên. Thay vào đó, bạn có thể sử dụng một trong các hệ thống lưu trữ được mô tả trên trang Lưu dữ liệu ứng dụng. ". Nếu không, chúng tôi chỉ vượt quá kỹ thuật.
Cheok Yan Cheng

Tóm tắt: Nếu bạn không định chia sẻ dữ liệu của mình, bạn có thể tránh Nhà cung cấp nội dung nhưng mặt khác, Nhà cung cấp nội dung giúp cuộc sống của bạn trở nên dễ dàng nếu bạn muốn thay đổi cơ sở dữ liệu của ứng dụng. ví dụ: từ SQLite sang MangoDB.
Prashant

116

Tôi sẽ tranh luận rằng nó chắc chắn là một ý tưởng hay ContentProvidernếu bạn không có ý định công khai nó.

Bạn nên cung cấp thêm mức độ trừu tượng cho dữ liệu của mình để giúp thay đổi nội bộ dễ dàng hơn. Điều gì sẽ xảy ra nếu bạn quyết định thay đổi cấu trúc cơ sở dữ liệu cơ bản sau đó? Nếu bạn sử dụng một mã, ContentProviderbạn có thể chứa tất cả các thay đổi cấu trúc bên trong nó, trong đó như thể bạn không sử dụng, bạn buộc phải thay đổi tất cả các vùng của mã bị ảnh hưởng bởi các thay đổi cấu trúc. Bên cạnh đó, thật tuyệt khi có thể sử dụng lại cùng một API tiêu chuẩn để truy cập dữ liệu thay vì phân tán mã của bạn với quyền truy cập cấp thấp vào cơ sở dữ liệu.

Ngoài ra, luôn có khả năng bạn muốn tiết lộ dữ liệu của mình trong tương lai. Nếu bạn không sử dụng ContentProvidermặt trước, sẽ khó khăn hơn nhiều để trang bị thêm vào một ngày sau đó.

Sau đó, có các phần khác của Android ContentProviderđược yêu cầu / khuyến nghị, chẳng hạn như khi sử dụng SyncAdapters và nếu bạn muốn một Tiện ích ứng dụng liên quan đến quyền truy cập dữ liệu chẳng hạn.

Tóm lại, có rất ít chi phí liên quan đến việc viết ContentProvidertrước (một khi bạn đã học API, đó là một ý tưởng hay) vì vậy bạn nên làm như vậy, ngay cả đối với dữ liệu riêng tư.


1
Tôi không thể đồng ý hơn. Nó buộc bạn phải trừu tượng hóa lớp dữ liệu của mình theo cách thực tế đảm bảo rằng một nhà phát triển mới sẽ không thể ghép nối giao diện người dùng với nó.
Gabriel

3
Ngay sau khi học Android, tôi bắt đầu nghĩ theo cách tương tự vì lý do này. Ngay cả khi không công khai, bạn luôn có thể hưởng lợi từ việc tăng cường tính trừu tượng và điểm triển khai duy nhất của các quyết định kiến ​​trúc của bạn. Tôi yêu ContentProviders.
davidcsb

1
Bạn có thể làm cho các nhà cung cấp nội dung chỉ dành cho những ứng dụng của riêng bạn với thuộc tính này:android:exported="false"
Toby 1 Kenobi

4
Theo ý kiến ​​khiêm tốn của tôi, bạn có thể và nên xử lý dữ liệu của mình theo cách hoàn toàn trừu tượng mà không cần phải triển khai ContentProvider.
hmartinezd

2
Khi tôi đang trên đường triển khai giải pháp contentprovider cho db sqlite nội bộ của mình (không tương tác với các ứng dụng khác), tôi đã thấy nhận xét trên developer.android.com/guide/topics/providers/… cho biết rằng bạn không cần nhà cung cấp để sử dụng cơ sở dữ liệu SQLite nếu việc sử dụng hoàn toàn nằm trong ứng dụng của riêng bạn.
Selçuk Cihan

7

Hãy xem MOTODEV Studio cho Eclipse. Nó là một môi trường phát triển mở rộng Eclipse. Họ có một công cụ mà bạn có thể tự động tạo trình cung cấp nội dung cho cơ sở dữ liệu. Nếu một nhà cung cấp nội dung giúp việc truy cập dữ liệu của bạn dễ dàng hơn và nó không có tác động đáng kể đến hiệu suất, hãy tiếp tục và sử dụng nó. Trong hầu hết các trường hợp, điều này sẽ xảy ra.


5

Tóm lại, Content Providersgiúp quản lý dữ liệu của bạn một cách hiệu quả . Tôi sẽ đề nghị sử dụng chúng vì những lý do sau đây.

  • Nó hoạt động như một lớp trừu tượng giữa giao diện người dùng và cơ sở dữ liệu của bạn . Bạn có thể triển khai xác thực dữ liệu trong ContentProviders để xác thực dữ liệu do người dùng nhập. Nó cũng cho phép bạn sửa đổi cấu trúc của cơ sở dữ liệu mà không cần chạm vào giao diện người dùng và các phần khác.
  • Họ chơi cùng với các lớp khuôn khổ android khác như SyncAdapter. Ví dụ: bạn có thể tự động làm mới danh sách, khi một giá trị trong cơ sở dữ liệu thay đổi bằng cách sử dụng ContentProviders cùng với CursorLoader. Nếu không có ContentProviders, bạn phải tự mình triển khai rất nhiều chức năng như thế này.
  • Chúng tôi có thể để lộ dữ liệu cá nhân của mình cho các ứng dụng khác một cách an toàn . Sử dụng ContentProviders sẽ cho phép chúng tôi chia sẻ dữ liệu của mình một cách dễ dàng và an toàn với các ứng dụng khác.

Vì vậy, ngay cả khi bạn không cần bất kỳ chức năng nào trong số này bây giờ, bạn có thể cần chúng trong tương lai và rất tốt để đi xa hơn và thực hiện chúng ngay bây giờ.


Câu trả lời chính xác. Mô tả câu đơn ContentProvidersvà ba lý do riêng biệt tại sao chúng ta nên sử dụng chúng. Đôi khi những lời giải thích đơn giản là tốt nhất. +1
AdamInTheOculus

4

Tôi đồng ý rằng ContentProviders hơi khó nắm bắt nhưng chúng chắc chắn hữu ích, ngay cả khi bạn muốn sử dụng chúng trong nội bộ ứng dụng của riêng mình. Điều tốt nhất về nó là bạn có thể tùy chỉnh các trình xử lý nội dung cho các URI phù hợp.

Đây là một tình huống mà bạn có thể có 5 bảng trong cơ sở dữ liệu của mình, nhưng bạn cần phải nối một vài bảng trong số chúng theo thứ tự nhất định trước khi sử dụng chúng. Và tạo một URI nội dung cho mỗi phép nối này. Sau đó, mỗi người có thể sử dụng các URI này như một bảng :)

Tôi khuyên bạn nên tiếp tục với Content Provider, bạn sẽ ngạc nhiên khi thấy nó mạnh mẽ như thế nào.


2

Theo quan điểm của tôi, nhà cung cấp nội dung có rất nhiều lợi thế, chỉ cần chia sẻ dữ liệu với các ứng dụng khác. Nếu bạn cần đồng bộ hóa với máy chủ bằng Sync-Adapter, sử dụng nhắn tin đám mây của google, tự động cập nhật giao diện người dùng khi dữ liệu cơ bản trong DB thay đổi bằng cách sử dụng Loaders, triển khai tìm kiếm, sử dụng widget ... thì nhà cung cấp nội dung là dành cho bạn.

Tôi muốn bạn làm theo hướng dẫn trên vì một ngày nào đó, bạn có thể cần triển khai một số tính năng ở trên được đính kèm với nhà cung cấp nội dung

Nhân tiện, bạn có thể nhanh chóng xây dựng cơ sở dữ liệu và CP trong vòng chưa đầy 5 phút bằng cách sử dụng trình tạo nhà cung cấp nội dung


1

Như đã nói trong tài liệu: Tạo nhà cung cấp Nội dung

Bạn không cần nhà cung cấp để sử dụng cơ sở dữ liệu SQLite nếu việc sử dụng hoàn toàn nằm trong ứng dụng của riêng bạn.

Vậy tại sao phải phát triển chi phí này? Bạn muốn phát triển dễ dàng hơn và nhanh hơn, phải không? Vì vậy, một lớp trừu tượng (SQLiteOpenHelper con) là đủ.

Xem Occam's Razor Không tạo thực thể mà không có lý do chính đáng.


0

Không sử dụng nhà cung cấp nội dung nếu không muốn chia sẻ dữ liệu với các ứng dụng khác. Sử dụng sqlitedatabase đơn giản để thực hiện các hoạt động cơ sở dữ liệu. Hãy cẩn thận khi sử dụng các nhà cung cấp nội dung để lưu trữ dữ liệu bí mật vì thông tin bí mật của bạn có thể bị các ứng dụng khác truy cập


Theo mặc định, các nhà cung cấp nội dung không bị lộ và việc quản lý các hạn chế truy cập đối với họ rất dễ dàng. Phản đối vì phát tán thông tin sai lệch.
TBridges42

2
@ TBridges42 Bạn (đã) sai. Trên thực tế, cho đến khi Nhà cung cấp nội dung API cấp 17 được tiết lộ . Và cho đến thời điểm câu trả lời, 25% thiết bị Android bị ảnh hưởng từ hành vi này và vẫn còn 10% tại thời điểm bạn nhận xét . Vì vậy, ngược lại: nhận xét của bạn rất nguy hiểm, khi bạn nêu một điều gì đó cần được bảo mật mà thực tế không phải là /.
Murmel

0

Việc sử dụng Trình cung cấp nội dung có thể giúp ở mức độ trừu tượng bổ sung - Đặt nó trong ứng dụng của riêng bạn giúp tăng thêm thời gian phát triển đáng kể cho dự án của bạn. Tuy nhiên, nếu bạn đang sử dụng nó để chia sẻ dữ liệu, cài đặt ứng dụng hoặc cấu hình trên nhiều ứng dụng thì Nhà cung cấp nội dung là lựa chọn của bạn.

Theo dõi các cấp độ bảo mật của bạn và tôi khuyên bạn nên sử dụng SQLcipher để mã hóa dữ liệu khi đặt lại (DAR) nếu Nhà cung cấp nội dung của bạn đang ghi vào SQLite. (Tôi đã sử dụng trình cung cấp nội dung trong một số giải pháp và cung cấp khả năng chụp "ảnh nhanh" trực tiếp các giá trị hoạt động để gỡ lỗi và thử nghiệm.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.