2009-07-30 3 views
29

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

ответ

9

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

Старый Ответ так замечания по этому имеют смысл:

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

+0

как вы регулируете корневой путь? – user121196

+0

Откорректируйте корневой путь, который вы используете. (Это было немного запутанно ... вы не можете изменить корневой путь Android) – haseman

+0

Я использую SQLiteDatabase для создания базы данных, однако аргумент имени его конструктора не может содержать путь, как это возможно, что я создаю база данных на SD-карте? – user121196

2

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

76

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

+1

Это не всегда работает, потому что, по-видимому, расположение карты памяти Samsung * real * SD является «Environment.getExternalStorageDirectory() +«/external_sd »'. Другие устройства будут иметь разные местоположения. – Muz

13

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

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

3

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

33

Для начала:

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

File externalStorage = Environment.getExternalStorageDirectory(); 

Это будет относиться к внутреннему внутренней памяти сд сд хранению или.

externalStorage.getAbsolutePath() 

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

"/ SDCard /" или "/ шоссе/SDCard /"

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

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

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

"/mnt/sdcard/" 

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

памяти, эта папка пуста и ее используется, чтобы указать на внешней памяти 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); 
/////////// 

и вы готовы идти ...

+1

К сожалению, это абсолютно не стандарт. На LG Optimus он находится в/mnt/sdcard/_ExternalSD. Надеюсь, что кто-то в google собирает все это. Именование медиа настолько плохо (внешнее ???), и в документах не говорится ни слова о том, как получить доступ к второй SD-карте, когда есть один встроенный. – Snicolas

+0

Не могли бы вы помочь получить все имена папок на SD-карте. –

Смежные вопросы