Недавно я закодировал приложение для Android. Это просто простое приложение, которое позволяет вам вести счет баскетбольной игры с помощью нескольких простых счетчиков. Я получаю требование добавить функцию сохранения, так что вы можете сохранить свои баллы, а затем загрузить их обратно. В настоящее время, когда вы останавливаете приложение, ваши данные теряются. Поэтому то, что мне было интересно, это то, что я должен добавить, чтобы приложение сохраняло метку (оценка), а затем загружало ее обратно. Спасибо, ребята, жаль, что я мало что знаю об этом.
Как сохранить данные в приложении Android
Ответ 1
У вас есть два варианта, и я оставлю выбор до вас.
-
Общие настройки
Это уникальная для Android система, которая позволяет хранить примитивные значения (например,
int
,boolean,
иString
, хотя, строго говоря,String
не является примитивным) в рамках ключевого значения, Это означает, что вы даете значение имя, например, "homeScore" и сохраняете значение этого ключа.SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.putInt("homeScore", YOUR_HOME_SCORE); // Apply the edits! editor.apply(); // Get from the SharedPreferences SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0); int homeScore = settings.getInt("homeScore", 0);
-
Внутреннее хранилище
Это, на мой взгляд, то, что вы можете искать. Вы можете хранить все, что хотите, в файл, поэтому это дает вам большую гибкость. Однако процесс может быть сложнее, потому что все будет храниться как байты, а это значит, что вы должны быть осторожны, чтобы ваши процессы чтения и записи работали вместе.
int homeScore; byte[] homeScoreBytes; homeScoreBytes[0] = (byte) homeScore; homeScoreBytes[1] = (byte) (homeScore >> 8); //you can probably skip these two homeScoreBytes[2] = (byte) (homeScore >> 16); //lines, because I've never seen a //basketball score above 128, it's //such a rare occurance. FileOutputStream outputStream = getApplicationContext().openFileOutput(FILENAME, Context.MODE_PRIVATE); outputStream.write(homeScoreBytes); outputStream.close();
Теперь вы также можете посмотреть External Storage, но я не рекомендую это в этом конкретном случае, поскольку внешнее хранилище может не быть быть позже. (Обратите внимание, что если вы выбираете это, для этого требуется разрешение)
Ответ 2
OP запрашивает функцию "сохранить", что больше, чем просто сохранение данных во всех исполнениях программы (что вы должны сделать для того, чтобы приложение стоило чего-то.)
Я рекомендую сохранять данные в файле на SD-карте, что позволяет не только напомнить об этом позже, но и позволяет пользователю монтировать устройство как внешний диск на своем собственном компьютере и захватывать данные для использования в других местах.
Итак, вам действительно нужна многоточечная система:
1) Внесите onSaveInstanceState()
. В этом методе вы передаете Bundle, который в основном похож на словарь. Храните как можно больше информации в комплекте, как это необходимо для перезапуска приложения, где оно было остановлено. В вашем методе onCreate()
проверьте, что переданный пакет не имеет значения null, и если это так, восстановите состояние из пакета.
2) Внедрить onPause()
. В этом методе создайте редактор SharedPreferences и используйте его, чтобы сохранить все состояние, необходимое для запуска приложения в следующий раз. Это в основном состоит из предпочтений пользователей (отсюда и название), но все, что связано с состоянием запуска приложения, также должно идти здесь. Я не буду хранить оценки здесь, просто материал, который вам нужно перезапустить. Затем, в onCreate()
, всякий раз, когда нет объекта связки, используйте интерфейс SharedPreferences для вызова этих настроек.
3a) Что касается таких вещей, как оценки, вы можете следовать рекомендациям Mathias выше и хранить оценки в каталоге, возвращенном в getFilesDir()
, используя openFileOutput()
и т.д. Я думаю, что этот каталог является приватным для приложения и живет в основном что другие приложения и пользователь не смогут получить доступ к данным. Если это нормально с вами, то это, вероятно, путь.
3b) Если вы хотите, чтобы другие приложения или пользователь имели прямой доступ к данным, или если данные будут очень большими, то sdcard - это путь. Выберите имя каталога, например com/user1446371/basketballapp/, чтобы избежать столкновений с другими приложениями (если вы не уверены, что имя вашего приложения является достаточно уникальным) и создайте этот каталог на SD-карте. Как отметил Матиас, сначала нужно подтвердить, что SD-карта установлена.
File sdcard = Environment.getExternalStorageDirectory();
if( sdcard == null || !sdcard.isDirectory()) {
fail("sdcard not available");
}
File datadir = new File(sdcard, "com/user1446371/basketballapp/");
if( !datadir.exists() && !datadir.mkdirs() ) {
fail("unable to create data directory");
}
if( !datadir.isDirectory() ) {
fail("exists, but is not a directory");
}
// Now use regular java I/O to read and write files to data directory
Я рекомендую простые CSV файлы для ваших данных, чтобы другие приложения могли легко их читать.
Очевидно, вам придется писать действия, которые позволяют "сохранять" и "открывать" диалоги. Обычно я просто звоню в файловый менеджер openintents и позволяю ему выполнять эту работу. Это требует, чтобы ваши пользователи установили файловый менеджер openintents, чтобы использовать эти функции.
Ответ 3
В onCreate:
SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE);
String mySetting = sharedPref.getString("mySetting", null);
В onDestroy или эквиваленте:
SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("mySetting", "Hello Android");
editor.commit();
Ответ 4
Используйте SharedPreferences, http://developer.android.com/reference/android/content/SharedPreferences.html.
Вот пример: http://developer.android.com/guide/topics/data/data-storage.html#pref
Если структура данных более сложна или данные велики, используйте базу данных Sqlite; но для небольшого объема данных и с очень простой структурой данных, я бы сказал, SharedPrefs будет делать, и БД может быть накладными.
Ответ 5
Существует множество опций для хранения ваших данных, и Android предлагает выбрать кого угодно Параметры хранения данных следующие:
Общие настройки Храните частные примитивные данные в парах ключ-значение. Внутреннее хранилище Храните личные данные в памяти устройства. Внешнее хранилище Храните общедоступные данные в общем внешнем хранилище. Базы данных SQLite Храните структурированные данные в частной базе данных. Подключение к сети Храните данные в Интернете с помощью собственного сетевого сервера.
Отметьте здесь для примеров и tuto
Ответ 6
-
Общие настройки: пример общих предпочтений Android для высоких результатов?
-
Доступно ли вашему приложению доступ к "внешнему носителю". Если это так, вы можете просто написать значение (сохранить его с отметкой времени) в файле и сохранить его. Временная метка поможет вам показать прогресс, если это то, что вы ищете. {не умное решение.}
Ответ 7
На мой взгляд, db4o - самый простой способ. Здесь вы можете найти учебник: http://community.versant.com/documentation/reference/db4o-7.12/java/tutorial/
И здесь вы можете скачать библиотеку:
http://www.db4o.com/community/download.aspx?file=db4o-8.0-java.zip
(Просто поместите db4o-8.0...- all-java5.jar в каталог lib в папку проекта libs. Если в вашем проекте нет папки libs)
Поскольку db4o - это объектно-ориентированная система баз данных, вы можете напрямую сохранить объекты в базе данных и позже вернуть их.
Ответ 8
Пожалуйста, не забывайте о том, что при удалении приложения данные внутреннего хранилища удаляются. В некоторых случаях это может быть "неожиданная функция". Тогда хорошо использовать внешнее хранилище.
Документы Google о хранении - Пожалуйста, посмотрите, в частности, на getExternalStoragePublicDirectory