【问题标题】:Implementing Parcelable Class That Requires Context实现需要上下文的 Parcelable 类
【发布时间】:2011-05-24 15:18:34
【问题描述】:

我希望我的数据类实现 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?

【问题讨论】:

  • 也许您可以使用 (MyApp)getApplicationContext() 在 MyApp extends Application 中保存/读取动态数据。

标签: android parcelable


【解决方案1】:

Parcelable 接口类似于 Java 接口 Serializable。实现此接口的对象应该是可序列化的。这意味着应该可以将对象转换为可以保存在文件中的表示,例如

字符串、int、float 或 double 等很容易实现,因为它们都有字符串表示。 Context 类显然是不可序列化和不可打包的,因为它可以是例如一个 Activity。

如果您想将活动的状态保存到数据库中,您应该找到另一种方法。

【讨论】:

    【解决方案2】:

    您的 Record 类可能并不真正需要访问 SQL 数据库。其原因正是您现在遇到的问题:将 Context 注入回每个 Record 非常困难。

    也许更好的解决方案是实现一个静态RecordSQLService,它有方法save(Record r)。您的应用程序可以在应用程序启动时启动RecordSQLService,因此只要您的应用程序运行它就会保持活动状态,并且它负责从 Record 类中保存,这使得您不再需要 Context 并且可以包裹它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2021-01-13
      • 1970-01-01
      相关资源
      最近更新 更多