如何保存自定义对象的arraylist,以便当我的Android应用程序关闭/重新启动时,arraylist保持不变

时间:2014-07-29 19:00:09

标签: java android arraylist

我有一个" Swimmer"对象,我不希望每次应用关闭时删除它。我已阅读有关序列化和使用共享首选项的内容,但我不知道在哪里编写该代码或它的作用。

arraylist当前存储为主活动类中的公共变量,其他活动可以访问它。

public ArrayList<Swimmer> allSwimmers = new ArrayList<Swimmer>();

这是我使用列表视图显示列表中所有游泳者的活动,当点击其中一个游泳者时,它会转到一个新活动以显示游泳者信息。

一切都很好,我只想保存&#34; MyActivity.allSwimmers&#34; (arraylist)应用程序关闭并重新启动其非空白的地方

public class AllSwimmers extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.all_swimmers);

        ListAdapter theAdapter = new ArrayAdapter<Swimmer>(this, android.R.layout.simple_list_item_1,
            MyActivity.allSwimmers);

        ListView theListView = (ListView) findViewById(R.id.allSwimmersList);

        theListView.setAdapter(theAdapter);

        theListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                Intent goToIndiv = new Intent(AllSwimmers.this, IndivSwimmer.class);

                final int result = 1;

                goToIndiv.putExtra("position", position);

                startActivityForResult(goToIndiv, result);
            }
        });
    }
}

2 个答案:

答案 0 :(得分:2)

为此,您必须将数据保存在SQLiteDatabase中。这是一个很好的教程,如何做到这一点:

http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

答案 1 :(得分:2)

通常,为了能够将自定义数据对象存储到内存中,您想要做的是使它们可序列化。

您必须记住,正在运行的应用程序范围之外的持久数据需要映射到物理内存中。换句话说:

(至于)序列化您的数据结构/对象,意味着将其分解为可以存储的格式。 当然,序列化的另一个方面是能够将这些序列化数据从内存中提取到您的环境中作为易失性对象/结构。

在Java中,这一切都是通过将自定义数据附加到Serializable接口来完成的。但是,由于我们正在讨论Android,因此建议坚持使用 Parcelable 界面(更好的速度,效率和安全管理数据)

所以,首先,似乎没有其他合理的方法来完成你所要求的,而不是以某种方式通过Swimmer的序列化(使用Parcelable接口)......

以下是使用Parcelable进行数据建模POJO的简单示例:

public class Profile implements Parcelable {

        private String id;
        private String name;
        private String category;


        public Profile(String id, String name, String category){
            this.id = id;
            this.name = name;
            this.category = category;
       }

       public Profile(Parcel in){
           String[] data = new String[3];

           in.readStringArray(data);
           this.id = data[0];
           this.name = data[1];
           this.category = data[2];
       }

       @Оverride
       public int describeContents(){
           return 0;
       }

       @Override
       public void writeToParcel(Parcel dest, int flags) {
           dest.writeStringArray(new String[] {this.id,this.name,this.category});
       }
       public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
           public Profile createFromParcel(Parcel in) {
               return new Profile(in); 
           }

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

“问题”是,如果您想使用 SharedPreferences ,它不具有对 Parcelable 的内置支持,也没有任何其他形式的序列化数据映射协议,因为它仅用于设计的原始键/值映射。 (SharedPreferences构建为存储需要持久性的应用程序配置值的方法,例如声音开/关,凭据等,而不是大数据堆)。

然而,为了使用JSON存储自定义Data对象,使用SharedPreferences有一个相当简洁的“解决方法”。当然,JSON数据的一大优势是可以轻松地序列化为String原语。

使用默认的JSON api(org.json),您可以使自己的解析/转换函数对任何类型的POJO数据都有效。 JSON数据管理有许多不同的api,并且可以轻松地操作它。以下是嵌套json数组的基本示例:

SharedPreferences prefs = this.getSharedPreferences("MyCustomDataPreferences", Context.MODE_PRIVATE);

/* Assuming this JSON from SharedPreferences: "{animals : [{familyKey:Dogs},
  {familyKey:Cats}, {familyKey:Lizards}]}" */

//Notice how JSONObject just takes a String as an argument:

JSONObject obj = new JSONObject(prefs.getString("animalsJSON", null));

List<String> list = new ArrayList<String>();
JSONArray array = obj.getJSONArray("animals");

//Store into list all values with key "familyKey":

for(int i = 0 ; i < array.length() ; i++){
    list.add(array.getJSONObject(i).getString("familyKey"));
}

正如您所看到的,通过这种方式,您可以简单地存储由JSON对象组成的字符串值,然后使用内置的SharedPreferences将它们还原为java对象以供使用。