首页 > 其他分享 >37.Android数据存储再整理

37.Android数据存储再整理

时间:2024-04-27 09:55:06浏览次数:26  
标签:存储 String 37 Environment pwd user et import Android

这次主要是对SD卡外部存储和SharedPreferences存储的补充说明
还是以qq案例来说

首先外部存储

存储的位置为/storage/emulated/0目录下 具体为你定义的地方这里也有个小坑
还有就是不需要使用内部存储的openFileOutput方法和openFileInput方法
image

首先要在清单文件里申请SD卡写读文件的权限
两种方式静态和动态申请
自然在清单文件里配置静态申请简单了
    </application>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
然后看工具类的编写
也就是对内部存储的更改

package com.example.store;

import android.content.Context;
import android.os.Environment;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

//工具类 实现QQ的账号密码存储和读取
public class SDTool_qqAcitivity {
    public static boolean saveUser(Context context, String user, String pwd) {
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)) {
//            File path = Environment.getExternalStorageDirectory();
            File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
//            File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
            File file = new File(path, "haha.txt");
            FileOutputStream fos = null;
            try {
//                fos = context.openFileOutput("haha.txt", Context.MODE_PRIVATE);
                fos= new FileOutputStream(file);
                //将数据转换为字节码的形式写入haha.txt中
                fos.write((user + ":" + pwd).getBytes());
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            } finally {
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                        return false;
                    }
                }
            }
            return true;
        } else {
            return false;
        }

    }

    public static Map<String, String> getUser(Context context) {
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)) {
//            File path = Environment.getExternalStorageDirectory();
           File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);


            File file = new File(path, "haha.txt");
            String str = "";
            FileInputStream fis = null;
            try {
//                fis = context.openFileInput("haha.txt");
                fis=new FileInputStream(file);
                byte[] buffer = new byte[fis.available()];
                fis.read(buffer);
                str = new String(buffer);
                HashMap<String, String> map = new HashMap<String, String>();
                String[] split = str.split(":");
                map.put("user", split[0]);
                map.put("pwd", split[1]);
                return map;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return null;
    }


}

坑坑坑 如果你获取路径写的是如下的活 会实现不了保存密码也不会在文件里找到
// File path = Environment.getExternalStorageDirectory();
你必须给他一个确定的地方
例如:
Filepath=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
这样文件就保存到DOWNLOADS目录下了

还有个重要的坑

就是我一直想实现不了密码保存
原因是
// Map<String, String> user =SDTool_qqAcitivity.getUser(this);
boolean b = SPTool_qqAcitivity.saveUser(QQ_Activity.this, user, pwd);
你要确定你调用的是哪个工具


然后就是SharedPreferences存储

它主要是一个轻量级的 存储介绍方法吗 都在33里面介绍了 就不赘婿了
然后就是文件存储在:
image
对的存储的格式为xml

然后咱们看工具类的编写
主要就是调用编辑器方法
package com.example.store;

import android.content.Context;
import android.content.SharedPreferences;

//工具类 实现QQ的账号密码存储和读取
public class SPTool_qqAcitivity {
    public static boolean saveUser(Context context, String user, String pwd) {
        SharedPreferences sharedPreferences = context.getSharedPreferences("haha", Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = sharedPreferences.edit();
        edit.putString("user", user);
        edit.putString("pwd", pwd);
        edit.commit();
        return true;
    }

    public static String getUser(Context context, String key) {
        SharedPreferences sharedPreferences = context.getSharedPreferences("haha", Context.MODE_PRIVATE);
        String string = sharedPreferences.getString(key, "没找到");
        return string;
    }
}

注意注意要在主文件中修改你调用的工具同上一样:
略微修改
因为改成了String方法

//        Map<String, String> user =SDTool_qqAcitivity.getUser(this);
//        user = Tool_qqAcitivity.getUser(this);
//        if (user != null) {
//            et_account.setText(user.get("user"));
//            et_password.setText(user.get("pwd"));
//        }
        String user = SPTool_qqAcitivity.getUser(this, "user");
        String pwd = SPTool_qqAcitivity.getUser(this, "pwd");
        et_account.setText(user);
        et_password.setText(pwd);

再来个小补充把 就是我33并没有trycatch处理异常

这样是不对的 所以在这里小小补充下代码

package com.example.store;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import java.io.IOException;
import java.util.Map;

public class QQ_Activity extends AppCompatActivity {
    //初始化
    private EditText et_account;
    private EditText et_password;
    private Button btn_login;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_qq);
        et_account = findViewById(R.id.et_account);
        et_password = findViewById(R.id.et_password);
        btn_login = findViewById(R.id.btn_login);
//        Map<String, String> user =SDTool_qqAcitivity.getUser(this);
//        user = Tool_qqAcitivity.getUser(this);
//        if (user != null) {
//            et_account.setText(user.get("user"));
//            et_password.setText(user.get("pwd"));
//        }
        String user = SPTool_qqAcitivity.getUser(this, "user");
        String pwd = SPTool_qqAcitivity.getUser(this, "pwd");
        et_account.setText(user);
        et_password.setText(pwd);


        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String user = et_account.getText().toString().trim();
                String pwd = et_password.getText().toString();
                //检查是否为空
                if (TextUtils.isEmpty(user)) {
                    Toast.makeText(QQ_Activity.this, "请输入账号", Toast.LENGTH_SHORT).show();
                }
                if (TextUtils.isEmpty(pwd)) {
                    Toast.makeText(QQ_Activity.this, "请输入密码", Toast.LENGTH_SHORT).show();
                }
                Toast.makeText(QQ_Activity.this, "登录成功", Toast.LENGTH_SHORT).show();
                //保存用户信息 调用工具
                boolean b = SPTool_qqAcitivity.saveUser(QQ_Activity.this, user, pwd);
                if (b) {
                    Toast.makeText(QQ_Activity.this, "保存成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(QQ_Activity.this, "保存失败", Toast.LENGTH_SHORT).show();
                }

            }
        });
    }

}

欧克了 那个SQLite数据库存储33中已经很清楚的介绍
那三个存储方法算over了 剩下的就是内容提供者和网络存储了

标签:存储,String,37,Environment,pwd,user,et,import,Android
From: https://www.cnblogs.com/gaodiyuanjin/p/18161753

相关文章

  • android更改EditText下划线颜色
    在res——》values——》themes中添加下列代码<stylename="editTextStyle"><!--选中时下划线的颜色--><itemname="colorControlActivated">@color/gray1</item><!--默认时下划线的颜色--><itemname="colorControlNormal"&......
  • 更改Android Studio的按钮演颜色
    并不是指通过background去更改,是另一种改前: 改后: 步骤:进入res——》values——》themes.xml 将 改成 就可以啦   参考——https://blog.csdn.net/qq_44995275/article/details/134699448......
  • 利用python将沪深300股票历史数据存储在sqlite3
    一、环境准备1、python3中自带了sqlite3参考https://www.runoob.com/sqlite/sqlite-tutorial.html2、在sqlite中建表CREATETABLE[stock]([id]NVARCHAR(48),[name]NVARCHAR(24), [code]NVARCHAR(24),[date]INTEGERNOTNULL,[open]REAL,[close]......
  • P3375 【模板】KMP
    https://www.luogu.com.cn/problem/P3375#include<bits/stdc++.h>usingnamespacestd;constintN=1e7+5;vector<int>get_pi(strings){ intn=s.length(); vector<int>pi(n); for(inti=1;i<n;++i){ intj=pi[i-1]; while(j&&s[i......
  • day25-索引和函数及存储过程
    1.索引在数据库中索引最核心的作用是:加速查找。例如:在含有300w条数据的表中查询,无索引需要700秒,而利用索引可能仅需1秒。mysql>select*frombigwherepassword="81f98021-6927-433a-8f0d-0f5ac274f96e";+----+---------+---------------+------------------------------......
  • Android保存字符串到本地储存卡中saveLocal
    publicclassSaveLocal{//保存文件到sd卡publicstaticvoidsaveToFile(Stringcontent){BufferedWriterout=null;//获取SD卡状态Stringstate=Environment.getExternalStorageState();//判断SD卡是否就绪if(......
  • Android显示子系统相关基础概念
    1.fence概念:acquireFence、releaseFence、retireFence每一个layer都有一个acquireFence和releaseFence,每一个系列layes都有一个retirefence,注意这边的是layers!多个layer。acquireFence用于生产者通知消费者生产已完成,releaseFence用于消费者通知生产者消费已完成。acquireFence:......
  • RK3568 android13 HDMI和SPK同时有声音
    Index:base/services/core/java/com/android/server/WiredAccessoryManager.java===================================================================---base/services/core/java/com/android/server/WiredAccessoryManager.java (revision2786)+++base/services/co......
  • docker存储配置与管理
    一、Docker存储概念1、容器本地存储与Docke存储驱动容器本地存储:每个容器都被自动分配了内部存储,即容器本地存储。采用的是联合文件系统。通过存储驱动进行管理。容器本地存储空间:分层结构构成,由一个可写容器层和若干只读的镜像层组成。联合文件系统:Docker的一种底层技术,由存......
  • P10371 「LAOI-4」石头 题解
    原题链接:P10371。首先我们设\(l_{i,0/1}\)表示\(i\)左边的第一,二个比\(a_i\)大的数的位置。\(r_{i,0/1}\)同理。考虑一个区间\([L,R]\)在什么时候满足条件,设\(p,q\)分别为区间中最大/次大值的位置,我们分三种情况讨论。情况一:\(L<p<R\)。考虑从\(L,R\)开......