如何保存数据直到应用程序在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 直到应用被卸载

卸载 android 应用程序会删除存储在 sdcard 上的数据库吗?

android应用的数据应该保存到哪儿

如何将ckeditor内容保存在mysql数据库中

Android 如何进行进程保活

如何使用android中的共享首选项将数据保存在editText中[重复]