1、SharedPreferences是什么?
数据持久化
2、SharedPreferences适用于哪些地方?
保存比较简单的数据
代码里的全局变量、局部变量是放在内存里的,当页面被关闭后,内存就被释放了,全局变量、局部变量值被销毁了;所以有时我们需要保存一些数据,下次再读取ta,比如登录信息。
快捷键:提取为方法 command+option+m;
保存数据:
/*
* 保存数据
* */
private void saveData2Preferences() {
//系统会自动创建xml文件,文件名preference_name;
//1、打开Preferences,名称为preference_name,如果存在则打开它,否则创建新的Preferences
SharedPreferences sharedPreferences = getSharedPreferences("preference_name",MODE_PRIVATE);
//2、让preference_name处于编辑状态
SharedPreferences.Editor editor = sharedPreferences.edit();
//3、存放数据
editor.putString(TEXT_VIEW_DATA,mDataString);
//4、完成提交
editor.apply();
}
以上,可以将数据保存到文件名为preference_name里,文件在data/data/包名/,目录下;终端命令查看文件:
adb shell
cd data/data/
cd com.example.chenjinhua.sharedpreferences
vi 文件名
退出vi命令:按Esc,然后 :q! 读取数据
/*
* 读取数据
* */
private void setData() {
//1、获取Preferences
SharedPreferences sharedPreferences = getSharedPreferences("preference_name",MODE_PRIVATE);
//2、取出数据
mDataString = sharedPreferences.getString(TEXT_VIEW_DATA,"10");
mEditText_data.setText(mDataString);
mTextView_second.setText(mDataString);
}
完整的代码为:
package com.example.chenjinhua.sharepreferences;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
/**
* Created by chenjinhua on 16/3/30.
*/
public class SecondActivity extends AppCompatActivity implements View.OnClickListener {
public static final String TEXT_VIEW_DATA = "textView_data";
private EditText mEditText_data;
private TextView mTextView_second;
private Button mButton_confirm;
private String mDataString;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_shareprefs_textview);
Log.i("MainActivity", "SecondActivity");
findViews();
mButton_confirm.setOnClickListener(this);
setData();
}
/*
* 读取数据
* */
private void setData() {
SharedPreferences sharedPreferences = getSharedPreferences("preference_name",MODE_PRIVATE);
mDataString = sharedPreferences.getString(TEXT_VIEW_DATA,"10");
mEditText_data.setText(mDataString);
mTextView_second.setText(mDataString);
}
private void findViews() {
mEditText_data = (EditText) findViewById(R.id.editText_data);
mButton_confirm = (Button) findViewById(R.id.button_confirm);
mTextView_second = (TextView) findViewById(R.id.textView_second);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.button_confirm:
mDataString = mEditText_data.getText().toString();
mTextView_second.setText(mDataString);
saveData2Preferences();
break;
}
}
/*
* 保存数据
* */
private void saveData2Preferences() {
//系统会自动创建xml文件,文件名preference_name,
SharedPreferences sharedPreferences = getSharedPreferences("preference_name",MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(TEXT_VIEW_DATA,mDataString);
editor.apply();
}
}
如何创建?
如何保存?
如何修改?
修改就是再put一次,给同样的key不同的value,如下
editor.putString(TEXT_VIEW_DATA,value1);
editor.putString(TEXT_VIEW_DATA,value2);
如何删除?
editor.remove(xxx); //删除key为xxx对应的值
注意:
editor.commit(); //同步写数据
editor.apply();
//1、另开一个线程,异步写数据,不会占用UI线程;2、和网络相关、IO操作相关,都要用异步。
原理
在data/data/文件夹里写了一个文件。
如何封装成一个能用的类?
如何清除缓存?
adb clear
练习:
做一个小应用,启动时有2张引导界面,只有第一次启动时显示,下一次启动不会显示。
一、存储的分类:内置存储和外置存储
Internal storage:在data/data/包名里
External storage:用getExternalStorageDirectory()方法获取目录
获取External存储的权限
android:permission.WRITE_EXTERNAL_STORAGE
Internal storage
getFileDir():返回一个File,代表了app的internal目录;
getCacheDir():返回一个File,代表了app的internal缓存目录。
在内部存储创建文件,并把内容保存在文件里即存储数据:
private void testFileDemo() {
File file = new File(getFilesDir(),"test.txt");
Log.i("MainActivity","getFileDir"+ getFilesDir().getAbsolutePath());
Log.i("MainActivity","file path"+ file.getAbsolutePath());
try {
boolean isSuccess = file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
与sharedPreferences的区别:
1、sharedPreferences由系统封装,但是它不够灵活,只能存String、boolean、int型数据;
2、自己创建很灵活,可以存很多数据、大批量的数据。
新建文件,并且写入数据:
String string = "I'm tall";
try {
FileOutputStream fileOutputStream = openFileOutput("test2.txt", Context.MODE_PRIVATE);
try {
fileOutputStream.write(string.getBytes());
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
//check external storage state
String state = Environment.getExternalStorageState();
if(TextUtils.equals(state,Environment.MEDIA_MOUNTED)){}
持久化数据有几种?
1、存到sharedPreferences,
2、存到文件里
3、数据库
4、网络存储
基本操作:
1、如何读取应用本身目录?
2、怎样读取文件?
3、如何写入文件?
4、如何删除文件?
如何操作文件(增删改查)
读取各目录下的文件
1、操作外置存储文件
public void testSDCard(){
String filePath = Environment.getExternalStorageDirectory().getAbsolutePath();
File file = new File("filePath");
}
2、操作assets目录下的文件
android studio添加assets文件夹:
1、结构管理区域选择“Project”;
2、新建”assets”文件夹:app->src->main,new Directory,”assets”
3、配置:项目文件夹根目录下,xxx.iml文件里(xxx为项目名)添加如下代码:
private void testAsserts() throws IOException {
/*第一种方法:直接读路径
* */
//webView加载asset中的文件内容
WebView webView = new WebView(this);
//把本地的网页缓存在这
webView.loadUrl("file:///android_asset/test.html");
/*第二种方法:读流
*/
try {
//open只能是文件不能是文件夹
InputStream inputStream = getResources().getAssets().open("test.html");
inputStream
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(MainActivity.this,"文件读取异常",Toast.LENGTH_SHORT).show();
}
//读列表
String[] fileNames = getAssets().list("images/");
//读图片
InputStream inputStream = getResources().getAssets().open("images/me_one");
//将输入流变成bitmap(图片的位图)
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
ImageView imageView = new ImageView(this);
imageView.setImageBitmap(bitmap);
//读音频
AssetFileDescriptor assetFileDescriptor = getAssets().openFd("yesterday_once_more.pm3");
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.reset();
mediaPlayer.setDataSource(
assetFileDescriptor.getFileDescriptor(),
assetFileDescriptor.getStartOffset(),
assetFileDescriptor.getLength());
mediaPlayer.prepare();
mediaPlayer.start();
}
3、操作raw目录下的文件、操作res目录下的文件
public void testResFile(){
InputStream inputStream = getResources().openRawResource(R.raw.yesterday_once_more);
getResources().getColor(R.color.abc_background_cache_hint_selector_material_dark);
getResources().getString(R.string.abc_action_bar_home_description);
}
assets和raw里的音频文件:
相同点:都是将音频文件打在包里,不会有变动
不同点:assets里是原封不动的,res原封不动时系统会放入资源id里,可通过id访问。