数据存储之安卓本地存储之SharedPreference以及内部存储和外部存储

   日期:2020-10-07     浏览:87    评论:0    
核心提示:一.注意事项

一.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

如此便完成了安卓本地存储的学习

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服