Почему содержимое массива основного типа хранилища данных не сохраняется в ядре приложения? - PullRequest
0 голосов
/ 02 февраля 2012

У меня следующая проблема:

Java-объект содержит два массива основных типов хранилищ данных (com.google.appengine.api.datastore.Text и java.util.Date), а также int (длясохранение текущей заполненной позиции в массивах) и некоторые другие поля.

Я считаю, что в документации говорится, что массивы основных типов данных должны быть в порядке (см. http://code.google.com/appengine/docs/java/datastore/jdo/dataclasses.html, в разделе "Аннотации классов и полей").

Объект обновляется с использованиемметод с именем "updateAnswer".Когда вызывается этот метод, объект действительно обновляется (int увеличивается и сохраняется правильно), но массивы никогда не хранят ничего, кроме нулей.

Я был бы очень признателен, если бы кто-то мог указать, в чем заключается моя ошибка.

Вот объект (и его родитель для полноты):

@PersistenceCapable
public class TextualAnswer extends Answer {

    @Persistent
    private Text textAnswer;

    @Persistent
    private Date date;

    @Persistent
    private int pos;

    @Persistent
    private Text texts[];

    @Persistent
    private Date dates[];

    public TextualAnswer(Key question, Key user, Date date) {
        super(question, user, 0);
        this.textAnswer = null;
        this.date = date;
        pos = 0;
        texts = new Text[20];
        dates = new Date[20];
    }

    public String getTextAnswer() {
        return (textAnswer != null ? textAnswer.getValue() : null);
    }

    public Date getDate() {
        return date;
    }

    public void updateAnswer(String textAnswer, Date date) {
        if (texts.length == pos) { // expand?
            Text ttemp[] = texts;
            texts = new Text[pos * 2];
            System.arraycopy(ttemp, 0, texts, 0, pos);

            Date dtemp[] = dates;
            dates = new Date[pos * 2];
            System.arraycopy(dtemp, 0, dates, 0, pos);
        }
        texts[pos] = this.textAnswer;
        dates[pos] = this.date;
        pos++;

        this.textAnswer = (textAnswer != null ? new Text(textAnswer) : null);
        this.date = date;
    }
}

Родитель:

@PersistenceCapable
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
public abstract class Answer {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    private Key question;

    @Persistent
     private Key user;

    @Persistent
    private double score;

    @Persistent
    private boolean last;

    @Persistent
    private Text comment;

    public Answer(Key question, Key user, double score) {
        this.question = question;
        this.user = user;
        this.score = score;
        last = false;
        comment = null;
    }

    public Key getKey() {
        return key;
    }

    public Key getQuestion() {
        return question;
    }

    public Key getUser() {
        return user;
    }

    public double getScore() {
        return score;
    }

    public boolean isLast() {
        return last;
    }

    public String getComment() {
        return comment != null ? comment.getValue() : null;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public void setLast(boolean last) {
        this.last = last;
    }

    public void setComment(String comment) {
        this.comment = comment != null ? new Text(comment) : null;
    }
}

Заключительная заметка.Я понимаю, что вместо этого могу использовать списки и т. Д., И если я не пойму это, это действительно мой план резервного копирования.Но я хотел бы понять, почему это не работает, поэтому я хотел бы, чтобы любые предложения по переключению на объекты вместо массивов сопровождались объяснением того, почему массивы не работают;) Спасибо.

Ex animo, - Александр Инглинг

1 Ответ

0 голосов
/ 22 марта 2012

Итак, после некоторого сна мне пришло в голову ... это индекс массива.Я использую JDO.Я идиот;)

Я думал об удалении этого вопроса, но на тот случай, если кто-то еще его ищет, вот проблема:

http://www.datanucleus.org/products/datanucleus/jdo/orm/arrays.html

JDOне может знать, что индекс массива был обновлен, поэтому вы должны либо снова установить поле, либо использовать следующее, чтобы сообщить JDO об обновлении базы данных:

JDOHelper.makeDirty(obj, "fieldName");
...