Доступ к классу SharedPreferences Android из Delphi

Я только что начал путь разработки Android с помощью Delphi XE5 и пытаюсь создать простое приложение, которое должно иметь возможность сохранять некоторую введенную информацию (конфигурацию).

Я выяснил, что класс Android SharedPreferences вероятно, это самый простой способ сделать это, но я не могу понять, как получить доступ к этому классу из Delphi XE5 FMX Mobile.

Я попытался найти «SharedPreferences» в справке, но ничего не возвращает. С другой стороны, поиск «Общие настройки» дает мне слишком много.


person HeartWare    schedule 14.09.2013    source источник
comment
Это связано? stackoverflow.com/ вопросы/4265492/   -  person nexus_2006    schedule 14.09.2013
comment
Нет, к сожалению, это не так. Но спасибо за попытку...   -  person HeartWare    schedule 14.09.2013


Ответы (1)


В двух словах, добавьте необходимые единицы API в предложение uses — ключевыми в вашем случае являются AndroidApi.Jni.JavaTypes, AndroidApi.Jni.App и AndroidApi.Jni.GraphicsContentViewText, а также FMX.Helpers.Android для некоторого связующего кода — и назовите их почти так же, как в Java. Классы Java представлены как интерфейсные типы с начальной буквой J; на практике Android API довольно часто использует вложенные классы, и поскольку Delphi не поддерживает вложенные типы интерфейсов, они становятся ParentClassName_ChildClassName:

var
  Prefs: JSharedPreferences;
  Editor: JSharedPreferences_Editor;
  I: Integer;
  F: Single;
  S: string;
begin
  Prefs := SharedActivity.getPreferences(TJActivity.JavaClass.MODE_PRIVATE);
  Editor := Prefs.edit;
  Editor.putInt(StringToJString('MyIntKey'), 999);
  Editor.putFloat(StringToJString('MyFloatKey'), 123.456);
  Editor.putString(StringToJString('MyStrKey'), StringToJString('This is a test'));
  Editor.apply;
  I := Prefs.getInt(StringToJString('MyIntKey'), 0);
  F := Prefs.getFloat(StringToJString('MyFloatKey'), 0);
  S := Prefs.getString(StringToJString('MyIntKey'), StringToJString(''));

Тем не менее, я недавно выпустил простой потомок TCustomIniFile, который обертывает API SharedPreferences — см. здесь информацию:

http://delphihaven.wordpress.com/2013/09/12/a-few-xe5-related-bits/

При сопоставлении API с TCustomIniFile я обнаружил одну небольшую проблему, заключающуюся в том, что ключи SharedPreferences строго типизированы, и, похоже, нет способа заранее узнать, какой тип имеет данный ключ (ключи в TCustomIniFile, напротив, слабо типизированы). Из-за этого для чтения я использую метод getAll, чтобы получить все ключи и значения как Map/JMap (другими словами, объект словаря Java) и прочитать оттуда отдельные ключи.

person Chris Rolliston    schedule 14.09.2013
comment
Это было именно то, что я искал. Теперь я могу поддерживать общий интерфейс для различных платформ... Модуль MAC — он также для iPhone/iPad или только для MacOS? - person HeartWare; 14.09.2013
comment
Да, я только что сделал фиксацию, которая эффективно переименовывает TMacPreferencesIniFile в TApplePreferencesIniFile, чтобы подчеркнуть суть. Соответственно, устройство теперь называется CCR.Apple.PrefsIniFile.pas, и я добавил общую «мобильную» демонстрацию. - person Chris Rolliston; 14.09.2013
comment
+1 Я очень рад, потому что @ChrisRolliston (автор книги Delphi XE2 Foundations) присоединился к SO. - person Shaahin Ashayeri; 22.10.2013