Реализация класса Parcelable, который требует контекста - PullRequest
7 голосов
/ 24 мая 2011

Я бы хотел, чтобы в моем классе данных был реализован Parcelable, чтобы его можно было разделить между операциями, однако для этого также нужна ссылка на Context, чтобы поля можно было сохранить в SQLiteDatabase.

Это, однако, проблема, поскольку метод Parcelable.Creator createFromParcel имеет только один параметр Parcel.

public abstract class Record implements Parcelable {

protected Context context;
protected String value;

public Record(Context context) {
    this.context = context;
}

public Record(Parcel parcel) {
    this.value = parcel.readString();
}

public void save() {
    //save to SQLiteDatabase which requires Context
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel parcel, int flag) {
    parcel.writeString(value);
}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public Record createFromParcel(Parcel parcel) {
        return new Record(in);
    }

    public Record[] newArray(int size) {
        return new Record[size];
    }
};
}

Как класс, реализующий Parcelable, также ссылается на Context, чтобы сохранить его в SQLiteDatabase?

Ответы [ 2 ]

6 голосов
/ 24 мая 2011

Интерфейс Parcelable похож на интерфейс Java Сериализуемый . Объекты, которые реализуют этот интерфейс, должны быть сериализуемыми. Это означает, что должна быть возможность преобразовать объект в представление, которое можно сохранить в файле, например,

Это легко возможно для строки, int, float или double и т. Д., Потому что все они имеют строковое представление. Класс Context явно не сериализуем и не может быть отделен, потому что это может быть, например, Activity.

Если вы хотите сохранить состояние вашей активности в базе данных, вы должны найти другой способ сделать это.

0 голосов
/ 17 декабря 2013

Возможно, вашему классу Record действительно не нужен доступ к базе данных SQL.Причиной этого является именно та проблема, с которой вы столкнулись сейчас: очень трудно внедрить контекст обратно в каждую запись.

Возможно, лучшим решением было бы реализовать статический RecordSQLService, который имеет метод save(Record r),Ваше приложение может запуститься RecordSQLService при запуске приложения, поэтому оно будет оставаться активным до тех пор, пока оно работает, и оно берет на себя ответственность за сохранение вдали от класса Record, что делает его таким, что вам больше не нужен Context, и можетПосылка это.

...