0

如前所述,我刚刚开始进行 android 开发,现在已经开始从一个活动转移到另一个活动。我想知道存储数据的最佳方式是什么,以便在需要时用于各种活动。

来自 Web 开发背景,我认为这有点像将数据存储在会话或 cookie 中。存在于后台并在需要时可以访问的东西。(我知道您也可以使用数据库,但如果可能的话,我想避免为这个特定的应用程序使用数据库)

为了争论,假设我想要一个员工对象的链表,它在多个活动中是持久的。如果我在工作线程中创建了所述链接列表,那么该线程是否会在应用程序的整个生命周期中存在,从而允许数据随时可供 UI 线程使用?

谢谢

4

8 回答 8

3

您的内容应该可以通过 ContentProviders 访问,它可以从 Web 或数据库中检索数据。应用程序中的所有活动和片段都可以在需要时向内容提供者请求数据。

在您拥有员工列表的示例中,员工应该位于“员工”数据库表中,并且您的提供者应该返回包含基于您放在一起的 SQL 查询的响应的Cursor对象。

对于数据库访问,请参阅SQLiteOpenHelper

对于内容提供者,请参阅ContentProviders

这不是一个简单的主题,有很多东西要学,但是如果你按照自己的方式学习它,它会极大地提高你的应用程序的质量。有关此主题的教程,请参阅此链接。

我也很乐意帮助解决任何问题。

于 2013-02-06T22:07:13.247 回答
2

要存储数据,您可以将SharedPreferences其用于小型数据存储,例如设置、用于大型关系信息的数据库,甚至是文件。在您的情况下,这取决于数据大小。

但在我看来,您的问题更多是关于如何从不同的活动中访问这些数据,而不是存储它。

我建议你看看Application对象。这通常是一个单例,只要应用程序存在,它就会保留在内存中。因此,您可以加载数据并从任何您想要的地方检索它。如果您想从不同的线程访问,请记住防止并发问题,就是这样。

于 2013-02-06T22:12:12.393 回答
1

如您所见,您有几个选项,但正如您特别说的那样,您希望在应用程序的生命周期内访问某些东西,您应该参考文档所说的 Application 类

需要维护全局应用程序状态的基类

您需要在清单中指定扩展 Application 的类的名称,然后在应用程序进程启动时将其实例化,并且您可以确保只要您的应用程序处于活动状态,它就在那里。

您可以在此处参考文档

http://developer.android.com/reference/android/app/Application.html

例如,您需要创建一个扩展应用程序的类,例如:-

public class MyApplication extends Application {
    ...
}

并编辑您的清单以包含引用上述类的标签:-

<application ... android:name="com.fullpat.to.MyApplication">

谢谢,

瑞安

于 2013-02-06T22:18:55.833 回答
0

共享偏好是常见的做法。尽管根据您的列表,它可能并不那么简单。如果您可以将其调整为 StringSet,那么您就可以在没有任何对象数据对流的情况下共享首选项。

实际上,另一个想法是将您的列表作为应用程序的应用程序类的对象。您的应用程序中的活动可以访问应用程序类,它通常用于保存“全局变量”。

于 2013-02-06T22:00:46.313 回答
0

我曾经像过去一样传递数据Intent Extra,但后来我发现 ReplicaIsland Rep的源代码中使用了一个很好的设计模式。

这个想法是使用一个类作为 SystemRegistry 并将您的数据作为静态对象。

它如下所示:

public class SystemRegistry {
         public static LinkedList<Object> myList;

 }

以及来自您的应用程序和活动的任何部分。你只要打电话

SystemRegistry.myList 
于 2013-02-06T22:02:10.443 回答
0

我认为,您可以为此使用SharedPreferences,它的 api 非常简单。此外,您可以清理应用程序关闭或其他方面的数据。

于 2013-02-06T22:06:32.173 回答
0

对于仅保留对象列表的特定需求,您可以扩展应用程序类并将此列表“存储”在那里。在其他情况下,在活动、内容提供者和当然 sqlite 数据库之间的意图中使用 Extras 似乎“更干净”。

于 2013-02-06T22:10:44.223 回答
0

在面向对象的开发视图中,我会说您想要的非常简单:

在您的 MainActivity(在应用程序生命周期开始时启动的活动)上,您有 LinkedList

public class MainActivity extends Application {    

  private LinkedList<employee> employees = new LinkedList<employee>();

  public LinkedList getEmployees() {
    return this.employees;
  }

在您的第二个活动中:

public class SeconActivity extends Activity {

  private MainActivity         app;
  private LinkedList<employee> emp;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.app = (MainActivity) getApplication();
    this.emp = app.getEmployees();

对于应用程序中的少量数据,您可以使用SharedPreferences类。

于 2013-02-06T22:11:27.560 回答