Android中的POJO与游标

我通常倾向于使用POJO来定义应用程序的模型层,例如Article,Comment等。

我正要在我的一个ListView的适配器中实现一个AlphabetIndexer。 现在这个适配器接受文章的集合,我通常从我的包装SQLiteDatabase周围。

AlphabetIndexer构造函数的签名如下所示:

public AlphabetIndexer (Cursor cursor, int sortedColumnIndex, CharSequence alphabet) 

由于这不接受集合或类似的东西,只是一个光标,它让我想知道:也许我不应该为我的模型创build对象,只是使用数据库返回的游标

所以问题是,我想:我该怎么做,用POJO的Collections来表示数据,还是只在我的应用程序中使用Cursors?

任何input?

Solutions Collecting From Web of "Android中的POJO与游标"

我遇到类似的问题。 现在,我正在远离POJO。 但请注意,如果您愿意,可以为POJO集合创build自己的Cursor界面。

我喜欢创build游标支持的POJO类。 一个游标支持的POJO类有一个构造函数,它带有一个Cursor并提供以下好处:

  • 易于使用的getter返回适当的内容types,比获取索引要好得多,并且必须记住数据库中的数据types
  • Getter方法计算来自其他获取者的结果,就像OO编程应该是一样的
  • Getter返回值可以是枚举!

这几个好处是值得的一些样板代码,许多错误已经避免,现在的用户工程师不访问游标列本身。 我们仍然使用CursorAdapter类,但bindView方法的第一行是从光标创build光标支持的POJO,从此代码是美丽的。

下面是一个示例实现,对于用户工程师来说,将一个不透明的光标变成明确定义的User对象是一个简单的事情,从那时起,只要后备光标没有closures,它就可以像普通的POJO一样被传递和访问。 SmartUserCursor是我写的一个特殊类,用于确保在访问游标之前,游标的位置被记住和恢复,并且还存储游标列索引,因此查找速度快。

例:

 public class User { private final SmartUserCursor mCursor; public User(SmartUserCursor cursor, int position) { mCursor = new SmartUserCursor(cursor, position); } public long getUserId() { return mCursor.getLong(SmartUserCursor.Columns.userId); } public UserType getType() { return UserType.valueOf(mCursor.getString(SmartUserCursor.Columns.type)); } public String getFirstName() { return mCursor.getString(SmartUserCursor.Columns.firstName); } public String getLastName() { return mCursor.getString(SmartUserCursor.Columns.lastName); } public final String getFullName() { return getFirstName() + " " + getLastName(); } public static User newUserFromAdapter(BaseAdapter adapter, int position) { return new User((SmartUserCursor)adapter.getItem(position), position); } public static User newUserBlocking(Context context, long UserId) { Cursor cursor = context.getContentResolver().query( Users.CONTENT_URI_CLIENT, Users.DEFAULT_USER_PROJECTION, Users.Columns.USER_ID+"=?", new String[] {String.valueOf(UserId)}, null ); if (cursor == null || !cursor.moveToFirst()) { throw new RuntimeException("No User with id " + UserId + " exists"); } return new User(new SmartUserCursor(cursor, Users.DEFAULT_USER_PROJECTION), -1); } public final void closeBackingCursor() { mCursor.close(); } } 

一个投票实体对象(PO​​JOs)。 传递游标,特别是UI层,对我来说是非常错误的(不pipeAndroid sdk有没有暗示这样做)。 通常有几种方式来填充您的用户界面,我倾向于避免那些直接使用游标。 例如,为了填充我的自定义列表视图,我使用了一个SimpleAdapter并为我的集合对象提供了将自己的表示作为List<? extends Map<String, ?>>返回的能力List<? extends Map<String, ?>> 为SimpleAdapter的构造函数List<? extends Map<String, ?>>

我使用了一个模式,其中每个表都由一个实体对象包装,并有一个提供者类来处理与该实体相关的CRUD操作。 可选地,如果我需要集合的扩展function,我也包装它们(即EntityItems extends ArrayList<EntityItem> )提供者有一个基类,我传递一个DbAdapter类的引用,

除了个人偏好之外,最大的原因是我想尽可能远离我的UI来隐藏这种代码:

 String something = cursor.getString(cursor.getColumnIndex(COLUMN_NAME_CONSTANT)); 

如果我在用户界面层看到这样的代码,我通常希望看到更糟糕的事情。 也许我在企业界工作的时间太长了,但是我更喜欢可读性,除非有一个合理的性能问题,或者是足够小的任务,performance力只是企业的过度杀手。

答案是4岁。 我认为现在我们有足够的CPU能力来摆脱更多的东西。 我的想法是只与POJO和ArrayLists一起工作; 并扩展CursorLoader以将光标映射到后台的POJO并将数组列表传送到活动;

除非你查询了数百行,但是,那么你多长时间一次使用POJO,getter和setter