何时以及如何在Android应用中将数据保存到数据库

时间:2015-01-05 15:36:25

标签: android android-fragments android-listview android-sqlite android-networking

我正在尝试了解从服务器获取数据并将其存储在数据库中并在多标签的Android应用程序中以片段形式显示的最佳实践

应用程序结构如下:主要活动有3个选项卡,每个选项卡分别包含从服务器获取的订阅源,朋友和奖励列表。这些需要点击三个差异端点,并被分页(每个馈送,奖励,朋友信息都在页面大小= 5)

目前在App.onCreate()方法[App extends Application]中,我正在点击这些端点的第一页并将其存储在App.appData对象中(具有ArrayList feed,ArrayList friends,ArrayList奖励的复合对象) )。

我是否应该同时将这些保存到数据库中,或者当用户暂停应用程序(即没有活动可见)时我应该以某种方式拦截,并且在该回调函数中保存App.appData的 - 然后内容进入数据库?否则我觉得一旦用户滚动并转到从服务器获取此页面以下的页面并且写入数据库周期将会持续多次

是否有针对此类应用程序架构的最佳实践/教程?

+-----+----+---+                           
|  T1 | T2 | T3|                           
+-----+----+---+  +---------+   +---------+
|      F1      |  |  F2     |   |    F3   |
| +----------+ |  |         |   |         |
| +----------+ |  | +-------+   |  +----+ |
|              |  | |-------+   |  |----| |
|  +---------+ |  | |-----| |   |  |----| |
|  +---------+ |  | +-----+ |   |  +----+ |
|              |  |  Friends|   | Rewards |
|     Feeds    |  |         |   |         |
+--------------+  +---------+   +---------+

1 个答案:

答案 0 :(得分:2)

我使用类似架构的应用程序。我们从服务器获取数据并在数据库到达时将其存储在数据库中。我们的UI对象从数据库中获取所需内容。这种架构的好处是UI永远不会直接依赖于网络 - 它总是只显示数据库中可用的任何内容。但是,有许多重要问题会影响这种类型的架构是否适合您:

  1. 您提取的数据多久更改一次?例如,如果用户在几天后运行应用程序,在检查新内容时显示一些旧数据是否合理?
  2. 您获取的数据有效期是多久?如果你有一天获取并存储大量数据,第二天它是否仍然有效,或者你需要扔掉它?如果旧数据没用,那么数据库就没那么有用了。
  3. 您的数据列表有多大?它们是永远存在的(例如相关性降低的搜索结果),还是存在结束(例如Facebook好友列表)?如果您的列表永远存在,那么将列表存储在数据库中会变得不那么有用。
  4. 在我的应用程序中,数据永远不会变得无效,每天的新数据量很小,而且数据量不会太大而难以在数据库中管理。这使我们可以始终拥有一组良好的数据供UI显示。但是,根据您对这些问题的回答,数据库可能不太有用。

    希望这有帮助。对不起,如果我只是在漫无边际。

    编辑: 对于存储,我们只使用SQLiteDatabase和相关类。我已经在其上写了一层,以便将大部分数据保存在内存中以获得更好的性能。当从网络接收到新数据时,我可以快速检查内存映射以查看是否有新内容或更新内容,然后根据需要将其保存到数据库中。

    我不确定您是否希望依赖App.onCreate作为提出请求的主要场所。如果您的应用程序长时间处于后台但仍在运行,那么您可能没有意识到应该获取新数据。我们为片段使用基类,在onResume中,我们从DB(或内存映射)中获取数据,以便它始终是新鲜的。您还可以跟踪上次获取数据的时间(在SharedPreferences中保留时间戳),每4小时左右发出一次新请求。

    基本片段类也是在新数据可用时接收通知的便捷方式。在onResume中,我们将片段注册为活动,并在onPause注销它。然后,当从网络获得新数据时,您只需检查哪些片段处于活动状态,然后通知它们。然后,这些片段可以从DB获取数据并刷新,就像调用onResume时一样。