2009-07-30 42 views
29

Có cách nào để lưu trữ dữ liệu ứng dụng Android trên thẻ SD thay vì trong bộ nhớ trong không? Tôi biết cách chuyển ứng dụng cơ sở dữ liệu sqlite từ bộ nhớ trong sang SDCard, nhưng nếu bộ nhớ trong có đầy đủ ở vị trí đầu tiên thì sao? Mọi người xử lý như thế nào?lưu trữ dữ liệu ứng dụng Android trên Thẻ SD

Trả lời

9

Cảnh báo: Câu trả lời này đã lỗi thời. Bạn nên sử dụng Environment.getExternalStorageDirectory() để lấy đường dẫn gốc của thẻ SD như được đề cập trong các câu trả lời bên dưới.

Old trả lời nên các ý kiến ​​trên này làm cho cảm giác:

Thêm /sdcard/ vào thư mục gốc đường dẫn của bạn nên chỉ đạo ứng dụng Android của bạn để sử dụng thẻ SD (ít nhất là nó hoạt động như vậy với G1). Các đối tượng hệ thống tệp của Android cung cấp cho bạn khả năng kiểm tra kích thước tệp ... vì vậy, có thể (nếu khó) để viết một số mã không thành công. Mã này sẽ điều chỉnh đường dẫn gốc của bạn nếu bộ nhớ trong được lấp đầy.

+0

làm thế nào để bạn điều chỉnh đường dẫn gốc? – user121196

+0

Điều chỉnh đường dẫn gốc bạn đang sử dụng. (Đó là một chút khó hiểu ... bạn không thể thay đổi đường dẫn gốc của Android) – haseman

+0

Tôi đang sử dụng SQLiteDatabase để tạo cơ sở dữ liệu, tuy nhiên đối số tên của hàm tạo của nó không thể chứa đường dẫn, làm cách nào tôi có thể tạo cơ sở dữ liệu trên sdcard? – user121196

2

Vấn đề với việc sử dụng SDCard là bạn không thể tin tưởng một cách đáng tin cậy rằng nó sẽ luôn hiện diện khi ứng dụng của bạn cần. Đây không phải là trường hợp với bộ nhớ trong. Miễn là ứng dụng của bạn không dựa vào dữ liệu này để chạy nó sẽ ổn.

76

Thực tiễn tốt hơn là sử dụng Environment.getExternalStorageDirectory() so với mã cứng "/ sdcard" Không phải lúc nào cũng chắc chắn rằng tên thư mục sẽ được gọi đó. Ngoài ra, lớp Environment cung cấp phương thức getExternalStorageState() để kiểm tra xem bộ nhớ ngoài có khả dụng không.

+1

Điều này không phải lúc nào cũng hoạt động vì vị trí thẻ SD * thực * của Samsung là 'Environment.getExternalStorageDirectory() +"/external_sd "'. Các thiết bị khác sẽ có các vị trí khác nhau. – Muz

13

Đây là một mẹo nhỏ gọn gàng khác. Application có một số phương pháp được gọi để thu thập đường dẫn. Cụ thể là ứng dụng có phương pháp getDatabasePath với được sử dụng bởi SQLiteOpenHelper để xây dựng đường dẫn. Một lớp ứng dụng tùy chỉnh có thể ghi đè các phương thức này để cung cấp các đường dẫn khác nhau bao gồm các đường dẫn trong getExternalStorageDirectory.

Bộ nhớ ngoài là ứng dụng cụ thể hoặc công khai. Có các phương pháp, thay thế cơ chế getExternalStorageDirectory, getExternalFilesDir()getExternalStoragePublicDirectory() tương ứng.

3

một số thiết bị sử dụng/mnt/sdcard làm điểm gốc cho thẻ SD.

33

Để bắt đầu:

Tùy thuộc vào mô hình/os, bạn có thể truy cập vào thư mục gốc thẻ sd với:

File externalStorage = Environment.getExternalStorageDirectory(); 

này sẽ đề cập đến việc lưu trữ sd nội bộ hoặc bộ nhớ sd nội bộ.

externalStorage.getAbsolutePath() 

sẽ trở lại một trong các giá trị sau

"/ sdcard /" hoặc "/ mnt/sdcard /"

Để truy cập vào bộ nhớ sd bên ngoài hoặc micro SD, mà bạn thường cắm từ bên ngoài điện thoại/máy tính bảng, bạn phải sử dụng một trong các thư mục sau mà android tạo để trỏ tới bộ nhớ ngoài:

"/mnt/sdcard/sd" 
"/mnt/sdcard/external_sd" 

"/sdcard/external_sd" 
"/sdcard/sd" 

"/mnt/sdcard/" 

ps: bạn có thể nhận thấy một thư mục trống external_sd hoặc sd trên sdcard nội bộ

bộ nhớ, thư mục này trống và được sử dụng để trỏ tới thẻ micro sd bên ngoài.

ở cuối đảm bảo rằng bạn có quyền truy cập đọc/ghi vào thẻ sd android.permission.WRITE_EXTERNAL_STORAGE trong tệp kê khai xml android.

cuối cùng bạn phải ghi rõ tên tập tin và bạn đã sẵn sàng

private SQLiteDatabase DB = null; 

private static final String DATABASE_NAME = "MyDb.db"; 
//////////// 
File sdcard = Environment.getExternalStorageDirectory(); 

String dbfile = sdcard.getAbsolutePath() + File.separator+ "external_sd" + File.separator + DATABASE_NAME; 

DB = SQLiteDatabase.openDatabase(dbfile, null,SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
/////////// 

và sẵn sàng của bạn để đi ...

+1

Thật không may, điều này hoàn toàn không phải là tiêu chuẩn. Trên LG Optimus, nó nằm trong/mnt/sdcard/_ExternalSD. Tôi hy vọng một người nào đó tại google sẽ xem xét tất cả những điều đó. Đặt tên của phương tiện truyền thông là rất xấu (bên ngoài ???) và các tài liệu không nói một lời về cách truy cập sdcard thứ hai khi có một built-in. – Snicolas

+0

Bạn có thể giúp đỡ trong việc nhận tất cả tên thư mục có trong thẻ SD không. –

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