Android数据存储(内部,外部,SharedPreferences,SQlite)

数据的存储位置

内部存储:data/data/对应包名/files/文件名

外部存储:/storage/emulated/0/对应包名/文件

内部存储的读写

String file="data.text";
 String setText = this.et_setText.getText().toString().trim();
 FileOutputStream fos=null;
 try {
    
    
   fos=openFileOutput(file,*MODE_APPEND*);
   fos.write(setText.getBytes());
   fos.close();
 }catch (Exception e){
    
    
   e.printStackTrace();
 }

打开的时候MODE属性值有:

MODE_PRIVATE:该文件只能被当前程序读写

MODE_APPEND:该文件的内容可以追加

MODE_WORLD_READABLE:该文件的内容可以被其他程序读

MODE_WORLD_WRITEABLE:该文件的内容可以被其他程序读写

String file2="data.text";
FileInputStream fin=null;
try{
    
    
    fin=openFileInput(file2);
    byte[] buffer=new byte[fin.available()];
    fin.read(buffer);
    String str=new String(buffer);
    tv_getText.setText(str);
}catch (Exception e){
    
    
    e.printStackTrace();
}

外部存储的读写

一、获取外部设备SD卡读写权限

**1.**首先静态申请权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--android.permission.WRITE_EXTERNAL_STORAGE:申请SD卡写权限,读权限自动申请了-->

2.然后动态代码添加权限申请由用户同意

ActivityCompat.*requestPermissions*(this,new String[]{
    
    "android.permission.WRITE_EXTERNAL_STORAGE"},100);

requestPermissions:动态权限申请

第一个参数:显示上下文对象

第二个参数:权限列表用String数组装好

第三个参数:请求码

**3.**通过回调方法判断是否申请成功

/**
 * 动态申请权限回调方法
 * @param requestCode 请求码
 * @param permissions 请求的权限列表
 * @param grantResults  用户授予权限的结果
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
    
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode==100){
    
    
        for(int i=0;i<permissions.length;i++){
    
    
            if(permissions[i].equals("android.permission.WRITE_EXTERNAL_STORAGE")&&grantResults[i]== PackageManager.PERMISSION_GRANTED){
    
    
                Toast.makeText(this, "权限"+permissions[i]+"申请成功", Toast.LENGTH_SHORT).show();
            }else {
    
    
                Toast.makeText(this, "权限"+permissions[i]+"申请失败", Toast.LENGTH_SHORT).show();
            }
        }
    }
}
 
PackageManager.PERMISSION_GRANTED 获取SD卡的读写权限后会得到此值

二、获得外部存储路径

判断外部存储是否有用

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

获得外部存储位置

Environment.getExternalStorageDirectory()

三、写

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
    
    
    File SDPath= Environment.getExternalStorageDirectory();
    File file=new File(SDPath,"Data.txt");
    FileOutputStream fos=null;
    try{
    
    

        fos=new FileOutputStream(file,true);
        Log.i("Tag","输出流打开成功"+file.toString());
        fos.write(save.getBytes());
        Toast.makeText(this, "存储完毕", Toast.LENGTH_SHORT).show();
    }catch (Exception e){
    
    
        e.printStackTrace();
    }finally {
    
    
        if(fos!=null){
    
    
            try{
    
    
                fos.close();
            }catch (Exception e){
    
    
                e.printStackTrace();
            }
        }
    }
}

五、读

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
    
    
    FileInputStream fis=null;
    try {
    
    
        File SDPath= Environment.getExternalStorageDirectory();
        File file=new File(SDPath,"Data.txt");
        fis=new FileInputStream(file);
        Log.i("Tag","输入流打开成功"+file.toString());
        byte [] buff=new byte[fis.available()];
        fis.read(buff);
        String message=new String(buff);
        tv_read.setText(message);
        Toast.makeText(this, "读取完毕", Toast.LENGTH_SHORT).show();
    }catch (Exception e){
    
    
        e.printStackTrace();
    }finally {
    
    
        if(fis!=null){
    
    
            try {
    
    
                fis.close();
            }catch (Exception e){
    
    
                e.printStackTrace();
            }
        }
    }
}

SharedPreferences存储

​ SharedPreferences是Android平台上一个轻量级的存储类,当程序中有一些少量数据需要持久化存储时,可以使用SharedPreferences类进行存储。例如:用户名、密码、自定义一些参数等。

​ 存储方式为:XML文件键值对形式存储

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
 <map>
   <string name="qq">123</string>
   <string name="password">123</string>
 </map>

存入数据

SharedPreferences sp=context.getSharedPreferences("文件名",*MODE_PRIVATE*);
 SharedPreferences.Editor editor=sp.edit();
 editor.putString("key",);
 editor.commit();

获取数据

SharedPreferences sp = getSharedPreferences("data", *MODE_PRIVATE*);
 String data = sp.getString(*key*, "没有获取到数据");

删除数据

SharedPreferences sp=getSharedPreferences("data",*MODE_PRIVATE*);
     SharedPreferences.Editor editor=sp.edit();
 //    editor.remove(key);//删除指定数据
     editor.clear();//删除所有数据
     editor.commit();

补充

\1. Context类中的getSharedPreferences()方法:

此方法接收两个参数,第一个参数用于指定SharedPreferences文件名称,如果指定的文件不存在会去创建一个SharedPreferences文件都是存放在/data/data//shared_prefs目录下的。第二个参数用于指定操作模式,目前只有MODE_PRIVATE这一种模式可选,他是默认的操作模式,和直接传入0效果是一样的,表示只有当前程序能够对SharedPreferences文件进行读写。其他两种模式因为安全性在Android4.2中被废弃。

\2. Activity类中的getPreferences()方法

这个方法和Context中的getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为SharedPreferences的文件名。

\3. PreferenceManager类中的getDefaultSharedPreferences()方法

这是一个静态方法,它接收一个Context参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。得到SharedPreferences对象之后,就可以开始向SharedPreferences文件中存储数据了。

主要可以分为3步实现

Ø 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象

Ø 向SharedPreferences.Editor对象中添加数据,比如添加一个布尔数据就可以使用putBoolean()方法,添加一个字符串则使用putString()方法。以此类推。

Ø 调用apply()方法将添加的数据进行提交,从而完成数据存储的操作。

SQLite数据库存储

​ SQLite是Android自带的一个轻量级的数据库,他运算速度快,占用资源少,支持基本SQL语法。

​ SQLite数据库可以存储大量数据,并且对其管理。

创建数据库

public MyHelper(@Nullable Context context) {
    
    
   super(context, "user_data.db", null, 1);
 }

创建数据表

/**
 *第一次执行数据库时用于建表
 *@param db
**/
@Override
 public void onCreate(SQLiteDatabase db) {
    
    
   db.execSQL("create table tb_user(_id integer primary key autoincrement,username varchar(20),pwd varchar(20))");
 
}

数据库版本更新时调用

/**
*版本发生变化时执行
*@param db 
*@param oldVersion 旧的版本
*@param newVersion 新的版本
*/
@Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
    
 
 }

​ 数据库进行升级时将构造函数中的第四个参数——数据库版本号调至比之前大的就行

​ onUpgrade一般执行删表的操作

基本方法

SQLiteDatabase db=myHelper.getWritableDatabase();//获得读写权限

db.beginTransaction();//开始事务

……//处理数据

db. setTransactionSuccessful();//提交事务

db.endTransaction();//结束事务

插入数据

SQL语句添加

SQLiteDatabase db=myHelper.getWritableDatabase();
 db.beginTransaction();
 try{
    
    
   db.execSQL("insert into tb_user(username,pwd) values(?,?)",new String[] {
    
    qq,password});
   db.setTransactionSuccessful(); //提交事务
 }catch (Exception e){
    
    
   Log.*i*("Tag",e.getMessage());
   e.printStackTrace();
 }finally {
    
    
   db.endTransaction();//执行结束
   db.close();//关闭
 }

insert类

SQLiteDatabase db=myHelper.getWritableDatabase();
 db.beginTransaction();
 try{
    
    
   ContentValues values=new ContentValues();//创建内容值对象
   values.put("username",qq);//插入username列的值
   values.put("pwd",password);//
   long id=db.insert("tb_user",null,values);//insert返回的是插入的行数,如果是大于0至少插入了一行数据
   if(id>0){
    
    
     result=true;
     db.setTransactionSuccessful();//标注数据库事务执行成功
   }
 }catch (Exception e){
    
    
   Log.*i*("Tag",e.getMessage());
   e.printStackTrace();
 }finally {
    
    
   db.endTransaction();//执行结束
   db.close();//关闭
 }

查询数据

cursor=db.query("tb_user",null,"username like ?",new String[]{
    
    "%"+content+"%"},
                null,null,null);
//查询query方法最少有7个参数
//参数1是表名,参数2是要查询的列名,如果要查询所有列用null
//参数3是查询条件
//参数4是条件值
//参数5是分组
//参数6是分组后的筛选
//参数7是排序
//query方法的返回是游标对象。游标是数据库中指针

删除

int number=db.delete("tb_user","username=?",new String[]{
    
    qq});
//delete方法的参数1是表名,参数2是条件,参数3是条件值
//delete方法的返回是影响的行数

修改

int row=db.update("tb_user",qq,"_id=?",new String[]{
    
    "6"});
//update方法参数1是表名
//参数2是要修改的值
//参数3是修改条件:一般用主键
//参数4是条件值
//update方法的返回值是所影响的行数

猜你喜欢

转载自blog.csdn.net/qq_44408913/article/details/108450094