Есть ли альтернатива Sharedpreference в собственном Android?

Мое требование - постоянно хранить данные в собственном исполняемом файле Android. Данные имеют примитивные типы. Могу ли я использовать SharedPreferences в исполняемых файлах? Если да, то как? и если НЕТ, то есть ли альтернатива для постоянного хранения данных на родной стороне андроида?

Я не хочу использовать SQLite на собственной стороне или в какой-либо файловой операции.

Спасибо,


person Sudhir Sinha    schedule 19.10.2016    source источник


Ответы (2)


Общие предпочтения — лучшее решение для хранения премитивных данных:

    SharedPreferences sharedpreferences = getSharedPreferences(MyPREFERENCES,         Context.MODE_PRIVATE);
    Editor editor = sharedpreferences.edit();
    editor.putString("key", "value");
    editor.commit();
person puneet yadav    schedule 19.10.2016

Изменить: извините, я изначально неправильно прочитал вопрос

Могу ли я использовать SharedPreferences в исполняемых файлах?

да. Если данные имеют примитивный тип, вы обязательно должны это сделать.

Как?

Из документации разработчиков Android:

public class Calc extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";

@Override
protected void onCreate(Bundle state){
   super.onCreate(state);
   . . .

   // Restore preferences
   SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
   boolean silent = settings.getBoolean("silentMode", false);
   setSilent(silent);
}

@Override
protected void onStop(){
   super.onStop();

  // We need an Editor object to make preference changes.
  // All objects are from android.context.Context
  SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
  SharedPreferences.Editor editor = settings.edit();
  editor.putBoolean("silentMode", mSilentMode);

  // Commit the edits!
  editor.commit();
}

}

Я разместил аналогичный ответ о том, как использовать SharedPrefs здесь просто обратите внимание что этот вариант использования SharedPreferences нарушает преимущества HashMap, который действительно быстро находит и получает значение для ключа.

Один из способов сделать это:

//if you are running the code inside from an Activity
Context context = this;
SharedPreferences userSharedPrefs = context.getSharedPreferences("USER_NAME_PREFS", MODE_PRIVATE);
SharedPreferences pwdSharedPrefs = context.getSharedPreferences("PWD_PREFS", MODE_PRIVATE);

Метод getAll() вернет структуру данных с именем HashMap, которая работает как словарь:

Для каждого сохраненного значения существует уникальный ключ.

примечание: получая их все сразу, вы как бы нарушаете цель этой структуры данных, но давайте продолжим

    Map<String, String> userNameHashMap = (Map<String, String>)userSharedPrefs.getAll();
    Map<String, String> pwdHashMap = (Map<String, String>)pwdSharedPrefs.getAll();

тогда можешь делать с ними что хочешь

хотите их в списке? (Кстати, я предполагаю, что ваши имена пользователей являются строками)

    List<String> userNameList = new LinkedList<>();
    userNameList.addAll(userNameHashMap.values());

хотите знать, есть ли пароль для пользователя john?

    boolean johnHasPasswd = pwdHashMap.containsKey("john");
    String johnsPass;

    if(johnHasPasswd)
        johnsPass = pwdHashMap.get("john");

Если вы хотите использовать собственные механизмы хранения данных, вы ограничены следующим

Ваши варианты хранения данных следующие:

  • Общие настройки Храните частные примитивные данные в парах ключ-значение.
  • Внутреннее хранилище Храните личные данные в памяти устройства.
  • Внешнее хранилище Храните общедоступные данные в общем внешнем хранилище. .
  • Базы данных SQLite Храните структурированные данные в частной базе данных.
  • Сетевое подключение Храните данные в Интернете на собственном сетевом сервере

Вам следует ознакомиться с этими официальными документами от разработчиков. Веб-сайт.

Надеюсь это поможет!

person HenriqueMS    schedule 19.10.2016
comment
Основываясь только на ваших требованиях не использовать SharedPreferences OP действительно хочет использовать SharedPreferences, если это возможно. - person Michael; 19.10.2016
comment
Спасибо за ваш ответ. Мне нужно знать, как использовать Общие настройки Хранить частные примитивные данные в парах ключ-значение в собственном C в Android NDK. В требованиях нет реализации JNI, так как я работаю над двоичными/исполняемыми файлами. - person Sudhir Sinha; 19.10.2016
comment
@SudhirSinha ты смог решить свою проблему? - person HenriqueMS; 25.10.2016
comment
У меня нет экземпляра JNIEnv, так как я работаю над автономными двоичными файлами. На данный момент для постоянного хранения данных в Linux я использую файл и чтение/запись файла с помощью mmap. Это решило мою проблему, а также ускорила работу с файлами благодаря mmap. - person Sudhir Sinha; 29.10.2016
comment
Ваш ответ, кажется, с точки зрения android sdk, что правильно, но мой вопрос относится к собственному хранилищу в android linux. - person Sudhir Sinha; 29.10.2016
comment
Переходя с исходной стороны JNI, доступ к sharedPreference выглядит несколько громоздким, поэтому в настоящее время данные хранятся в некоторых файлах, а затем извлекаются из них при необходимости. На самом деле, общие предпочтения также реализованы таким же образом. Спасибо всем за участие. - person Sudhir Sinha; 18.07.2019
comment
@Sudhir, да, действительно, если вы не хотите использовать SDK и предполагаете, что ваш пользователь Linux, запускающий код, имеет правильные разрешения, вы сможете это сделать. - person HenriqueMS; 18.07.2019