SQLiteOpenHelper 方法应该接受对象还是 ID?

Should SQLiteOpenHelper methods accept objects or IDs?

这可能更像是一个风格/标准/实践问题,但以下哪项是更好的方法以及原因:

public long insertSomething(MyAccount account, Employee employee, double rating) {
    ContentValues values = new ContentValues();
    values.put(ACCOUNT_ID, account.getId());
    values.put(EMPLOYEE_ID, employee.getId());
    values.put(RATING, rating);
    return mDatabase.insert(MY_TABLE, null, values);
}

这基本上是接受对象,然后在方法中使用它们的 ID 来执行查询。

或者:

public long insertSomething(long accountId, long employeeID, double rating) {
    ContentValues values = new ContentValues();
    values.put(ACCOUNT_ID, accountId);
    values.put(EMPLOYEE_ID, employeeID);
    values.put(RATING, rating);
    return mDatabase.insert(MY_TABLE, null, values);
}

有理由做其中之一吗?我不确定我应该采用哪种方法。

这两种实施方式同样有效,因此归结为对您来说更直接、更友好的使用方式。

有时有效性取决于纯性能以外的因素,例如可读性和一致性。关于一致性,如果你的 SQLiteOpenHelper 中的所有方法都只使用对象或只使用单个值作为参数,那么维护代码会更容易一些,因为在长 运行 中你习惯了代码的一般结构。

首先,您将代码放错了地方。当然,它在技术上是可行的,但从逻辑上讲,SQLOpenHelper 顾名思义,用于不同的目的。因此,一旦您正确分离了代码——这取决于目的以及您在应用程序中传递数据的方式。如果你主要使用 ID,那么第二种方法会更适合,如果你递交对象,那么第一种方法。如果混合,那么也许这就是你最终会得到的:

public long insertSomething(long accountId, Employee employee, double rating) {
    return insertSomething(accountId, employee.getId(), rating);
}

public long insertSomething(long accountId, long employeeID, double rating) {
    ContentValues values = new ContentValues();
    values.put(ACCOUNT_ID, accountId);
    values.put(EMPLOYEE_ID, employeeID);
    values.put(RATING, rating);
    return mDatabase.insert(MY_TABLE, null, values);
}

但也许您只是需要熟悉 ORM,这样您很可能会得到(构造函数也可以接受 Employee 对象,现在无关紧要):

new EmpoleeRating(accountId, employeeId, rating)
    .save();