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

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无法导出,报错:


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







猜你喜欢

转载自blog.csdn.net/qq_39915585/article/details/79743204