一,数据存储选项:Data Storage
1.SharedPreferences
Store privateprimitive data in key-value pairs.
保存简单的键值对数据。
2.Internal Storage
Store privatedata on the device memory.
在手机内存中保存不对外共享的信息。
3.External Storage
Store publicdata on the shared external storage.
在外部存储设备上保存公共的数据信息。主要指保存在SDCard上。
4.SQLite Databases
Store structureddata in a private database.
将结构化的数据保存进数据库。
5.NetworkConnection
Store data onthe web with your own network server.
将数据保存到自己的远程服务器上。
二,SharedPreferences存储
SharedPreferences是Android系统提供的一个通用的数据持久化框架,用于存储和读取key-value类型的原始基本数据类型对。
1.存储数据类型:string、int、long、float、boolean等,对于自定义的对象数据类型,无法使用SharedPreferences来存储。
2.SharedPreferences主要用于存储系统的配置信息。例如上次登录的用户名。
3.数据保存路径:/data/data/packageName/shared_prefs/yyy.xml
4.当再次启动程序后依然保持原有设置。
2.1 使用步骤:
1.获取SharedPreferences对象;
SharedPreferences本身是一个接口,无法直接创建实例,通过Context的getSharedPreferences(String name, int mode)方法来获取实例。
int mode参数有以下三个值:
Context.MODE_PRIVATE: 指定该SharedPreferences的数据只能被本应用程序读、写;
Context.MODE_APPEND:新内容追加到原内容后;
Context.MODE_WORLD_READABLE: 指定 SharedPreferences数据能被其他应用程序读,但是不支持写;
Context.MODE_WORLD_WRITEABLE: 指定 SharedPreferences数据能被其他应用程序读、写。会覆盖原数据。
可以使用“+”连接这些权限。
2.调用edit()方法获取SharedPreferences.Editor;
3.通过SharedPreferences.Editor接口提供的put()方法对SharedPreferences进行更新;
4.调用SharedPreferences.Editor的commit()方法,将更新提交到SharedPreferences中。
2.2 核心代码
sp = getSharedPreferences("xiao", Context.MODE_PRIVATE);
public void save(View view) {
SharedPreferences.Editor editor = sp.edit();
String name = name_et.getText().toString();
String passage = passage_et.getText().toString();
editor.putString(name,passage).commit();
Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
}
public void read(View view) {
String name = name_et.getText().toString();
String passage = sp.getString(name,null);
if (passage == null) {
Toast.makeText(this, "没有此用户名", Toast.LENGTH_SHORT).show();
}else{
passage_et.setText(passage);
}
}
三,Internal Storage手机内部存储
内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。
所以对于内部存储空间,要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。
getFilesDir()获取app的内部存储空间,相当于应用在内部存储上的根目录。
核心代码:
public void save(View view) throws IOException {
AssetManager manager = getAssets();
InputStream is = manager.open("logo.png");
FileOutputStream fos = openFileOutput("logo.png", Context.MODE_PRIVATE);
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer,0,len);
}
fos.close();
is.close();
Toast.makeText(this, "保存完成", Toast.LENGTH_SHORT).show();
}
public void read(View view) {
String filesPath = getFilesDir().getAbsolutePath();
String imagePath = filesPath + "logo.png";
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
in_iv.setImageBitmap(bitmap);
}
四,External Storage手机外部存储,Sdcard
1.文件类型:任意
2.数据保存路径:
a). /storage/sdcard/Android、data/packageName/files/
b). /storage/sdcard/xxx/
3.必须保证sd卡挂载在手机上才能读写,否则不能操作
4.添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4.1 操作步骤
1.先判断手机是否有sd卡;
调用Environment的getExternalStorageState()方法判断手机是否插上sdcard。
2.获取sdcard的路径;
调用Environment的getExternalStorageDirectory()方法来获取外部存储器的目录。
3.此外还可以获取SDCard可用磁盘空间的大小(借助StatFs类来实现);
4.清单文件中设置读写sdcard的权限;
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 向sdcard写入权限
5.执行读写操作(基本IO流操作)。
2.2 核心代码
public void save(View view) throws IOException {
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
String fileName = name_et.getText().toString();
String content = passage_et.getText().toString();
String filesPath = getExternalFilesDir(null).getAbsolutePath();
String filePath = filesPath + "/" + fileName;
FileOutputStream fos = new FileOutputStream(filePath);
fos.write(content.getBytes("utf-8"));
fos.close();
Toast.makeText(this, "保存完成", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_SHORT).show();
}
}
public void read(View view) throws IOException {
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
String fileName = name_et.getText().toString();
String filesPath = getExternalFilesDir(null).getAbsolutePath();
String filePath = filesPath + "/" + fileName;
FileInputStream is = new FileInputStream(filePath);
ByteArrayOutputStream bs = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1) {
bs.write(buffer,0,len);
}
String con = bs.toString();
passage_et.setText(con);
is.close();
Toast.makeText(this, "读取成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_SHORT).show();
}
}