Как кэшировать / сохранять пользовательский объект класса в Android?

Я хочу сохранить ArrayList<CustomClass> -объект где-нибудь в хранилище Android, чтобы быстро найти и отобразить в нем данные.

Это возможно или нет? Если да, то какой метод подходит, SQLite или внешнее хранилище?

Solutions Collecting From Web of "Как кэшировать / сохранять пользовательский объект класса в Android?"

пример.

 public class MyClass implements Serializable { private static final long serialVersionUID = 1L; public String title; public String startTime; public String endTime; public String day; public boolean classEnabled; public MyClass(String title, String startTime, boolean enable) { this.title = title; this.startTime = startTime; this.classEnabled = enable; } public boolean saveObject(MyClass obj) { final File suspend_f=new File(SerializationTest.cacheDir, "test"); FileOutputStream fos = null; ObjectOutputStream oos = null; boolean keep = true; try { fos = new FileOutputStream(suspend_f); oos = new ObjectOutputStream(fos); oos.writeObject(obj); } catch (Exception e) { keep = false; } finally { try { if (oos != null) oos.close(); if (fos != null) fos.close(); if (keep == false) suspend_f.delete(); } catch (Exception e) { /* do nothing */ } } return keep; } public MyClass getObject(Context c) { final File suspend_f=new File(SerializationTest.cacheDir, "test"); MyClass simpleClass= null; FileInputStream fis = null; ObjectInputStream is = null; try { fis = new FileInputStream(suspend_f); is = new ObjectInputStream(fis); simpleClass = (MyClass) is.readObject(); } catch(Exception e) { String val= e.getMessage(); } finally { try { if (fis != null) fis.close(); if (is != null) is.close(); } catch (Exception e) { } } return simpleClass; } 

И вызов из деятельности

 if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"MyCustomObject"); else cacheDir= getCacheDir(); if(!cacheDir.exists()) cacheDir.mkdirs(); MyClass m = new MyClass("umer", "asif", true); boolean result = m.saveObject(m); if(result) Toast.makeText(this, "Saved object", Toast.LENGTH_LONG).show(); else Toast.makeText(this, "Error saving object", Toast.LENGTH_LONG).show(); MyClass m = new MyClass(); MyClass c = m.getObject(this); if(c!= null) Toast.makeText(this, "Retrieved object", Toast.LENGTH_LONG).show(); else Toast.makeText(this, "Error retrieving object", Toast.LENGTH_LONG).show(); 

Не забывайте использовать разрешения write_external_storage в файле манифеста.

Эта проблема не является специфичной для Android. Я имею в виду, если вы знаете, как сериализовать свои данные либо через java.io.Serializable, либо у вас есть пользовательский формат персистентности, вам просто нужно знать, где его хранить.

Вы можете захватить файл на локальном устройстве через

 FileOutputStream stream = null; try{ stream = mContext.openFileOutput("name.data", Context.MODE_PRIVATE); DataOutputStream dout = new DataOutputStream(stream); dout.writeObject(myArrayList); dout.flush(); stream.getFD().sync(); catch(IOException e) { //Do something intelligent } finally { stream.close(); } 

Вам придется использовать openFileInput () позже, чтобы прочитать данные назад.

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

Если ваши данные структурированы и будут запрашиваться много раз, и может быть довольно большой, чтобы всегда загружать их, подумайте об использовании инструментов sql lite, входящих в состав ОС. Однако я предполагаю, что вам это не нужно, поскольку простой список – это просто линейные структуры, которые вы, вероятно, могли бы искать в файле (при условии, что это меньше 1 МБ данных 🙂

Эта проблема может быть решена с помощью singleton-класса, в котором вы можете установить / получить любой объект, например arrayList, в любое время. Если вы использовали Android-сервис, то это решение не подходит. Возможно, решение вашей проблемы можно найти здесь .