Android - 保存自定义对象 - 共享首选项或数据库?

时间:2014-03-12 19:09:56

标签: android database listview object save

我正在创建基于位置的提醒应用程序。

我有一个名为Reminder的自定义对象,它存储纬度,经度,位置名称和提醒主题 - 以及它所属的个人资料。

然后我将位置名称和sujbect输入到ListView中(此处也使用cardlibs)。

但是现在我需要保存关闭应用程序时的数据,并且想知道最好的方法 - 我是否存储了整个提醒'对象或我只是在共享首选项/数据库中存储多个数据。

这是我的代码 - 它非常低效/丑陋:

提醒:

public class Reminder implements Parcelable {

public double latitude;
public double longitude;
public String subject;
public String locationName;

public String profile;

public Reminder() {

}

public Reminder(Parcel in) {
    String[] data = new String[5];

    in.readStringArray(data);
    this.subject = data[0];
    this.locationName = data[1];
    this.latitude = Double.parseDouble(data[2]);
    this.longitude = Double.parseDouble(data[3]);
    this.profile = data[4];

}

public String getProfile() {
    return profile;
}

public double getLatitude() {
    return latitude;
}

public String getLocationName() {
    return locationName;
}

public double getLongitude() {
    return longitude;
}

public String getSubject() {
    return subject;
}

public void setProfile(String profile) {
    this.profile = profile;
}

public void setLatitude(double latitude) {
    this.latitude = latitude;
}

public void setLocationName(String locationName) {
    this.locationName = locationName;
}

public void setLongitude(double longitude) {
    this.longitude = longitude;
}

public void setSubject(String subject) {
    this.subject = subject;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {

    dest.writeStringArray(new String[] { this.subject, this.locationName,
            String.valueOf(this.latitude), String.valueOf(this.longitude), this.profile });
}

public static final Parcelable.Creator<Reminder> CREATOR = new Parcelable.Creator<Reminder>() {

    public Reminder createFromParcel(Parcel source) {
        // TODO Auto-generated method stub
        return new Reminder(source); // using parcelable constructor
    }

    public Reminder[] newArray(int size) {
        // TODO Auto-generated method stub
        return new Reminder[size];
    }

};

}

使用片段列出:

public class HomeFragment extends Fragment {

public static ArrayList<Card> cards = new ArrayList<Card>();

Reminder reminder;

public HomeFragment() {
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);

    reminder = getActivity().getIntent().getParcelableExtra("reminder");

    Card card = new Card(getActivity());

    CardHeader cardHeader = new CardHeader(getActivity());

    if (reminder != null) {
        cardHeader.setTitle(reminder.getSubject());
        card.addCardHeader(cardHeader);
        card.setTitle(reminder.getLocationName());
        cards.add(card);
    }

    CardArrayAdapter mCardArrayAdapter = new CardArrayAdapter(
            getActivity(), cards);

    CardListView listView = (CardListView) getActivity().findViewById(
            R.id.card_list);
    mCardArrayAdapter.notifyDataSetChanged();
    if (listView != null)
        listView.setAdapter(mCardArrayAdapter);




}

任何关于我的代码如何写得更好的批评也是非常有益的,因为我觉得我是一个巨大的新手并且遗漏了一些明显的东西会使它更有效率。

谢谢!

1 个答案:

答案 0 :(得分:3)

基本上,使用共享首选项与数据库的选择取决于许多因素:

1)我们谈论了多少个对象?他们有多复杂?

2)您打算搜索/操作这些对象,还是只是保存/加载它们。

3)您打算导出/移动/发送对象吗?

4)您是否希望跨应用程序上下文可以恢复对象 - 这超出了所讨论的单个应用程序。

在您的具体情况下,我会使用数据库。

http://developer.android.com/guide/topics/data/data-storage.html#pref

正如您在文档中所看到的,prefs并非真正用于对象存储 - 它是键值对。虽然您可以将对象存储为共享首选项中的多个键值对并从那里重构,但您必须经历一些奇怪的模型转换才能为多个对象执行此操作。简而言之,它并没有多大意义。