Обычно я пытаюсь использовать полиморфизм, чтобы избежать использования таких вещей, как instanceof
, и мне не нравится использование фреймворков ORM, потому что они часто вызывают у меня гораздо больше головной боли, поэтому я попытался создать собственный класс базы данных с простыми функциями.Как вызывать определенные методы и возвращать определенные объекты на основе типа класса
Некоторые из вас, вероятно, хихикают: «Смотрите, ORM существуют по какой-то причине, не катитесь!» но я не пытаюсь сделать полномасштабную ORM; просто что-то легкое для моего конкретного использования, которое делает то, что мне нужно (см. более хихикание, я знаю).
Сейчас я ударяя этот вопрос:
Обычно при выполнении оператора выбора из SQLiteDatabase при создании объектов из таблиц данных, вы используете Cursor
объект, перебирать записи, а также создать экземпляр объекта в петля.
Рассмотрите класс Dog, который расширяет MyDatabaseClass.
Это считается плохой практикой, чтобы сделать что-то вроде этого:
public Cursor getDogCursor(Cursor cursor) {
return database.query(Dog.TABLE_NAME, Dog.COLS, null, null, null, null, null);
}
public Cursor getCursor(Class<? extends MyDatabaseClass>) {
if (clazz == Dog.class) return getDogCursor();
//...
return null;
}
public Dog getDogFromCursor(Cursor cursor) {
String dogId = getLongFromColumnName(cursor, Dog._ID);
String dogName = getStringFromColumnName(cursor, Dog.COL_NAME);
return new Dog(dogId, dogName);
}
public MyDatabaseClass getDatabaseObjectFromCursor(Class<? extends MyDatabaseClass> clazz, Cursor cursor) {
if (clazz == Dog.class) return getDogFromCursor(cursor);
//...
return null;
}
public List<? extends MyDatabaseClass> getList(Class<? extends MyDatabaseClass> clazz) {
Cursor cursor = getCursor(clazz);
List<MyDatabaseClass> list = new ArrayList<>();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
list.add(getDatabaseObjectFromCursor(clazz, cursor);
cursor.moveToNext();
}
cursor.close();
return list;
}
}
Так что теперь, если я хочу, чтобы получить список собак я могу сделать
List<Dog> dogList = (List<Dog>) myDatabaseInstance.getList(Dog.class);
или сделать это статический метод класса Dog, если это необходимо.
Рассматривается ли это действительный подход или считается опасным для сравнения такого класса? Мне бы очень хотелось использовать полиморфизм, но я не мог найти никакого хорошего способа сделать это из-за наличия разных полей для разных классов с разными конструкторами.
Исправлено несколько опечаток – user7086932
С чем вы пытаетесь это сделать - это прекрасно. Это то, что делают все инструменты orm - преобразование общего набора результатов в определенный набор объектов. Единственное отличие заключается в том, что отображение вытеснено в каком-либо файле xml, или аннотация заботится об этом. – donlys