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

    科技2022-08-03  122

    一.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=%7B%22request%5Fid%22%3A%22160188912519725222413159%22%2C%22scm%22%3A%2220140713.130102334…%22%7D&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

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

    Processed: 0.013, SQL: 9