欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《第一行代码》第六章 数据存储全方案

程序员文章站 2022-07-01 13:18:37
...

6.1 简介

保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据才是处于持久状态的。

android系统中主要提供了3种方式用于简单地实现数据持久化功能:

    (1)文件存储:最基本,不对存储内容进行任何格式化处理,所有数据都是原封不动地保存在文件当中的。适用于存储:简单文本数据、二进制数据。

    (2)SharedPreference存储:使用键值对的方式来存储数据,支持多种不同数据类型存储(和类、对象啥的很像)。

    (3)SQLite数据库存储:android系统内置了数据库!适用:存储大量复杂关系数据(例如:手机联系人、短信)。

其实还可以存在SD卡中,但那样会比较复杂。


6.2 文件存储

6.2.1 将数据存储到文件中

     1. 方法:openFileOutput(  参数1, 参数2 ),返回 FileOutputStream 对象

            参数1:文件名(不可以包含路径,都存储在默认路径下:/data/data/<pakagename>/file/)

            参数2:文件操作模式(两种可选)

                        -MODE_PRIVATE: 默认操作模式,表示当该文件已存在时,覆盖里面的内容

                        -MODE_APPEND: 若该文件已存在,则往文件里追加内容。

    2. 范例:在android项目中使用文件存储技术。

       (1)layout_main 布局:一个输入框

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="type something here..."/>

此时输入的数据是瞬时的,如果你点back就没啦。

        (2)MainActivity.java

public class MainActivity extends AppCompatActivity {
    private EditText edit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {//在这个方法中,获取EditText实例
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit = (EditText) findViewById(R.id.edit);
    }

    @Override
    protected void onDestroy() {  //获取EditText中输入的内容
        super.onDestroy();
        String inputText = edit.getText().toString();
        save(inputText);
    }

    public void save(String inputText) {  //使用Java流的方式将数据存储到文件中
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try {
            out = openFileOutput("data", Context.MODE_PRIVATE);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(inputText);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

   (3)运行:输入文字,然后按返回。

    《第一行代码》第六章 数据存储全方案


    (4)验证数据保存成功:打开tools-Android-Android Device Monitor

      顺利的情况下(不顺利的话,继续往下读),你能够从File explorer中找到data,然后data/data/<package name>/data/file地找到刚才保存的文件。如图所示:

《第一行代码》第六章 数据存储全方案

通过右上角 导出图标:《第一行代码》第六章 数据存储全方案(左边那个)

理想情况下,是能够导出一个data文件,用记事本打开,里面会出现刚刚输入的内容。然而。。遇到困难了。。。

下一小点

3. 文件存储过程中遇到的问题

    这可真让人头大。

(1)问题:打开tools-Android-Android Device Monitor时,File explorer是空的!!!

        解决方式:我是参考了这篇文章:(点击打开链接)https://segmentfault.com/a/1190000008416511

        第一步:下载ddmlib.jar 百度云链接密码:y33c

        第二步:在安装目录中找到:Android SDK的tools目录中搜索ddmlib.jar
                     可能会搜出多个,我们要替换的是Android SDK tools目录下的

                     例如:Androidsdktoolslibmonitor-x86_64configurationorg.eclipse.osgibundles21.cplibsddmlib.jar

        第三步:用刚才下载到的ddmlib.jar替换刚搜到的ddmlib.jar

                      需要注意的是,替换的时候,先将Android Device Monitor关掉。

        第四步:再次打开Android Device Monitor,就可以看到目录了。

(2)解决了那个问题之后,又出现新的问题了。。data无法进一步打开

         这是权限的问题,不信你看截图。解释一下:第一个字母代表文件类型,d是directory目录的意思,后面的字母可以看成3组,首先是是创建者的权限r读w写x执行,中间那组是同组者的权限,那一组表是其他人的权限,当我们从DDMS查看的时,属于其他人的权限。通过截图可知,不能读写,只有执行,因此需修改权限。

《第一行代码》第六章 数据存储全方案

    修改权限

              (1)在计算机搜索框中输入adb shell(或者先cmd, 然后再在cmd窗口中输入adb shell)

                 如果打不开,或者闪退,说明你的模拟设备断开连接了,等连接上之后再来。

《第一行代码》第六章 数据存储全方案

                 出现这样就对了

《第一行代码》第六章 数据存储全方案

                 (2)然后输入:su 

                 (3)观察到$符号变成了#,表示现在在以管理权限访问

                 (4)再输入:chmod -R 777 /data

                 (5)最后输入:chmod -R 777 /data/data  (这两步一定要分开,不然没用的)

                 (6)回到Android Device Monitor,可以打开啦

(3)然而。。新的问题又出现了,data无法导出,报错:

《第一行代码》第六章 数据存储全方案

       为什么这么对我,苍天啊。。。这软件这么卡,有一半的时间在未响应、加载中、重启中、再次加载。。。这个问题还没解决,大神们有解决办法的话,祈求帮助啊!!!!

《第一行代码》第六章 数据存储全方案