【问题标题】:Saving Arraylist in Android在 Android 中保存 Arraylist
【发布时间】:2011-11-05 22:12:14
【问题描述】:

我正经历着世界上最糟糕的时刻,试图了解如何永久保存任何东西。我想要做的就是保存一个整数数组列表,我可以在其中保留一些高分。而且我似乎无论如何都找不到这样做。我尝试序列化数据并使用文件输入流来保存它,但是没有办法加载它并对数据进行反序列化,因为从文件输入流中读取数据的唯一方法是将其作为 int 读取。我尝试单独写入和读取数组列表中的每个数字,但随后出现空指针错误。有没有人有这样做的好方法/有一个很好的例子来说明如何做到这一点?提前致谢。

-德里克

【问题讨论】:

标签: java android arraylist bytearray


【解决方案1】:

我会使用 SQL 数据库而不是处理数据文件。

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

【讨论】:

    【解决方案2】:

    可能最简单的方法是从可以存储在 SharedPreference 中的字符串序列化/反序列化对象。下面的代码应该为你做:

    public static void saveArray(Context ctx, int[] array) {
            String strArr = "";
            for (int i=0; i<array.length; i++) {
                strArr += array[i] + ",";
            }
            strArr = strArr.substring(0, strArr.length() -1); // get rid of last comma
    
            Editor e = PreferenceManager.getDefaultSharedPreferences(ctx).edit();
            e.putString("MY_ARRAY", strArr);
            e.commit();
        }
    
        public static int[] getArray(Context ctx) {
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
            String str = prefs.getString("MY_ARRAY", null);
            String[] strArr = str.split(",");
            int[] array = new int[strArr.length];
            for (int i=0; i<strArr.length; i++) {
                array[i] = new Integer(strArr[i]);
            }
            return array; 
        }
    

    【讨论】:

    • 您也可以只使用putStringSet(String key, Set&lt;String&gt; values)getStringSet(String key, Set&lt;String&gt; defValues),尽管您最终仍会将int 转换为字符串。
    • 也仅限 API 11 (Android v3.0.x) 及以上版本
    【解决方案3】:

    我会创建一个名为 PersistentManager 的类,或者添加这两个方法。您必须将 getApplicationContext() 传递给这些方法。

    public static ArrayList<Integer> getArrayList(Context context)
    {
        String line;
        ArrayList<Integer> list = new ArrayList<Integer>();
        StringBuilder fullText = new StringBuilder();
    
        try {
            FileInputStream stream = context.openFileInput("myFileName");
            InputStreamReader inputStreamReader = new InputStreamReader(stream); 
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            while ((line = bufferedReader.readLine()) != null) 
            {
                fullText.append(line);
            }
            if (fullText.length() > 0) 
            {
                String[] myInts = fullText.toString().split(",");
                for (String intString : myInts)
                {
                    list.add(Integer.getInteger(intString));
                }
            }
        } catch (Exception e) {}
        return list;
    }
    
    public static void setArrayList(ArrayList<Integer> myInts, Context context)
    {
        FileOutputStream fos;
        try
        {
            fos = context.openFileOutput("myFileName", Context.MODE_PRIVATE);
            for (Integer integer : myInts)
            {
                fos.write((integer.toString() + ",").getBytes());
            }
            fos.close();
        } catch (FileNotFoundException e){} 
        catch (IOException e){}
    }
    

    【讨论】:

    • 我有这个通用代码在 2.1 及更高版本的生产环境中运行。
    猜你喜欢
    • 2015-04-12
    • 2014-05-17
    • 2014-06-14
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2011-03-09
    • 2021-04-02
    • 2021-09-15
    相关资源
    最近更新 更多