【问题标题】:How to cache/save custom class object in Android?如何在 Android 中缓存/保存自定义类对象?
【发布时间】:2018-10-28 09:08:28
【问题描述】:

我想将ArrayList<CustomClass>-object 保存到 Android 存储中的某个位置,以便快速检索并在其中显示数据。

这可能吗?如果是,那么哪种技术更合适,SQLite 还是外部存储?

【问题讨论】:

  • 为什么不使用android中提供的sharepreferences?

标签: java android


【解决方案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 权限。

【讨论】:

  • 并且不要在其中使用上下文,否则将引发不可序列化的异常。
  • 从哪里可以得到 SerializationTest 类??
  • SerializationTest 只是对他正在使用的目录的引用。根据您的目的,您将希望从 Android 获得它。
【解决方案2】:

这个问题并不是真正的 android 特定的。我的意思是如果你知道如何通过 java.io.Serializable 序列化你的数据或者你有一个自定义的持久化格式,你只需要知道在哪里存储它。

您可以通过

在本地设备上抓取文件
FileOutputStream stream = null;
try{
   stream = mContext.openFileOutput("name.data", Context.MODE_PRIVATE);
   ObjectOutputStream dout = new ObjectOutputStream(stream);
   dout.writeObject(myArrayList);
   dout.flush();
   stream.getFD().sync();
} catch(IOException e) { //Do something intelligent
} finally {
   stream.close();
}

稍后您将不得不使用 openFileInput() 来读回数据。

或者您可以获取外部存储。这很相似,但是您必须保证它甚至存在。就像是连接的外部存储,甚至可以写入。由于您在这里编写数据结构并且通常外部存储是世界可读的,因此我认为这对于您的预期目的来说不是一个好主意(仅从您到目前为止的内容来看)。

如果您的数据是结构化的并且将被多次查询并且总是加载可能相当大,那么请考虑使用作为操作系统一部分的 sql lite 工具。但是我假设你也不需要这个,因为一个简单的列表就是一个线性结构,你可以在文件中寻找它(假设它小于 1MB 的数据:)

【讨论】:

  • 如果您使用上下文,则可序列化会抛出错误 notSerializable 异常,因为上下文不可序列化。是的想法是相同的,但没有使用上下文。谢谢。
  • 就像我说的,我假设你有一个可序列化的对象。我不是说序列化上下文。我是说序列化您未描述的列表内容。无论如何,您都不需要持久化上下文。
【解决方案3】:

这个问题可以通过单例类here 解决,您可以在其中随时设置/获取任何对象,例如arrayList。如果您使用 Android 服务,则此解决方案不适合。 或许您的问题的解决方案可以在here找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多