Подтвердить что ты не робот

Как сохранить данные в приложении Android

Недавно я закодировал приложение для Android. Это просто простое приложение, которое позволяет вам вести счет баскетбольной игры с помощью нескольких простых счетчиков. Я получаю требование добавить функцию сохранения, так что вы можете сохранить свои баллы, а затем загрузить их обратно. В настоящее время, когда вы останавливаете приложение, ваши данные теряются. Поэтому то, что мне было интересно, это то, что я должен добавить, чтобы приложение сохраняло метку (оценка), а затем загружало ее обратно. Спасибо, ребята, жаль, что я мало что знаю об этом.

4b9b3361

Ответ 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