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

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

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

Ответ 1

Пример.

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 в файле манифеста.

Ответ 2

Эта проблема не специфична для 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 МБ данных:)

Ответ 3

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