хранение данных приложения Android на SD-карте - PullRequest
30 голосов
/ 31 июля 2009

Есть ли способ хранить данные приложения Android на SD-карте, а не во внутренней памяти? Я знаю, как перенести базу данных sqlite приложения из внутренней памяти на SDCard, но что, если внутренняя память заполнится в первую очередь? Как все справляются с этим?

Ответы [ 6 ]

76 голосов
/ 17 января 2010

Лучше использовать Environment.getExternalStorageDirectory () , чем для жесткого кода "/ sdcard" Не всегда точно так будет называться имя папки. Кроме того, класс Environment предлагает метод getExternalStorageState () для проверки доступности внешнего хранилища.

33 голосов
/ 26 апреля 2011

Для начала:

В зависимости от модели / os вы можете получить доступ к корневому каталогу карты SD с помощью:

File externalStorage = Environment.getExternalStorageDirectory();

Это относится к внутренней памяти SD или внутренней памяти SD.

externalStorage.getAbsolutePath() 

вернет одно из следующих значений

"/ sdcard /" или "/ mnt / sdcard /"

Чтобы получить доступ к внешней памяти SD или Micro SD, которую вы обычно подключаете с внешней стороны телефона / планшета, вы должны использовать одну из следующих папок, которые Android создает для указания на внешнюю память:

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

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

"/mnt/sdcard/"

ps: вы можете заметить пустую папку external_sd или sd на внутренней SD-карте

памяти, эта папка пуста и используется для указания на внешнюю карту Micro SD.

в конце убедитесь, что у вас есть доступ для чтения / записи к SD-карте android.permission.WRITE_EXTERNAL_STORAGE в манифесте Android xml.

наконец вы должны указать имя файла и ваш готовый

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

и вы готовы к работе ...

13 голосов
/ 18 ноября 2010

Вот еще одна изящная маленькая хитрость. Приложение имеет ряд методов, которые вызываются для получения путей. В частности, приложение имеет метод getDatabasePath с, который используется SQLiteOpenHelper для построения пути. Пользовательский класс приложения может переопределить эти методы для предоставления различных путей, включая пути в getExternalStorageDirectory .

Внешнее хранилище зависит от приложения или является общедоступным. Существуют методы, заменяющие механизм getExternalStorageDirectory , getExternalFilesDir () и getExternalStoragePublicDirectory () соответственно.

9 голосов
/ 31 июля 2009

Предупреждение: Этот ответ устарел. Вы должны использовать Environment.getExternalStorageDirectory () , чтобы получить корневой путь SD-карты, как указано в ответах ниже.

Старый ответ, поэтому комментарии по этому поводу имеют смысл:

Добавление /sdcard/ в корень вашего пути должно указывать вашему Android-приложению использовать SD-карту (по крайней мере, это работает с G1). Объекты файловой системы Android дают вам возможность проверять размеры файлов ... так что должна быть возможность (если сложно) написать некоторый отказоустойчивый код. Этот код будет корректировать ваш корневой путь, если заполнится внутренняя память.

3 голосов
/ 16 декабря 2010

некоторые устройства используют / mnt / sdcard в качестве корневой точки для SD-карты.

2 голосов
/ 31 июля 2009

Проблема с использованием SDCard заключается в том, что вы не можете надежно предположить, что она будет присутствовать всегда, когда ваше приложение нуждается в ней. Это не относится к внутренней памяти. Пока ваше приложение не использует эти данные для запуска, все должно быть в порядке.

...