本文共 7326 字,大约阅读时间需要 24 分钟。
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_STORAGEInternal 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访问。转载地址:http://yeani.baihongyu.com/