2013-02-13 1 views
1

У меня есть таблица фильмов, в которой много столбцов и класс, который представляет таблицу с одинаковыми типами столбцов/полей в одном порядке (один int для id и все остальные строки) I есть этот код, который пытается вставить запись о фильме из объекта movie в базу данных. У меня проблема, которая говорит, что метод put не может взять эту группу или аргументы (String, capture#2-of ?) есть что-нибудь лучше или немного хуже, чем для решения моей проблемы?
EDIT: Можете ли вы объяснить мне, почему я ошибаюсь?Динамический листинг из пользовательского объекта в строку sqlite

ContentValues contentValues = new ContentValues(); 
Field[] fields = movie.getClass().getFields(); 
for(int i = 0; i < fields.length; i++) 
{ 
    contentValues.put(allColumns[i], fields[i].getType().cast(fields[i].get(movie))); 
} 

ответ

2

fields[i].getType().cast(fields[i].get(movie)) возвращает тип Object и нет перегрузки для put (...), который принимает объект в качестве второго аргумента.

При использовании значений содержания добавить (...) методы, вы должны сначала преобразовать значения примитивных типов, таких как Int, String, Boolean, длинный или байт []

Вы можете сериализовать данные в сгустка (как массив байтов) или другое представление, такое как String.

EDIT: Пожалуйста, смотрите комментарии, кажется, что Field.getType() возвращает общий класс, который вам нужно будет бросить перед вызовом актеров(), а именно: -

Class<String> fieldType = (Class<String>) fields[i].getType(); 

Но это не поможет получить еще, так как вы должны знать тип фронт, что вы могли бы сделать что-то вроде этого, вместо:

ContentValues contentValues = new ContentValues(); 
Field[] fields = movie.getClass().getFields(); 
for(int i = 0; i < fields.length; i++) 
{ 
     Class<?> fieldType = fields[i].getType(); 

     if(String.class.isAssignableFrom(fieldType)) { 
      contentValues.put(allColumns[i], (String) fields[i].get(movie)); 
     } else if(Integer.class.isAssignableFrom(fieldType)) { 
      contentValues.put(allColumns[i], (Integer) fields[i].get(movie)); 
     } 
     ...and so on for all types 
} 
+1

Из документации ['Class.cast (Object)'] (http://developer.android.com/reference/java/lang/Class.html#cast (java.lang.Object)) параметризован и должен возвращаться экземпляр класса. Затем ['Field.getType()'] (http://developer.android.com/reference/java/lang/reflect/Field.html#getType()) возвращает класс . Я думаю, что здесь указан параметр ** **. – nicopico

+0

Да, ваше право, в этом случае это было бы выведено из задания, но поскольку его не назначенный ContentValues ​​не может понять, какую перегрузку использовать, я обновлю ответ, спасибо за указание, что вне этого –

+0

На самом деле поцарапайте свой последний комментарий, Field.getType() возвращает , и ему нужно передать значение Field.getType() целевому типу перед вызовом –

0

Вы могли бы использовать что-то вроде ORMLite для управления запросов к базе данных. Вот некоторые documentation, чтобы использовать его с Android

+0

это может помочь мне делать мою работу, но я действительно должен знать, почему мой код не работает, ORMLite должен использовать методы instanceOf, и я хочу их избежать –

+0

ORMLite позволяет вам специфицировать ify нужный тип столбцов в аннотациях полей, а SQLite не делает * действительно * использование ввода столбцов, поэтому я не был бы так уверен в методах instanceOf (хотя бы не смотрел на исходный код). – nicopico

Смежные вопросы