Android数据存储(一)

一,数据存储选项:Data Storage

1.SharedPreferences

Store privateprimitive data in key-value pairs.

保存简单的键值对数据。

2.Internal Storage

Store privatedata on the device memory.

在手机内存中保存不对外共享的信息。

3.External Storage

Store publicdata on the shared external storage.

在外部存储设备上保存公共的数据信息。主要指保存在SDCard上。

4.SQLite Databases

Store structureddata in a private database.

将结构化的数据保存进数据库。

5.NetworkConnection

Store data onthe web with your own network server.

将数据保存到自己的远程服务器上。

二,SharedPreferences存储

SharedPreferences是Android系统提供的一个通用的数据持久化框架,用于存储和读取key-value类型的原始基本数据类型对。

1.存储数据类型:string、int、long、float、boolean等,对于自定义的对象数据类型,无法使用SharedPreferences来存储。

2.SharedPreferences主要用于存储系统的配置信息。例如上次登录的用户名。

3.数据保存路径:/data/data/packageName/shared_prefs/yyy.xml

4.当再次启动程序后依然保持原有设置。

2.1  使用步骤:

1.获取SharedPreferences对象;

SharedPreferences本身是一个接口,无法直接创建实例,通过Context的getSharedPreferences(String name, int mode)方法来获取实例。

int mode参数有以下三个值:

  • Context.MODE_PRIVATE: 指定该SharedPreferences的数据只能被本应用程序读、写;

  • Context.MODE_APPEND:新内容追加到原内容后;

  • Context.MODE_WORLD_READABLE: 指定 SharedPreferences数据能被其他应用程序读,但是不支持写;

  • Context.MODE_WORLD_WRITEABLE: 指定 SharedPreferences数据能被其他应用程序读、写。会覆盖原数据。

  • 可以使用“+”连接这些权限

2.调用edit()方法获取SharedPreferences.Editor;

3.通过SharedPreferences.Editor接口提供的put()方法对SharedPreferences进行更新;

4.调用SharedPreferences.Editor的commit()方法,将更新提交到SharedPreferences中。

2.2  核心代码

sp = getSharedPreferences("xiao", Context.MODE_PRIVATE);
public void save(View view) {
        SharedPreferences.Editor editor = sp.edit();
        String name = name_et.getText().toString();
        String passage = passage_et.getText().toString();
        editor.putString(name,passage).commit();
        Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
    }

    public void read(View view) {
        String name = name_et.getText().toString();
        String passage = sp.getString(name,null);
        if (passage == null) {
            Toast.makeText(this, "没有此用户名", Toast.LENGTH_SHORT).show();
        }else{
            passage_et.setText(passage);
        }
    }

三,Internal Storage手机内部存储

  • 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。

  • 所以对于内部存储空间,要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。

  • getFilesDir()获取app的内部存储空间,相当于应用在内部存储上的根目录。

核心代码:

public void save(View view) throws IOException {
        AssetManager manager = getAssets();
        InputStream is = manager.open("logo.png");
        FileOutputStream fos = openFileOutput("logo.png", Context.MODE_PRIVATE);

        byte[] buffer = new byte[1024];
        int len = -1;
        while ((len = is.read(buffer)) != -1) {
            fos.write(buffer,0,len);
        }
        fos.close();
        is.close();
        Toast.makeText(this, "保存完成", Toast.LENGTH_SHORT).show();
    }

    public void read(View view) {
        String filesPath = getFilesDir().getAbsolutePath();
        String imagePath = filesPath + "logo.png";
        Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
        in_iv.setImageBitmap(bitmap);

    }

四,External Storage手机外部存储,Sdcard

1.文件类型:任意

2.数据保存路径:

a). /storage/sdcard/Android、data/packageName/files/

b). /storage/sdcard/xxx/

3.必须保证sd卡挂载在手机上才能读写,否则不能操作

4.添加权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

4.1 操作步骤

1.先判断手机是否有sd卡;

调用Environment的getExternalStorageState()方法判断手机是否插上sdcard。

2.获取sdcard的路径;

调用Environment的getExternalStorageDirectory()方法来获取外部存储器的目录。

3.此外还可以获取SDCard可用磁盘空间的大小(借助StatFs类来实现);

4.清单文件中设置读写sdcard的权限;

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 向sdcard写入权限

5.执行读写操作(基本IO流操作)。

2.2 核心代码

  public void save(View view) throws IOException {
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            String fileName = name_et.getText().toString();
            String content = passage_et.getText().toString();
            String filesPath = getExternalFilesDir(null).getAbsolutePath();
            String filePath = filesPath + "/" + fileName;
            FileOutputStream fos = new FileOutputStream(filePath);
            fos.write(content.getBytes("utf-8"));
            fos.close();
            Toast.makeText(this, "保存完成", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_SHORT).show();
        }

    }
    public void read(View view) throws IOException {
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            String fileName = name_et.getText().toString();
            String filesPath = getExternalFilesDir(null).getAbsolutePath();
            String filePath = filesPath + "/" + fileName;
            FileInputStream is = new FileInputStream(filePath);
            ByteArrayOutputStream bs = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = is.read(buffer)) != -1) {
                bs.write(buffer,0,len);
            }
            String con = bs.toString();
            passage_et.setText(con);
            is.close();
            Toast.makeText(this, "读取成功", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_SHORT).show();
        }
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习的小西瓜

谢谢您,小西瓜会继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值