2012-03-15 60 views
7

Tôi đang cố gắng tạo nhà cung cấp nội dung sử dụng bộ nhớ trong. Tuy nhiên, tất cả các ví dụ tôi thấy trực tuyến chỉ sử dụng sqlite.Ví dụ về nhà cung cấp nội dung không sử dụng SQLite

Ai đó có thể cung cấp cho tôi hướng dẫn hay ví dụ về cách tạo nhà cung cấp nội dung bằng bộ nhớ trong không?

+0

Hãy xác định ý nghĩa của "nhà cung cấp nội dung sử dụng bộ nhớ trong", xem xét rằng SQLite thường sử dụng bộ nhớ trong, nhưng bạn không muốn SQLite. – CommonsWare

+0

@CommonsWare Theo trang Phát triển Android, có 5 cách để lưu trữ dữ liệu: Tùy chọn được chia sẻ, Bộ nhớ trong, Bộ nhớ ngoài, Cơ sở dữ liệu SQLite và Kết nối mạng. Tôi muốn nhà cung cấp nội dung của tôi sử dụng tùy chọn Bộ nhớ trong. – drum

+0

Bộ nhớ trong trong ngữ cảnh đó có nghĩa là lưu trữ nội dung trong các tệp trong vùng dữ liệu riêng của ứng dụng của bạn. Nó không thực sự là một API như vậy. Cho rằng dữ liệu SQLite được lưu trữ như một tệp trong vùng dữ liệu riêng của ứng dụng của bạn, bạn phải làm một cái gì đó khá chuyên nghiệp để làm cho nó đáng bận tâm --- sử dụng SQLite nói chung dễ dàng hơn (và nhanh hơn). –

Trả lời

4

Bạn có thể lưu trữ dữ liệu trong tệp, sử dụng phương pháp tệp cho các nhà cung cấp nội dung chẳng hạn như openTypedAssetFile(). Điều này trả về một AssetFileDescriptor (có nghĩa là, một tập tin xử lý hợp lệ trên các tiến trình) thay vì một con trỏ.

Nói chung, câu hỏi này rất khó trả lời. Một nhà cung cấp nội dung là một "giao diện" giữa một kho dữ liệu và các máy khách. Tài liệu không nói nhiều về kho lưu trữ khác ngoài SQLite bởi vì a) mô hình nhà cung cấp nội dung được tổ chức dọc theo các dòng của cơ sở dữ liệu quan hệ và b) mọi triển khai của nhà cung cấp nội dung sẽ khác nhau.

Tôi ngần ngại đưa ra thêm lời khuyên trước khi biết yêu cầu chính xác của bạn. Có thể bạn có thể hưởng lợi từ SQLite, mặc dù bạn có thể không thấy ngay lý do tại sao. Bạn cũng có thể đúng: SQLite không phải là giải pháp, nhưng đưa ra nhiều thông tin hơn tôi có thể đề xuất một số ý tưởng.

+0

Tôi thấy những gì bạn đang nói. Ngoài ra, có vẻ như một số chức năng của ContentProvider yêu cầu một cơ sở dữ liệu. Tôi đã cố gắng tìm cách để thực hiện các truy vấn() chức năng, nhưng vì nó phải trả về một đối tượng Cursor, tôi đoán SQLite là phải trong trường hợp này. – drum

+1

Tìm [this] (https://android.googlesource.com/platform/packages/providers/WebSearchProvider/+/8637dd8dc1b255052b2615430bfb4603fa8711f7/src/com/android/websearch/SuggestionProvider.java) không sử dụng SQLIte. Dữ liệu nguồn là JSONArray. Chúng ta có thể tìm hiểu làm thế nào để tạo ra một con trỏ mở rộng AbstractCursor. – Yeung

0

Vâng, tôi biết những gì bạn đang cố gắng làm có thể tạo hình ảnh, phim hoặc chẳng hạn như với bộ nhớ trong.

Bạn có thể sử dụng InternalStorage để lưu trữ byte dữ liệu. Nếu bạn có các byte bạn chỉ có thể làm:

String FILENAME = "hello_file"; 
String string = "hello world!"; 

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
fos.write(string.getBytes()); 
fos.close(); 

để có được nó ra:

File file = ... 
    OutputStream out = null; 
    try { 
    out = new BufferedOutputStream(new FileOutputStream(file)); 
    ... 
    finally { 
    if (out != null) { 
     out.close(); 
    } 
    } 

Tất cả các nguồn được tìm thấy trên thisthis. Tôi không thể giúp bạn thêm nữa vì tôi không bao giờ thử nó.

+0

Có, tôi đã xem trang này. Tuy nhiên, điều này không hoạt động trong Nhà cung cấp nội dung. – drum

1

Có một ví dụ được gọi là FileProvider.java trong các mẫu SDK Android sử dụng ContentProvider nhưng không sử dụng cơ sở dữ liệu SQLite.

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