【问题标题】:How I can load a file and save this in a list of objects in Android?如何加载文件并将其保存在 Android 的对象列表中?
【发布时间】:2016-04-22 23:50:48
【问题描述】:

嘿,我的 Android 应用有问题。我是 Android 开发的新手,我尝试了一个小 Android 应用程序。我想将输入保存在文件中并加载它。我想在文件中保存一个对象(或对象列表)序列化。我的想法是加载此文件(如果存在)并用它们填充我的 ListView,否则我有一条短信。

我在 LogCat 和 Android Monitor 中调试我的应用程序。我有一点想法错误在哪里。

问题是,如果我启动我的应用程序并且 onStart 方法开始。我执行一个函数,它给我一个记录列表。但是为此,我将文件加载到此列表中。(这是我认为的错误)。

这是我在 LogCat 中的错误:(其中的一部分)

04-22 19:41:29.547 13928-13928/de.tarasov.wladimir.leistungen E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                Process: de.tarasov.wladimir.leistungen, PID: 13928


  java.lang.RuntimeException: Unable to start activity ComponentInfo{de.tarasov.wladimir.leistungen/de.tarasov.wladimir.leistungen.persistence.RecordsActivity}: java.lang.ClassCastException: de.tarasov.wladimir.leistungen.models.Record cannot be cast to java.util.List

这是我的 MainActivity:

@Override
protected void onStart(){
    super.onStart();

    List<Record> records = RecordDAO.findAll(this);

    ArrayAdapter<Record> adapter =
            new ArrayAdapter<Record>(this,
                    android.R.layout.simple_list_item_1,records);

    mRecordsListView.setAdapter(adapter);

}  

这是 RecordDAO:

public static List<Record> findAll(Context ctx){

        List<Record> result;
        Object obj = null;

        File f = ctx.getFileStreamPath("records.obj");

        if(f.exists()){

            try(FileInputStream in = ctx.openFileInput("records.obj")){

                ObjectInputStream objIn = new ObjectInputStream(in);
                obj = objIn.readObject();

            }catch(Exception e){
                e.printStackTrace();
            }

        }

        if(obj != null){
            result = (List<Record>) obj;
        }else{
            result = new ArrayList<>();
        }

        return result;
    }

更新:这是我保存对象的方法。

public static void persistAll(Context ctx, List<Record> records){

    try(FileOutputStream out = ctx.openFileOutput("records.obj",Context.MODE_PRIVATE)){
        ObjectOutputStream objOut = new ObjectOutputStream(out);
        objOut.writeObject(records);
    }catch(Exception e){
        e.printStackTrace();
    }
}

【问题讨论】:

  • 日志猫消息说de.tarasov.wladimir.leistungen.models.Record cannot be cast to java.util.List所以取决于错误必须在findAll方法result = (List&lt;Record&gt;) obj;我认为你需要一个循环来循环遍历对象并且每次添加一个对象到列表
  • records.obj 中有哪些内容?该异常很可能是由result = (List&lt;Record&gt;) obj; 引发的。不使用 JSON 存储对象的任何特殊原因?如果你这样做了,你会使用 TypeToken 并做类似convert from Json to a typed ArrayList<T>

标签: java android android-studio serialization fileinputstream


【解决方案1】:

如果您能附上您将对象写入文件的代码,那就太好了。
正如错误消息所说,您可能正在文件中写入记录并尝试将其作为列表读取。相反,您应该将其编写为 ArrayList 并将其读取为 List。

【讨论】:

    【解决方案2】:

    您的应用程序似乎在此行崩溃:

    result = (List<Record>) obj;
    

    尝试检查obj 的类型。看起来它可能是Record 类型。如果是这种情况,请尝试将obj 添加到result

    List<Record> result = new ArrayList();
    if (obj instanceof Record) {
        result.add(obj);
    }
    

    【讨论】:

    • result.add(obj); // add() 方法希望我使用参数类型 -> add(int,Record), ...:(
    • 您的List 引用来自java.util 包吗? docs.oracle.com/javase/7/docs/api/java/util/List.html#add(E)
    • 如果您的resultjava.util.List,您可以通过调用result.add(obj);obj 添加到其中。这会将obj 添加到result 的末尾。无需指定索引。
    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 2013-11-13
    • 2022-12-07
    • 2012-02-12
    • 2018-08-17
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多