Android網絡與數據存儲_學習筆記_第五週

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訪問。

發佈了53 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章