【问题标题】:What is a good method for persisting objects through an Android app?通过 Android 应用程序持久化对象的好方法是什么?
【发布时间】:2012-04-17 23:58:42
【问题描述】:

我正在尝试在我的 Android 应用中保留数据对象。我希望能够访问一个活动中的对象,对其进行修改、保存、导航到新活动,并使用更新后的值访问同一个对象。

我本质上说的是缓存,但我的数据对象很复杂。例如,ObjectA 包含 ObjectB,ObjectB 又包含 ObjectC。有谁知道在 Sql 中持久化复杂对象的好方法、工具或框架吗?

【问题讨论】:

  • 在您的意图中不将对象作为附加对象传递是否有特殊原因?

标签: android sql caching persistence


【解决方案1】:

在子类应用程序中放置一个静态字段。同样在您的清单中,输入:

android:name="MyApp" 在您的应用程序标签中。

也可以从其他文件访问,只需使用:

MyApp myApp = (MyApp)getApplicationContext();

请看这里How to declare global variables in Android?:

class MyApp extends Application {

  private String myState;

  public String getState(){
    return myState;
  }
  public void setState(String s){
    myState = s;
  }
}

class Blah extends Activity {

  @Override
  public void onCreate(Bundle b){
    ...
    MyApp appState = ((MyApp)getApplicationContext());
    String state = appState.getState();
    ...
  }
}

【讨论】:

  • Zowie,很高兴知道这一点!我一直在寻找像这样简单的东西(我已经为 Android 编程了一年多);它不会取代更复杂的设计,但有时它正是您所需要的。不知道我以前怎么从来没有发现过这个。谢谢凯尔!
【解决方案2】:
  • 您可以使用 ORM 框架,例如 OrmLite 将对象映射到 sql,但在您的情况下这可能有点过头了。

  • 您还可以创建这些共享对象Parcelable,并通过 Intents 在活动之间传递它们。

  • 您还可以将这些对象保存到 SharedPreferences 中,这样每个 Activity 都可以在需要时访问它们,并且这些对象也以这种方式持久化。不过,这可能意味着更多的 IO 访问,因此也要考虑到这一点。你可以使用例如为此,Gson 可以更轻松地序列化对象。

这些是我会考虑的解决方案。但是无论你做什么,都不要把这个通用对象放入某种“标准”的全局静态变量中,比如使用自定义的应用程序类、静态字段或任何单例模式的实现,这些都是 Android 上非常脆弱的构造。

【讨论】:

  • 我们考虑过 ORM。目前,我们正在通过 Intent 传递对象,但我们正在尝试实现缓存以减少从服务器检索对象所需的网络调用次数。你以前用过 OrmLite 吗?
  • 除了一些基本的、HelloWorld 级别的测试之外,我不能告诉你它有多稳定/好,但它看起来很有希望。通常我会使用 SharedPrefs 或 pass-with-intent 解决方案。
  • 我们选择了 OrmLite。它具有简单的配置,我们可以发出原始查询(我们需要的东西,因为我们并不总是有行 ID)。
【解决方案3】:

为什么不使用 JSON 序列化机制?

结合对对象的静态访问,您可以轻松构建具有一些基本功能的轻量级数据库:

  • loadObjectsFromCache
  • saveObjectsInCache
  • 获取对象

您还可以将对象存储在不同的文件中,并使用像这样的流式 json 解析器:http://code.google.com/p/google-gson/

和这个一样:http://developer.android.com/reference/android/util/JsonReader.html 但即使您的应用程序 api 级别低于 11 也可以使用。

它比基本的 DOM 解析器使用更少的内存: http://developer.android.com/reference/org/json/JSONObject.html, 但速度相同。

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 2010-12-29
    • 1970-01-01
    • 2022-10-19
    • 2010-10-06
    • 2013-04-09
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多