2016-11-29 8 views
1

У меня есть небольшой список в программе, и я хочу, чтобы пользователь мог его сохранить, а не заполнять его каждый раз, когда приложение запускается.Android. Легкий способ сохранить небольшой массивList пользовательских объектов

список:

public static ArrayList<BeaconDevice> SavedBeacons;

Обычно содержит до 5-10 объектов BeaconDevice.

BeaconDevice - это объект, содержащий объект Beacon (из библиотеки AltBeacon) и имя в формате String.

Каков наилучший способ?

+0

* Что такое лучший метод? * Дело мнения –

+0

Что вы думаете Piodo? –

+0

Вам нужно сохранить весь объект, или вы можете сохранить адреса Bluetooth в виде списка строк? –

ответ

2

Существует библиотека для такого рода вещи с легким раствором

compile 'com.google.code.gson:gson:2.4' 

Таким образом, за счет импорта этого вы можете напрямую сохранить/retrive вы arrylist как это ::

SAVE: :

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 
Type listOfBecons = new TypeToken<List<BeaconDevice>>() {}.getType(); 

String strBecons = new Gson().toJson(SavedBeacons, listOfBecons); 
preferences.edit().putString("BECON_LIST", strBecons).apply(); 

RETR IEVE ::

ArrayList<BeaconDevice> mSavedBeaconList = new Gson().fromJson(preferences.getString("BECON_LIST", ""), listOfBecons); 
+0

Спасибо, это работает. – Piodo

2

Если это небольшой список, вы можете преобразовать список в строку JSON, используя библиотеку Gson, и сохранить ее как String в своих SharedPreferences. Обратитесь к этому ответу https://stackoverflow.com/a/15011927/3090173, который по существу представляет один и тот же вариант использования.

+0

Это предполагает, что 'BeaconDevice' сериализуется –

+2

@ cricket_007 Gson не требует объектов для реализации Serializable. – crymson

+0

Есть разница между тем, что я имел в виду «способностью сериализоваться» и интерфейсом Java «Serializable». –

3

Суть вопроса заключается в сериализации и сохранении объектов, а затем их десериализации. Есть много способов сделать это, и более надежные и сложные решения часто включают в себя базу данных, как правило, SQLite на Android, а также некоторую инфраструктуру объектно-ориентированного сопоставления.

Тем не менее, такое надежное решение может быть излишним в этом случае, так как вариант использования предназначен для сериализации и сохранения очень небольшого списка объектов, каждый из которых имеет ограниченное количество полей. Наиболее распространенный способ сохранения небольших фрагментов данных на Android - это общие настройки. Вы можете получить ссылку на объект, который управляет этим с:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 

После того как вы это, вы сохраните Струны для постоянного хранения с кодом:

SharedPreferences.Editor editor = preferences.edit(); 
editor.putString("savedBeacons", savedBeaconsAsString); 
editor.apply(); 

Затем загрузите их обратно, как это:

String savedBeaconsAsString = preferences.getString("savedBeacons", null); 

Конечно, вышеизложенное сохраняет только одну строку в постоянное хранилище. Как преобразовать список объектов в String и как преобразовать String в список объектов. Это называется сериализацией.

Существует множество способов сделать это, включая преобразование в JSON и обратно. Один из простейших методов - использование Java Serialization API. Основным недостатком этого является то, что они могут не выполнить десериализацию (загрузить обратно) ваш объект, если позже вы измените определение объекта в Java-коде после сохранения записей.

Ниже приведен пример преобразования массива сохраненных биков в строку и из строки, взятой из this related answer. Обратите внимание, что приведенный ниже код предполагает, что savedBeacons - это массив, а не ArrayList, как показывает ваш код. Я показал это как массив для простоты, потому что ArrayList не сериализуем.

// serialize 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
new ObjectOutputStream(out).writeObject(savedBeacons); 
String savedBeaconsAsString = new String(Hex.encodeHex(out.toByteArray())); 

// deserialize 
ByteArrayInputStream in = new ByteArrayInputStream(Hex.decodeHex(savedBeaconsAsString.toCharArray())); 
savedBeacons = (BeaconDevice[]) new ObjectInputStream(in).readObject())); 
+0

Я видел этот ответ раньше, но у меня были проблемы с преобразованием myListList в String. У меня не так много времени, поэтому я решил использовать другой ответ, используя метод Gson, который отлично работает. Спасибо за ответ. – Piodo