0

我有一个表示数据库记录的抽象 Record 类,它有两个抽象方法:getTable() 和 getColumns()。然后我有一个扩展 Record 的 Customer 类,我在这个类中实现了这些抽象方法。

我试图弄清楚如何获取所有客户的列表,但要尽可能地保持方法可重用,所以我更喜欢 getAllRecords(Record record) 方法而不是 getAllCustomers() 方法。

这是我到目前为止所拥有的。我无法创建新的 Record() 对象,因为它是抽象的,需要创建传入的类的实例。

//i'd like to do something like this to get all of the Customers in the db 
// datasource.getAllRecords(new Customer());

public List<Record> getAllRecords(Record record) {
    List<Record> records = new ArrayList<Record>();

    Cursor cursor = database.query(record.getTable(),
        record.getColumns(), null, null, null, null, null);

    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {
      Record record = cursorToRecord(cursor, record);
      records.add(record);
      cursor.moveToNext();
    }
    // Make sure to close the cursor
    cursor.close();
    return records;
  }

  private Record cursorToRecord(Cursor cursor, Record record) {


    Record record = new Record(); <-- somehow clone a new instance of the record that was passed in

    record.setId(cursor.getLong(0));
    record.setValue("aKey",cursor.getString(1));
    return record;
  }

使用某种 RecordRegistry 对象而不是为每个 Record 子类设置单独的工厂类是否有意义?

class RecordRegistry{

    private static final List<Record> RECORDS;

    static {
            final List<Record> records = new ArrayList<Record>();
            records.add(new Customer());
            records.add(new Company());

            RECORDS = Collections.unmodifiableList(records);
    }

    public List<Record> allRecords(){

        return RECORDS;
    }

    public Record buildRecord(Class cClass){

        String className = cClass.getName().toString();

        if(className.equalsIgnoreCase("customer")){
            return new Customer();
        }else if(className.equalsIgnoreCase("company")){
            return new Company();
        }
        return null;
    }
}
4

4 回答 4

1

您可以获得 的类Record,前提是 的所有子类Record都有一个无参数的构造函数。

Record newRecord = record.getClass().newInstance();

请注意,您可以只传递类而不是对象本身。

您还可以传递一个负责实例化正确类的工厂。

interface RecordFactory {
    Record create();
}

class CustomerFactory implements RecordFactory {
    Record create() {
        return new Customer();
    }
}

public List<Record> getAllRecords(RecordFactory factory) {
    ...
    for(...) {
        ...
        Record record = factory.create();
        ...
    }
    ...
}
于 2013-04-19T13:47:06.950 回答
0

一个奇怪的用例。我会让cursorToRecord方法抽象。这将逻辑推入每个类,它知道如何从Cursor.

public abstract Record cursorToRecord(Cursor cursor, Record record);
于 2013-04-19T13:32:04.513 回答
0

不直接回答您的问题,而是查看有关内容提供程序的 Android 指南 ( https://developer.android.com/guide/topics/providers/content-providers.html )。它们允许灵活的数据访问以及其他好处。我发现它们值得最初的学习和设置工作(尤其是在使用 Loaders 时)

于 2013-04-19T13:39:46.417 回答
0

反射呢?

Record newRecord = record.getClass().newInstance();
于 2013-04-19T13:47:11.743 回答