如何保存数据直到应用程序在android中卸载?
Posted
技术标签:
【中文标题】如何保存数据直到应用程序在android中卸载?【英文标题】:How to save data till application un-install in android? 【发布时间】:2011-07-18 08:55:50 【问题描述】:在 android 中,一旦用户从管理应用程序 -> 应用程序名称 -> 清除数据中清除数据,SharedPreference 和 SQLite 数据库就会被清除。如果在安装应用程序之前应该保留一些信息怎么办。我想存储信息,直到应用程序安装到设备中。
有没有办法真正做到这一点?
是否有任何方法可以在应用程序的生命周期内存储数据?我已经读到有getExternalFiles()
选项可从 2.2 开始,但这又取决于 SDCard。应用程序无法在 Android 设备上永久存储数据吗?
【问题讨论】:
【参考方案1】:@everyone-who-says-to-use-internal-storage 如果您转到设置>应用程序>管理应用程序>(应用程序)>清除数据,您正在谈论的那个文件将被擦除。这只是清除应用程序存储的数据的一种方法。此方法将清除您的应用自首次运行以来存储的所有内容。
“永久”存储数据的唯一方法是将其存储在您可以控制的东西上,例如服务器上的数据库。
编辑:这是一个简单的快速而肮脏的测试用例,用于存储和显示保存的内部文件。此测试用例是对@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_
android:layout_
>
<TextView
android:id="@+id/textView1"
android:layout_
android:layout_
android:text="@string/hello" />
<Button
android:text="Button"
android:id="@+id/button1"
android:layout_
android:layout_
></Button>
</LinearLayout>
【讨论】:
请到developer.android.com/guide/topics/data/…阅读。我还通过清除应用程序设置中的数据进行了检查。该文件不会在清除数据时被删除。它只会清除数据库和 sharedpreference。 这是不正确的!在任何文档中的哪个位置说,在用户通过应用程序信息中的“清除数据”按钮清除应用程序存储的数据后,存储的数据将持续存在?此外,我可以发布一个工作测试用例,它实际上会显示存储的所有内容将被删除!!!因此,在您对此进行测试并发现我是正确的之后,请您更正否决票。 @sunil 我发布了一个编辑以回应您的评论。我在模拟器中运行它。我可以看到选择按钮后创建的文件,并在设置>应用程序>管理应用程序>THEAPP>通过DDMS清除数据中选择“清除数据”后删除。 @DDosAttack 该选项并非在所有版本中都可见。可能较新的版本有它。如果在数据被删除时引入功能来处理这种特殊情况,我的解决方案仍然可以工作。但是您的解决方案需要一台并非总是可行的服务器。有限制。但可以通过良好的编码来克服它们。 @DDoSAttack - 很抱歉实际上对您的答案投了反对票。您是正确的,清除数据也会清除内部存储器。我猜 Android OS 2.2 及更高版本提供了 Clear Data 选项。应该有一些方法可以将一些信息存储到应用程序的生命周期。【参考方案2】:如果您不希望以这种方式清除您的数据,您可能不应该使用首选项,因为它们可以由用户自愿清除。
如果您再次选择 sdcard 作为存储介质,您将让用户自行选择从存储中删除内容。
因此,您剩下的另一个选项是使用应用程序的内部存储器。你可以点击这个链接,
http://developer.android.com/guide/topics/data/data-storage.html
【讨论】:
在任何文档中的哪个地方说,在用户通过应用程序信息中的“清除数据”按钮清除应用程序存储的数据后,存储的数据将持续存在? 你有什么问题?我试图解释提出这个问题的人。如果你这么清楚,为什么不做出一个让每个人都接受你的答案的答案。在你之前注意一点,内部记忆与偏好不同。 因为这是一个参考网站,你们所有人都在提供错误信息。我确实发布了正确的答案,但由于这种错误信息,它被否决了。我什至发布了一个编辑来证明我的答案,但你仍然质疑其有效性。测试我的答案,您会发现我发布的内容实际上是正确的。【参考方案3】:使用文件并将其写入内部存储器或外部存储器。使用加密,以防您需要确保安全。
编辑:某些版本的 android 有一个选项,您可以使用该选项删除与特定应用程序相关的所有数据,包括文件。您的应用必须就此向用户发出警告,并且您必须引入功能来处理文件被擦除时的情况
【讨论】:
我不想使用 SD 卡来存储这些信息。是否有特定于应用程序的目录?我可以在哪里存储文件,并且不应该在清除数据时删除该文件。它应该在卸载应用程序时自动删除。此外,不应在应用程序之外访问该文件。用户应该无法访问该文件。 是的..这是可能的。!! developer.android.com/guide/topics/data/data-storage.html 使用内部存储。该文件不会被删除,除非您将其删除并且没有其他应用程序可以访问该文件。在创建模式时,请务必使用私有模式。这在我的应用程序中有效,我相信它也适用于您的应用程序。 非常感谢您的帮助。 那是不正确!!!在宣布这是一个很好的答案之前,请自己测试一下。有关解释和示例,请参阅我的回答。 @DDosAttack 我刚刚拿起 2 部运行 Android 的手机并对其进行了测试。在一部手机中,清除数据选项根本不存在,而在另一部手机中,它存在并且可以删除数据。所以我同意有一些限制。但并非在所有手机中【参考方案4】:您可以使用文件系统存储在内部sd卡中
【讨论】:
我不想使用 SD 卡来存储这些信息。是否有特定于应用程序的目录?我可以在哪里存储文件,并且不应该在清除数据时删除该文件。它应该在卸载应用程序时自动删除。此外,不应在应用程序之外访问该文件。用户应该无法访问该文件。【参考方案5】:即使使用“清除数据”清除数据后,内部文件也不会被删除。 我将在下一个项目中使用相同的想法。想法是 --> 使用 XML 格式将数据存储在文件中,并使用 XML 解析器使用相同的文件。我希望它对我有用,并会提供足够的提示来使用它。 这是一个如何使用内部存储的线索-->
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());
礼貌:https://***.com/a/11690185/842607
【讨论】:
以上是关于如何保存数据直到应用程序在android中卸载?的主要内容,如果未能解决你的问题,请参考以下文章
UWP HttpClient 存储 cookie 直到应用被卸载