在Android中,一旦用户清除管理应用程序中的数据,就会清除SharedPreference和SQLite数据库。申请名称 - >清除数据。如果在安装应用程序之前有一些信息应该保留,该怎么办?我想存储信息,直到应用程序安装在设备中。
有没有办法真正做到这一点?
在应用程序的生命周期内,是否有任何存储数据的方法?我已经读过2.2中有getExternalFiles()
选项,但这又取决于SDCard。应用无法在Android设备上永久存储数据吗?
答案 0 :(得分:6)
@大家-谁,说使用的内部存储 如果您转到设置>应用程序>管理应用程序>(应用程序)>清除数据,那么您正在谈论的文件将被删除这只是清除应用程序存储的数据的一种方法。此方法将擦除您的应用自首次运行以来存储的所有内容。
“永久”存储数据的唯一方法是将其存储在您可以控制的内容上,例如服务器上的数据库。
编辑:这是一个简单快速和脏的测试用例,用于存储和显示已保存的内部文件。此测试用例是对@sunil评论
的回应public class TestFileActivity extends Activity {
private static final String FILENAME = "hello_file";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
byte[] data = null;
String collected = null;
try {
FileInputStream fis = openFileInput( FILENAME );
data = new byte[fis.available()];
while(fis.read(data) != -1) {
collected = new String( data );
}
fis.close();
} catch ( FileNotFoundException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch ( IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Button b1 = (Button)findViewById( R.id.button1 );
b1.setOnClickListener( new OnClickListener() {
@Override
public void onClick( View v ) {
putInFile();
}
});
if( collected != null ) {
TextView tv = (TextView)findViewById( R.id.textView1 );
tv.setText( collected );
}
}
private void putInFile() {
String string = "hello world!";
try {
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
} catch ( FileNotFoundException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch ( IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<Button
android:text="Button"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
></Button>
</LinearLayout>
答案 1 :(得分:1)
使用文件并将其写入内部存储器或外部存储器。如果您需要加密,请使用加密。
编辑:某些版本的android有一个选项,您可以使用该选项删除特定应用程序(包括文件)的所有数据。您的应用必须向用户发出警告,并且必须引入功能以在文件被删除时处理该情况
答案 2 :(得分:1)
如果您不希望以这种方式清除数据,则可能不应使用首选项,因为用户可以自愿清除它们。
如果您再次选择sdcard作为存储介绍,则会让用户自行选择从存储中删除内容。
因此,您将使用另一个使用应用程序内部存储器的选项。您可以点击此链接
http://developer.android.com/guide/topics/data/data-storage.html
答案 3 :(得分:0)
您可以使用文件系统存储在内部SD卡
答案 4 :(得分:0)
即使在使用“清除数据”清除数据后,内部文件也不会被删除。 我将在下一个项目中使用相同的想法。想法是 - &gt;使用XML格式将数据存储在文件中,并使用相同的XML解析器。我希望它对我有用,并提供足够的提示来使用它。 以下是如何使用内部存储的线索 - &gt;
String filename = "file.txt";
FileOutputStream fos;
fos = openFileOutput(filename,Context.MODE_APPEND);
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(fos, "UTF-8");
serializer.startDocument(null, Boolean.valueOf(true));
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
serializer.startTag(null, "root");
for(int j = 0 ; j < 3 ; j++)
{
serializer.startTag(null, "record");
serializer.text(data);
serializer.endTag(null, "record");
}
serializer.endDocument();
serializer.flush();
fos.close();
使用DOM解析器读回数据:
FileInputStream fis = null;
InputStreamReader isr = null;
fis = context.openFileInput(filename);
isr = new InputStreamReader(fis);
char[] inputBuffer = new char[fis.available()];
isr.read(inputBuffer);
data = new String(inputBuffer);
isr.close();
fis.close();
/*
* converting the String data to XML format
* so that the DOM parser understand it as an XML input.
*/
InputStream is = new ByteArrayInputStream(data.getBytes("UTF-8"));
ArrayList<XmlData> xmlDataList = new ArrayList<XmlData>();
XmlData xmlDataObj;
DocumentBuilderFactory dbf;
DocumentBuilder db;
NodeList items = null;
Document dom;
dbf = DocumentBuilderFactory.newInstance();
db = dbf.newDocumentBuilder();
dom = db.parse(is);
// normalize the document
dom.getDocumentElement().normalize();
items = dom.getElementsByTagName("record");
ArrayList<String> arr = new ArrayList<String>();
for (int i=0;i<items.getLength();i++){
Node item = items.item(i);
arr.add(item.getNodeValue());
}