Сегодня я начал свой первый Android-проект и, конечно же, у меня возникла проблема. Я хочу, чтобы действительно простое приложение действительно попало во все дело программирования, и сейчас я в отпуске, поэтому я подумал, что было бы интересно сохранить время, когда я ложись спать/когда я просыпаюсь. Так что это не должно быть так сложно, и почти все работает так, как я хочу. Теперь проблема в том, что я сохраняю свои даты в ArrayList, поэтому они отображаются в ListView. Я читал, что я не могу сохранить ArrayLists в SharedPrefs, я не понял предмет SQLite, поэтому решил использовать FileOutputStream и т. Д. Я читал об этом в Интернете и пытался делать все, как они, но он просто не работает , В консоли нет ошибки, но если я закрою и снова открою приложение, все мои элементы исчезнут. Кто может мне помочь? :) (я не знаю, какая часть кода является важным, а что нет, так вот весь код)Сохранение ArrayList не работает
package com.gaminggears.sleeplist.sleep;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Path;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public class MainActivity extends AppCompatActivity{
private ListView dataListView;
private ListView dataListView1;
private ArrayAdapter arrayAdapter;
File file = new File("/mnt/sdcard/SleepApp/save.sav");
File dir = new File("/mnt/sdcard/SleepApp");
Date date = new Date();
SimpleDateFormat ft = new SimpleDateFormat ("E d-M-y kk:mm");
ArrayList<String> data = new ArrayList<String>();
ArrayList<String> data1 = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(!dir.exists()){
file.mkdir();
}
loadDataFromFile();
dataListView1 = (ListView) findViewById(R.id.listView2);
dataListView = (ListView) findViewById(R.id.listView);
arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data);
dataListView.setAdapter(arrayAdapter);
arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data1);
dataListView1.setAdapter(arrayAdapter);
System.out.println("\t\t" + data);
}
public void sleepClick(View v) {
data.add(ft.format(date));
arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data);
dataListView.setAdapter(arrayAdapter);
saveDataToFile();
}
public void wakeUpClick(View v){
data1.add(ft.format(date));
arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data1);
dataListView1.setAdapter(arrayAdapter);
saveDataToFile();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void saveDataToFile(){
try{
FileOutputStream sF = new FileOutputStream(file);
ObjectOutputStream save = new ObjectOutputStream(sF);
save.writeObject(data);
save.writeObject(data1);
save.close();
} catch(Exception exc){
exc.printStackTrace();
}
}
public void loadDataFromFile(){
try{
FileInputStream saveFile = new FileInputStream(file);
ObjectInputStream save = new ObjectInputStream(saveFile);
data.clear();
data.addAll((ArrayList) save.readObject());
data1.clear();
data1.addAll((ArrayList) save.readObject());
save.close();
} catch(Exception exc) {
exc.printStackTrace();
}
}
}
EDIT: обновил код. Теперь моя ошибка: «java.io.FileNotFoundException: /mnt/sdcard/SleepApp/save.sav: open failed: EACCES (Permission denied)». Есть идеи?
Возьмите каждую строку этого кода, отложите ее в сторону. Напишите программу, которая сохраняет ** любые ** данные в файл с помощью 'FileOutputStream'. Затем, если это работает, измените его, чтобы сохранить ** любую ** дату. Затем, как только это сработает, вернитесь к этой программе и посмотрите, можете ли вы ее исправить самостоятельно. – durron597
Распечатывает ли трассировку стека? – immibis
Возьмите совет выше, а также посмотрите на жизненный цикл Android. В отличие от обычной Java-программы, где точка входа в java является общедоступной void main (string [] args), Android не работает так, но вы можете сказать, что ее эквивалент будет onCreate() –