【发布时间】:2015-11-05 17:25:49
【问题描述】:
今天我开始了我的第一个 Android 应用项目,当然,我遇到了一个问题。我想制作一个非常简单的应用程序来完成整个编程工作,而且我现在正处于假期中,所以我认为节省睡觉/醒来的时间会很有趣。所以它不应该这么难,几乎所有的东西都像我想要的那样工作。 现在的问题是,我将日期保存在 ArrayList 中,因此它们会显示在 ListView 中。我读到我无法在 SharedPrefs 中保存 ArrayLists,我不了解 SQLite 的东西,所以我决定使用 FileOutputStream 等。我在互联网上阅读了它并尝试像他们一样做所有事情,但它根本不起作用.控制台中没有错误,但如果我关闭并重新打开应用程序,我的所有元素都消失了。 谁能帮助我? :) (我不知道代码的哪一部分重要,哪一部分不重要,所以这里是整个代码)
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();
}
}
}
编辑:更新了代码。现在我的错误是“java.io.FileNotFoundException:/mnt/sdcard/SleepApp/save.sav:打开失败:EACCES(权限被拒绝)”。有什么想法吗?
【问题讨论】:
-
把这段代码的每一行,放在一边。编写一个程序,使用
FileOutputStream将任何数据保存到文件中。然后,如果可行,修改它以保存 any 日期。然后,一旦成功,回到这个程序,看看你是否可以自己修复它。 -
它是否打印堆栈跟踪?
-
按照上面的建议,还要看看 Android Activity Lifecycle。与典型的 Java 程序不同,Java 中的入口点是 public void main(string[] args),Android 不能这样工作,但你可以说它的等价物是 onCreate()
-
在我在 main 中尝试之前,我在 onCreate() 中有完全相同的代码。没用,所以我只是尝试了这是否会改变任何事情
标签: java android arraylist fileoutputstream