【问题标题】:Saving objects in cache在缓存中保存对象
【发布时间】:2020-07-11 18:31:32
【问题描述】:

我正在尝试将服务器的缓存响应保存一段时间。

有下一个数据要保存在缓存中:我有一个List<ProgrammeItem>,我从服务器获取。用户在工作时,最多可以下载 ~230 个List<ProgrammeItem>(但达到这个数量是不现实的,估计是 10-50 个)。 ProgrammeItem oblect 包括字符串、int、int[]。

这就是我保存和获取上次下载的List<ProgrammeItem>

//saving / getting Programme items
public boolean saveObject(List<ProgrammeItem> obj) {
    final File suspend_f=new File(android.os.Environment.getExternalStorageDirectory(), "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;
        Log.e("catching exception ", "" + e.getMessage() + ";;;" + e);

    } 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 List<ProgrammeItem> getObject(Context c) {
    final File suspend_f=new File(android.os.Environment.getExternalStorageDirectory(), "test");

    List<ProgrammeItem> simpleClass= null;
    FileInputStream fis = null;
    ObjectInputStream is = null;

    try {
        fis = new FileInputStream(suspend_f);
        is = new ObjectInputStream(fis);
        simpleClass = (List<ProgrammeItem>) 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;
}

这就是我在活动中保存和获取对象的方式:

PI = new ProgrammeItem();
List<ProgrammeItem> programmeItems = new ArrayList<>();
...
//filling programmeItems with data from server
...
boolean result = PI.saveObject(programmeItems); //Save object
ProgrammeItem m = new ProgrammeItem();
List<ProgrammeItem> c = m.getObject(getApplicationContext()); //Get object

问题是:我怎样才能保存很多我的对象而不是只保存一个?

我想我应该做一些类似public boolean addObjectsInCache(List&lt;ProgrammeItem&gt; obj) 的事情来添加对象,而不是覆盖它们。

并将get方法更改为public List&lt;ProgrammeItem&gt; getObject(Context c, String id),其中id将是唯一标识符,它将包含在每个List&lt;ProgrammeItem&gt;中的每个ProgrammeItem中。

我说的对吗?我怎样才能做到这一点?也许你会告诉我处理对象和缓存的另一种方式?

【问题讨论】:

    标签: android arrays object caching


    【解决方案1】:

    您可以改用SharedPreference,同时也可以选择使用本地数据库Android Room。 SharedPreference 基本上存储在您设备的缓存中,而本地数据库存储在您设备的数据中,因此在我们的应用程序中,我们具有清除缓存和清除数据功能。

    其他资源:

    【讨论】:

    • 1) 我正在使用 SharedPreferences 来满足我的其他需求(字符串等),我会阅读这个,谢谢; 2)在商业项目中使用这个库(PreferencesManager)是否可以接受和安全? 3) 或者您是说使用 Secured Preferences 加密数据,我将使用 PreferencesManager 保存?
    • 如果您认为数据非常敏感,如果数据简单且不需要查询,我建议您使用 Secured Preferences + GSON 但是如果您认为使用数据库是理想的选择,a安全的替代方案是 github.com/square/sqlbrite 与密码集成以使其安全,例如github.com/vexdev/sqlcipherbrite 对于 SharedPrefs,您可以拥有任意数量的资源,也可以使用 android 密钥库保护它们 developer.android.com/training/articles/keystore
    • 我选择了带有 SharedPrefs 和 Gson 的变体——它使用内部的 android 工具,实现起来像那些库一样简单。我的代码比那些指南中的要多,但不是很多——只是因为我没有标准的 json 字符串。它现在运行良好,我没有看到这种方法的任何缺点。感谢您的帮助。
    【解决方案2】:

    一个选项可以是使用带有inMemoryDatabaseBuilder 的 Room 数据库:

    db = Room.inMemoryDatabaseBuilder(context, ProgrammeDatabase::class.java)
                    .build()
    

    如果这一切都可以放入内存中。

    【讨论】:

    • 是的,每个List&lt;&gt; 项目最多有 40Kb,我认为它适合。 @Mike 也推荐了 Room 数据库,所以我会试试这个并回复你。
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2010-11-23
    • 1970-01-01
    相关资源
    最近更新 更多