一.SharedPreferences的使用以及注意事項

SharedPreferences的四種操作模式
以鍵值對的方式來進行存盤

創建出一個主頁面,及其layout視圖來測驗,

我們先來實作第一種Sharedpreferen
寫出我們的Java檔案名為SharedPreference
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class ShareActivity extends AppCompatActivity {
private EditText accEdt,pwdEdt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_share);
accEdt = findViewById(R.id.acc_edt);
pwdEdt = findViewById(R.id.pwd_edt);
//SharePreference的讀取
//①獲取SharePreference物件(引數1:檔案名 引數2:模式)
SharedPreferences share = getSharedPreferences("myshare",MODE_PRIVATE);
//②根據key獲取內容(引數1:key 引數2:當對應key不存在時,回傳引數2的內容作為默認值)
String accStr = share.getString("account","");
String pwdStr = share.getString("pwd","");
accEdt.setText(accStr);
pwdEdt.setText(pwdStr);
findViewById(R.id.login_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//1.獲取兩個輸入框的內容
String account = accEdt.getText().toString();
String pwd = pwdEdt.getText().toString();
//2.驗證(admin 123)
if(account.equals("admin") && pwd.equals("123")){
//2.1存盤資訊到SharePreference
//①獲取SharePreference物件(引數1:檔案名 引數2:模式)
SharedPreferences share = getSharedPreferences("myshare",MODE_PRIVATE);
//②獲取Editor物件
SharedPreferences.Editor edt = share.edit();
//③存盤資訊
edt.putString("account",account);
edt.putString("pwd",pwd);
//④指定提交操作
edt.commit();
Toast.makeText(ShareActivity.this,"登錄成功",Toast.LENGTH_SHORT).show();
}else {
//2.2驗證失敗,提示用戶
Toast.makeText(ShareActivity.this,"賬號或密碼錯誤",Toast.LENGTH_SHORT).show();
}
}
});
}
}
如果賬號和密碼能夠對應,就會在data的檔案夾下創建出來一個你想要命名的檔案夾,然后我們就可以在代碼中讀取這個檔案夾,再次點開界面時就會直接顯示出賬號和密碼,
主要的布局檔案的控制元件代碼為:

<EditText
android:id="@+id/acc_edt"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/guideline3"
app:layout_constraintStart_toStartOf="@+id/guideline5"/>
<EditText
android:id="@+id/pwd_edt"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:inputType="textPassword"
app:layout_constraintBottom_toTopOf="@+id/guideline4"
app:layout_constraintStart_toStartOf="@+id/guideline5" />
檔案夾的查看路徑為

二:外部儲存(重點)
首先要在ManiFest檔案中進行宣告
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
創建出一個java檔案名稱為ExternalActiviy
代碼的內容為
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExternalActivity extends AppCompatActivity {
EditText infoEdt;
TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_external);
infoEdt = findViewById(R.id.info_edt);
txt = findViewById(R.id.textView);
int permisson = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(permisson!=PackageManager.PERMISSION_GRANTED){
//動態去申請權限
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}
}
//上面的第三個引數的意思為,當我們呼叫上面的方法時間,會自動的去有下方的方法的使用,我們可以在下面的方法中補充我們還需要的功能,如果requestCode和上面第三個引數相同的話,我們就可以去呼叫了,
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 1){
//xxxxxxxxxxxxx
}
}
public void operate(View v){
//Environment.getExternalStorageDirectory()是獲取的是根目錄,
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download/imooc.txt";
Log.e("TAG",path);
//if(Environment.getExternalStorageState().equals("mounted"))
switch (v.getId()){
case R.id.save_btn:
File f = new File(path);
try {
if (!f.exists()) {
f.createNewFile();
}
FileOutputStream fos = new FileOutputStream(path,true);
String str = infoEdt.getText().toString();
fos.write(str.getBytes());
}catch (IOException ioe){
ioe.printStackTrace();
}
break;
case R.id.read_btn:
try {
FileInputStream fis = new FileInputStream(path);
byte[] b = new byte[1024];
int len = fis.read(b);
String str2 = new String(b,0,len);
txt.setText(str2);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
}
代碼的主要意思為先是來讀取檔案,獲取檔案的路徑,創建出對應的檔案夾,用IO流來對檔案進行寫入,再在另一個控制元件的下方來讀取我們所保存的檔案,
我們要設定動態的權限,來使我們在不同的手機上都能夠使用,
ContextCompat.checkSelfPermission(context,pression)
//代碼的意思為檢查當前設備是否具有權限,會回傳一個int值來看是否具有權限
ActivityCompat.requestPermissions (activity,pression,code)
//代碼的意思為獲取權限
PackageManager.PERMISSION_GRANTED
//意思是權限被允許
創建出我們的布局檔案
<EditText
android:id="@+id/info_edt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="22dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:maxLines="12"
android:minLines="12"
android:gravity="left|top"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/read_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/save_btn"
app:layout_constraintTop_toTopOf="parent"
android:onClick="operate" />
<Button
android:id="@+id/save_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:onClick="operate" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="176dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="32dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
視圖的效果為

點擊保存和讀取的功能按鈕就實作了相關的功能
獲取外部存盤的目錄
獲取外部存盤的私有目錄

長期儲存的資料放在上面這個檔案夾當中

不需要長期存盤的資料放在上面的檔案中
我們一般情況下都將需要的東西放在這個目錄下方,不放在根目錄下,因為放在根目錄下的內容不會因為我們的卸載而洗掉,
三.內部存盤

上面的檔案夾下放入普通的檔案

上方的檔案夾下放入快取的檔案
內部操作不需要權限
代碼為
import android.Manifest;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class InternalActivity extends AppCompatActivity {
EditText edt;
TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_internal);
edt = findViewById(R.id.editText);
txt = findViewById(R.id.textView);
}
public void operate(View v){
File f = new File(getFilesDir(),"getFilesDirs.txt");
switch (v.getId()){
case R.id.save_btn:
try {
if (!f.exists()) {
f.createNewFile();
}
FileOutputStream fos = new FileOutputStream(f);
fos.write(edt.getText().toString().getBytes());
fos.close();
}catch (IOException e){
e.printStackTrace();
}
break;
case R.id.read_btn:
try {
FileInputStream fis = new FileInputStream(f);
byte[] b = new byte[1024];
int len = fis.read(b);
String str2 = new String(b,0,len);
txt.setText(str2);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
}
資料的處理與外部存盤相一致
內部存盤與外部存盤的區別參考下面的博客:
https://blog.csdn.net/baidu_36385172/article/details/79695308?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160188912519725222413159%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160188912519725222413159&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v2-1-79695308.first_rank_ecpm_v3_pc_rank_v2&utm_term=內部存盤和外部存盤的區別是什么&spm=1018.2118.3001.4187
如此便完成了安卓本地存盤的學習
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/162758.html
標籤:其他
