调查应用程序的设计

时间:2016-12-10 10:54:36

标签: java android

我对java很新,想要求设计方面的帮助。我将在java中为android构建一个简单的调查应用程序。

以下是我看到应用的方式:

  • 主页面( activity_main )包含用于ID的 LineEdit 和两个按钮:登录 SignUp 。此活动 onCreate 从DB加载所有注册用户和问题。

  • 注册页面( activity_signup )包含多个用于用户信息的 LineEdit 字段以及 SignUp 按钮。它还提供免费的ID onCreate

  • 个人资料页面( activity_profile )包含一些用户信息(可能是 TextView ),可能还有调查按钮。

  • 调查页面( activity_survey )包含问题答案和两个按钮:上一页和< EM>下一步

请提及是否可以改进。

问题:

  1. 我应该将所有用户和问题存储为class MainActivity或其他地方的私有字段吗? (假设DB非常小,完全适合RAM)

  2. 如何使用 activity_signup 中新创建的用户修改数据库?这是一个相当普遍的问题,比如我如何从保留封装的其他活动中访问私有字段?

  3. 我想在private static User current_user中添加class ProfileActivity这样的字段。但我只能从DB获取用户,DB是class MainActivity的私有字段。如何将用户从 activity_main 传递给 activity_profile (再次保留封装)?

  4. activity_survey 包含不同类型的答案,例如是/否;单/多选(+你的变种)等。如何在java中处理这个?我的想法是使用方法class AbstractQuestion创建一个抽象的fillLayout,并从中继承几个class ConcreteQuestion(此处具体应该用适当的标题替换),其中包含特定类型问题的实现。将所有问题存储在AbstracQuestion的数组中。它在java中是可行的还是有更正确的方法来做到这一点?

  5. 提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  1. 不要在Activity中存储此类对象。您有几种数据持久性选项 - 这些列在此处https://developer.android.com/training/basics/data-storage/index.html - 当然不包括任何“外部”来源,例如Realm或Firebase等数据库,但让我们保持基础。
  2. 如果您的数据很复杂,并且您认为使用SQLite查询检索它很容易,那么SQLite数据库就是您的选择。您可以使用ContentProvider访问它,可以从您拥有Context的任何地方查询。

    您还可以使用简单的Serializable类将其本地存储在内部或外部存储上。想象一个单个对象,我们称之为Database Serializable并包含您需要的所有数据。您可以在App启动时加载它(如在扩展的Application类中)并存储引用,这样就不会收集垃圾。然后,您可以从您可以编写的Application静态方法访问它以获取引用。它可能是实现具有相当复杂结构的简单存储的最快方法,但如果您的数据“很大”,这可能不是最好的。它会增加你的App开始时间(最好使加载和保存操作异步)。

    如果您的数据很简单,您可以使用SharedPreferences存储“键值”数据。这有点像第二种方法,但使用Android框架来完成它。

    选项2和3要求您的数据是Serializable或Parcelable。正如Android所说,Parcelable不应该用于持久性而是用于通信,让我们跳过那个。 您可以使对象Serializable或使用ie Gson库将它们转换为json对象。并存储那些序列化的json对象。将它们直接序列化可能是更快的方法,但有时保持jsons更有意义。

    1. 你不能也不应该这样做。

    2. 如果您不想将数据保存在静态字段中,请将它们移动到扩展的Application类(确保您使用特定的xml参数将其指向AndroidManifest.xml)并从那里访问它。只要您Application通过Context投放到自定义类,就可以访问context.getApplicationContext()课程。

    3. 要告诉Android使用您的自定义Application类,请在AndroidManifest.xml中使用以下内容:

      <application
          android:name=".YourAppClass"
          ...>
      
      ...
      </application>
      
      1. 我不确定第四个问题是否合适。基本上,如果您有多个值,则需要将结果存储在某些集合中,即ArrayList。您的整个问题可以用Map<Question,List<Answer>>然后&lt; - 任意类名称来表示(这些也可以是枚举)