【问题标题】:Best approach for passing database record to new activity将数据库记录传递给新活动的最佳方法
【发布时间】:2014-07-18 07:58:20
【问题描述】:

我正在编写一个严重依赖 sqlite 数据库的 Android 应用程序。我不清楚将记录数据从一个活动传递到下一个活动的最佳方式(在内存和资源方面最有效)是什么。例如,有一个活动,您可以在其中查看客户记录,然后可以单击操作菜单项来编辑记录。目前,我通过打开它的Intent 将表名和记录 ID 传递给新活动,并在新活动中重新从数据库中提取所有数据。然而,我突然想到,传递一个包含所有记录数据的对象可能会更好(即更有效),该对象具有更新或删除记录的方法。每个表最多只有十几列,所以对象会很小,尽管在某些情况下为了适应表之间的一对一或一对多关系,@传递的数据对象987654322@ 将包含一个或多个数据对象作为字段。我正在寻找利弊,并在可能的情况下对最佳解决方案做出明确裁决。

这个

(查看记录活动)

Intent intent = new Intent(this, EditRecordActivity.class);
intent.putExtra(TABLE_NAME, tableName);
intent.putExtra(RECORD_ID, recordId);
startActivity(intent);

(编辑记录活动)

String tableName = getIntent().getStringExtra(ViewRecordActivity.TABLE_NAME);
String recordId = getIntent().getStringExtra(ViewRecordActivity.RECORD_ID);
Cursor c = db.query(tableName, DB_COLUMNS, "_ID = ?",new String[]{ recordId }, null,null, null);
// populate EditText fields with data from Cursor

或者这个

(客户类)

public class Customer extends Record{
  String id;
  String firstName;
  String lastName;
  String phone;

  public Customer(int recordId, String table){
    Cursor c = db.query(table, DB_COLUMNS, "_ID = ?",new String[]{ recordId }, null, null, null);
    c.moveToFirst();
    id = c.getString[0];
    firstName = c.getString[1];
    lasstName = c.getString[2];
    phone = c.getString[3];
    c.close();
  }
}

(查看记录活动)

Intent intent = new Intent(this, EditRecordActivity.class);
intent.putExtra(RECORD, customer);
startActivity(intent);

(编辑记录活动)

Record r = getIntent().getExtras().getExtra(ViewRecordActivity.RECORD);
// populate fields directly from data object, no call to database until changes are saved

【问题讨论】:

    标签: android sqlite optimization


    【解决方案1】:

    目前,我将表名和记录 ID 传递给新活动 通过打开它的意图,在新活动中我重新提取所有 数据库中的数据。

    我建议您将自定义唯一 id 标识符添加到 Object 数据模型 以及一个定义Object 所属数据库的变量。这样做可以避免查询。

    然而,我突然想到,也许这会更好 (即更有效)传递一个包含所有记录的对象 数据,具有更新或删除记录的方法。

    在尝试通过Activities 传递自定义Object 时,您将面临的一个问题是您需要使Object 实现Parcelable 接口。这是必需的,以便 Android 知道如何编组/解组您的 Object

    我可以建议您做的一件事是研究 DAO(即 GreenDAOORMLite 库。它们大大简化了与数据库的交互。

    【讨论】:

      【解决方案2】:

      我会推荐第一个并查询第二个活动的onCreate 中的值。这样做的原因是每次创建活动时都会重新查询记录,然后可以在后台更改记录时获取最新信息。因此,如果用户从最近的活动中启动活动,它可能会绕过之前的活动并拥有过时的数据。只是我的 2 美分。

      【讨论】:

      • 虽然此时应用程序完全是原生的,但我确实计划在多个设备之间引入云同步,在这种情况下,您的观点就变得相关了。感谢您的提示!
      • 欢迎您。如果您确实在活动级别执行此操作,则应该按照@Aviad 的提示在主线程之外执行查询。
      • 谢谢,我知道了。由于显而易见的原因,我的代码示例被简化了......
      【解决方案3】:

      一般概念:

      当你面对这个问题时,你只需要思考:

      1.如果您有大量数据,唯一的解决方案是延迟加载,这意味着仅在需要时才加载数据。这会导致多次访问数据库,并且您的软件会因为 I/O 操作而变慢很“贵”

      2.如果你有小数据,你可以考虑这两个选项: - 你的小数据有时会增长吗?如果是,那么您必须帮助您的应用具有可扩展性。所以延迟加载是正确的选择。

      3.如果数据很小且恒定,您可以加载一次并启动应用程序并在活动之间传递它。您不需要超过 1 个查询,您的应用程序会更快

      这基本上是所有选项:)

      希望有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        相关资源
        最近更新 更多