Android存储卡读写文件与Application数据保存的实现介绍

Android存储卡读写文件与Application数据保存的实现介绍

1. 前言

在Android应用中,数据的存储方式主要有两种:一种是在应用内部存储中存储数据,另一种是在外部存储中存储数据。其中,存储方式不同,所需要的权限和操作也略有差异。本文将对Android存储卡读写文件与Application数据保存的实现做一个全面的介绍,包括使用示例。

2. Android存储卡读写文件

2.1 读取外部存储中的文件

在Android中,读取外部存储中的文件需要获取相应的存储权限。根据应用所需的读写权限不同,可细分为:

  • 读取外部存储的公共目录(无需请求存储权限)
  • 读取外部存储的私有目录(需要请求存储权限)

2.1.1 读取外部存储的公共目录

外部存储的公共目录包括:

  • Environment.getExternalStoragePublicDirectory()目录方法返回的一些常用的公共目录,如“/sdcard/Pictures”,“/sdcard/Music”等。
  • MediaStore.Images、MediaStore.Audio、MediaStore.Video等系统媒体库目录。

读取外部存储的公共目录的代码如下所示:

// 读取图片目录中的文件
File pictureDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File[] pictureFiles = pictureDir.listFiles();
for (File file : pictureFiles) {
    // 处理文件
}

2.1.2 读取外部存储的私有目录

在Android中,每个应用有自己的私有目录,可以在其中存储和访问自己的文件。相比于读取公共目录,读取私有目录需要请求外部存储读写权限。

请求外部存储读写权限的代码如下所示:

// 判断读写权限是否已经被授予
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) 
        != PackageManager.PERMISSION_GRANTED) {
    // 请求读写权限
    ActivityCompat.requestPermissions(activity,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            REQUEST_CODE);
} else {
    // 读取私有目录中的文件
    File privateDir = context.getExternalFilesDir(null);
    File[] privateFiles = privateDir.listFiles();
    for (File file : privateFiles) {
        // 处理文件
    }
}

2.2 写入外部存储中的文件

写入外部存储中的文件需要请求外部存储读写权限。需要注意的是,因为外部存储是与其他应用共享的,所以请务必遵守安卓的数据存储最佳实践,例如不要将敏感数据存储在外部存储中。

写入外部存储的代码如下所示:

// 判断读写权限是否已经被授予
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) 
        != PackageManager.PERMISSION_GRANTED) {
    // 请求读写权限
    ActivityCompat.requestPermissions(activity,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            REQUEST_CODE);
} else {
    // 写入文件到私有目录
    File privateDir = context.getExternalFilesDir(null);
    File file = new File(privateDir, "example.txt");
    try {
        FileOutputStream outputStream = new FileOutputStream(file);
        outputStream.write("Hello, world!".getBytes());
        outputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3. Application数据保存

Android中,可以使用多种不同的方式存储应用程序数据,例如:

  • SharedPreferences:用于存储简单的键值对数据。
  • SQLite数据库:用于存储结构化的数据。
  • 文件存储:用于存储文本、图片、媒体等不适合放在数据库中的数据。

3.1 SharedPreferences

SharedPreferences 提供了一种轻量级的数据存储方式,用于存储应用程序的配置信息和少量的其他数据。SharedPreferences是一个接口,其中存储的数据是以键值对的形式存储的。

读取SharedPreferences中的数据的示例代码如下所示:

SharedPreferences preferences = getSharedPreferences("example", Context.MODE_PRIVATE);
String username = preferences.getString("username", "");
int age = preferences.getInt("age", 0);

写入SharedPreferences中的数据的示例代码如下所示:

SharedPreferences preferences = getSharedPreferences("example", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("username", "张三");
editor.putInt("age", 18);
editor.apply();

3.2 SQLite数据库

SQLite数据库是Android操作系统的标准数据库,用于存储大量结构化数据。Android提供了SQLiteOpenHelper类,用于创建和管理SQLite数据库。

创建SQLiteOpenHelper类的示例代码如下所示:

public class ExampleDatabaseHelper extends SQLiteOpenHelper {

  private static final String DATABASE_NAME = "example.db";
  private static final int DATABASE_VERSION = 1;

  public ExampleDatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
    // 创建数据库表
    db.execSQL("CREATE TABLE `user` (" +
                    "`id` INTEGER PRIMARY KEY AUTOINCREMENT," +
                    "`username` TEXT," +
                    "`age` INTEGER" +
                    ")");
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // 数据库升级
    db.execSQL("DROP TABLE IF EXISTS `user`");
    onCreate(db);
  }

}

对SQLite数据库进行增删改查的示例代码如下所示:

// 插入数据
ExampleDatabaseHelper databaseHelper = new ExampleDatabaseHelper(context);
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", "张三");
values.put("age", 18);
db.insert("user", null, values);
db.close();

// 查询数据
List<User> userList = new ArrayList<>();
SQLiteDatabase db = databaseHelper.getReadableDatabase();
Cursor cursor = db.query("user", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
    do {
        int id = cursor.getInt(cursor.getColumnIndex("id"));
        String username = cursor.getString(cursor.getColumnIndex("username"));
        int age = cursor.getInt(cursor.getColumnIndex("age"));
        User user = new User(id, username, age);
        userList.add(user);
    } while (cursor.moveToNext());
}
cursor.close();
db.close();

// 更新数据
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("age", 20);
db.update("user", values, "username = ?", new String[]{"张三"});
db.close();

// 删除数据
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.delete("user", "username = ?", new String[]{"张三"});
db.close();

3.3 文件存储

文件存储适用于储存文本、图片、音频和视频等数据。文件存储对于小文件和常见的媒体文件非常有效。

读取文件的示例代码如下所示:

File file = new File(context.getExternalFilesDir(null), "example.txt");
try {
    InputStream inputStream = new FileInputStream(file);
    InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        // 处理数据
    }
    bufferedReader.close();
    inputStreamReader.close();
    inputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

写入文件的示例代码如下所示:

File file = new File(context.getExternalFilesDir(null), "example.txt");
try {
    FileOutputStream outputStream = new FileOutputStream(file);
    outputStream.write("Hello, world!".getBytes());
    outputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

4. 总结

本文介绍了Android存储卡读写文件与Application数据保存的实现方法,分别介绍了读写外部存储、SharedPreferences、SQLite数据库、文件存储。在开发Android应用时,请合理选择存储方式,并根据使用情况谨慎处理用户数据,保证数据的安全性和隐私性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android存储卡读写文件与Application数据保存的实现介绍 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Win11/10热跳闸错误怎么修复? 电脑CPU高温重启的解决办法

    Win11/10热跳闸错误怎么修复? 什么是热跳闸错误? 热跳闸(thermal trip)是一种CPU过热保护机制,当CPU温度超过指定上限时,系统会自动关闭以防止硬件损坏。如果您不断遇到热跳闸错误,可能需要采取措施修复您的计算机。 修复热跳闸错误的步骤: 步骤1:清洁内部装置 首先,您需要确认您的计算机内部没有积尘和污垢。如果风扇和其他散热装置被堵塞,将…

    other 2023年6月27日
    00
  • CAD中的field字段该怎么使用?

    在CAD中,Field字段是一种特殊的文本对象,它可以动态地更新内容,从而保证文本对象的正确性。在本篇攻略中,我们将详细讲解“CAD中的field字段该怎么使用?”,并给出两个示例,以便读者更好地理解。 1. 什么是Field字段 Field字段是指在CAD中可以在文本对象中引用其他CAD对象属性或系统变量值的一种特殊文本对象。它可以实时地读取相关属性或变量…

    other 2023年6月25日
    00
  • 如何在mac下安装myeclipse2015真的很虐心!!!

    如何在Mac下安装MyEclipse 2015 MyEclipse 2015是一款Java开发工具,可以在Mac系统上使用。但是,安装MyEclipse 2015可能会遇到一些问题。本文将提供一个完整攻略,介绍如何在Mac下安装MyEclipse 2015,并提供两个示例说明。 步骤 步骤1:下载MyEclipse 2015 从MyEclipse官方网站下载…

    other 2023年5月8日
    00
  • 公众号ip地址在哪找? 查看微信公众号ip地址的技巧

    公众号IP地址在哪找?查看微信公众号IP地址的技巧攻略 微信公众号的IP地址是指公众号服务器的IP地址,用于与微信服务器进行通信。了解公众号的IP地址可以帮助我们进行一些网络相关的操作,比如设置域名解析、配置防火墙等。下面是查看微信公众号IP地址的技巧攻略: 1. 登录微信公众平台 首先,我们需要登录微信公众平台,以便获取公众号的相关信息。请按照以下步骤进行…

    other 2023年7月31日
    00
  • Win11中的照片应用程序有哪些新功能?获得新的照片应用程序方法

    Win11中的照片应用程序相对于之前的版本,添加了不少新功能。以下是获得新的照片应用程序方法和新增功能的详细攻略: 获得新的照片应用程序方法 Win11默认自带照片应用程序,如果你的Win11系统是最新版,可以在开始菜单中找到照片应用程序图标,单击即可运行。如果你的系统不是最新版或者无法运行自带的照片应用程序,可以通过微软商店获得新的照片应用程序方法。 在开…

    other 2023年6月25日
    00
  • VS控件内部窗口怎么与Form窗口联动?

    如何让Visual Studio(VS)控件(例如TreeView或ListView)内部显示的窗口与主窗口(Form)联动呢?以下是详细攻略。 步骤一:创建控件并监听事件 首先,您需要在VS所支持的windowns控件(如TreeView或ListView)中插入一些内容,例如树节点或列表项。这个过程与传统控件相同。 接着,在您的窗口代码中找到控件声明并设…

    other 2023年6月26日
    00
  • 开机提示配置文件已损坏将用临时文件进入的多种解决方法

    关于“开机提示配置文件已损坏将用临时文件进入”的多种解决方法,可以按以下步骤进行。 1. 重启电脑 当出现“开机提示配置文件已损坏将用临时文件进入”的提示时,首先建议尝试重启电脑。这是因为有可能是一次意外的系统错误导致了配置文件损坏,重启电脑后此问题可能会解决。 2. 使用“系统还原”恢复 如果重启电脑后仍然出现“开机提示配置文件已损坏将用临时文件进入”的问…

    other 2023年6月25日
    00
  • 微信小程序全局变量改变监听的实现方法

    微信小程序全局变量改变监听的实现方法攻略 在微信小程序中,要实现全局变量的改变监听,可以通过以下步骤进行操作: 步骤一:创建全局变量 首先,在小程序的app.js文件中创建一个全局变量,可以使用getApp()方法获取小程序实例,并在实例中定义全局变量。例如: // app.js App({ globalData: { count: 0 } }) 在上述示例…

    other 2023年7月29日
    00
合作推广
合作推广
分享本页
返回顶部