《第一行代码》第六章 数据存储全方案
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无法导出,报错:
为什么这么对我,苍天啊。。。这软件这么卡,有一半的时间在未响应、加载中、重启中、再次加载。。。这个问题还没解决,大神们有解决办法的话,祈求帮助啊!!!!
上一篇: selenium+python设置爬虫代理IP的方法
下一篇: 网络通OSI参考模型协议
推荐阅读