Как загрузить и записать данные с SD? - PullRequest
0 голосов
/ 30 января 2020

Идея заключается в следующем. когда я запускаю приложение, оно переходит к методу загрузки данных. Поиск файла, если есть загрузка из него, если вы не загружаете массив с данными, которые я дал ему. Когда вы нажимаете кнопку для сохранения на SD, вы создаете файл в папке приложения на SD. Я оставляю свой код Метод написания не дает ошибки, но я не знаю, все ли в порядке. при загрузке данных я получаю эту ошибку enter image description here

 public class MainActivity extends AppCompatActivity implements Serializable {
    private ArrayList<Cuadros> datos = new ArrayList();
    private ListView listCuadros;
    private AdaptadorCuadros adaptador;
    private Context contexto;
    private int i = 0;
    private int REQUEST_WRITE_EXTERNAL_STORAGE = 0;
     File memExt = Environment.getExternalStorageDirectory();
    File fichero = new File(memExt.getAbsolutePath(), "fichero.dat");

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tabs = findViewById(R.id.tabhost);
        tabs.setup();
        TabHost.TabSpec spec = tabs.newTabSpec("mitab1");
        spec.setContent(R.id.tab1);
        spec.setIndicator("Lista del museo");
        tabs.addTab(spec);
        spec = tabs.newTabSpec("mitab2");
        spec.setContent(R.id.tab2);
        spec.setIndicator("Editar/Añadir");
        tabs.addTab(spec);
        tabs.setCurrentTab(0);
        contexto = this;
        cargarDatos();
        this.adaptador = new AdaptadorCuadros(this, this.datos);
        titulo = findViewById((R.id.titulo));
        autor = findViewById((R.id.autor));
        estilo = findViewById(R.id.estilo);
        precio = findViewById(R.id.precio);
        fecha = findViewById(R.id.fecha);
        guardar = findViewById(R.id.guardar);
        this.guardar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                guardarEdit();
            }
        });
        guardarSD = findViewById((R.id.guardarSD));
        this.guardarSD.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                guardarEnSD();
            }
        });
        this.listCuadros = findViewById(R.id.listView1);
        listCuadros.setAdapter(adaptador);
        registerForContextMenu(listCuadros);
        listCuadros.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                i = position;
                return false;
            }
        });
    }
 private void guardarEnSD() {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    Toast.makeText(this, "Se necesita acceso de escritura a la SD",
                            Toast.LENGTH_SHORT).show();
                }
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        REQUEST_WRITE_EXTERNAL_STORAGE);
            } else {
                escribirSD(datos);
            }
        } else {
            Toast.makeText(this, "La memoria externa no está disponible",
                    Toast.LENGTH_SHORT).show();
        }
    }

    private void escribirSD(ArrayList<Cuadros> datos) {
        try {
            ObjectOutputStream ficheroSalida = new ObjectOutputStream(new FileOutputStream(fichero));
            ficheroSalida.writeObject(datos);
            ficheroSalida.flush();
            ficheroSalida.close();
            Toast.makeText(this, "Los datos fueron grabados correctamente en la SD",
                    Toast.LENGTH_SHORT).show();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    private void cargarDatos() {
        if (fichero.exists()) {
            try {
                ObjectInputStream ficheroEntrada = new ObjectOutputStream(new FileInputStream(fichero));
                datos = (ArrayList<Cuadros>) ficheroEntrada.readObject();
                ficheroEntrada.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } else {
            datos.add(new Cuadros("La Mona Lisa", "Leonardo da Vinci", "Renacentista", 713000000, Year.of(1503)));
            datos.add(new Cuadros("El grito", "Munch", "Expresionismo", 119900000, Year.of(1893)));
            datos.add(new Cuadros("La persistencia de la memoria", "Dalí ", "Surrealismo", 400000000, Year.of(1931)));
            datos.add(new Cuadros("El nacimiento de Venus", "Sandro Botticelli", "Gotico", 10000000, Year.of(1482)));
            datos.add(new Cuadros("Guernica", "Pablo Picasso", "Cubismo", 300000000, Year.of(1937)));
            datos.add(new Cuadros("Los jugadores de cartas", "Paul Cézanne", "Posimpresionismo", 191000000, Year.of(1890)));
        }
    }
    }

1 Ответ

2 голосов
/ 30 января 2020

Похоже, вы случайно не изменили ObjectOutputStream на ObjectInputStream

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...