Saving Data

本文介绍了Android应用中的多种数据存储方式,包括使用SharedPreferences保存简单的键值对数据,利用内部和外部存储文件实现数据的持久化存储,以及如何通过SQL数据库保存更复杂的数据结构。

http://www.cnblogs.com/gcg0036/p/4321278.html

Saving Key-Value Sets:

如果想保存一个相对较小的key-values集合,可以使用 SharedPreferences API. SharedPreferences对象指向包含key-value对的文件,并且提供简单的读写方式。每个SharedPreferences文件均由框架管理,私人或共享均可使用。

可以保存任何简单类型的数据:boolean、float、int、long 和 string 。 这些数据是持久保存的,可以跨越用户会话(即使应用程序被杀死了也没关系)。

 

您可以创建新的共享首选项文件,或者采取两种方式之一来调用现有文件。

  1. getSharedPreferences() 如果需要用到多个配置文件,就用这个方法,第一个参数指定了文件的名称。你可以从应用程序的任何 Context调用这一函数。
  2. getPreferences() 如果只需为 Activity 定义一个配置文件,就用本方法。。因为该文件对于 Activity 而言是唯一的,所以不需要命名。
Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE);
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);

读取,可以使用getInt() 、 getString()等调用方法来提供你想要的关键值,当键不存在时会返回某个默认值

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);

写入,需要调用SharedPreferences上的edit()来创建SharedPreferences.Editor,然后调用commit()来保存

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();

 

Saving Files

File 对象适用于在start-to-finish读取或写入大量数据,File对象适合于读取或者写入大量数据

内部存储:
  • 始终可用。
  • 保存的文件只能用于默认应用程序。
  • 当用户卸载应用程序时,系统会从内部存储删除应用程序所有文件。
当要确保无论用户还是其他应用程序均可访问文件时,内部存储无疑是最好的选择。 外部存储
  • 由于用户可以安装外部存储作为USB存储,并且在某些情况下可以从设备中移除,所以外部存储并不总是可用的。
  • 具有全局可读性,所以保存的文件可能被控制范围外的人读取。
  • 用户想要卸载应用程序,只有当 应用程序文件保存在getExternalFilesDir()目录时系统才会删除应用程序文件。
对于不需要访问限制的文件以及要同其他应用程序共享或者允许用户使用计算机访问的文件,外部存储无疑是最好的途径。

要写入外部存储,就必须在 manifest file中请求 WRITE_EXTERNAL_STORAGE的权限。

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

内部存储文件不需要任何权限。应用程序始终有权在其内部存储目录读取及写入文件。

注意: 自 Android 4.4 开始,如果只是读写应用程序私有的文件,则不再需要申请上述权限了。

在内部存储保存文件

getFilesDir() 返回表示应用程序内部目录的文件 getCacheDir() 返回表示应用程序临时缓存文件的内部目录的文件。一旦不再需要要确保删除每个文件。确保删除不再需要的文件并且设置合理大小的内存总量,比如1MB。如果系统存储开始运行缓慢,它可能会不经警告而删除缓存文件。
String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;
 
try {
  outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
  outputStream.write(string.getBytes());
  outputStream.close();
} catch (Exception e) {
  e.printStackTrace();
}

如果需要缓存文件,就应该使用createTempFile()。例如从URL中提取文件名并且在应用程序内部缓存目录创建文件,方法如下:

public File getTempFile(Context context, String url) {
    File file;
    try {
        String fileName = Uri.parse(url).getLastPathSegment();
        file = File.createTempFile(fileName, null, context.getCacheDir());
    catch (IOException e) {
        // Error while creating file
    }
    return file;
}

在外部存储保存文件

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}
 
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

尽管外部存储可以由用户和其他应用程序进行修改,有两类文件可以在外部存储:
公共文件
其他应用程序和用户可以自由访问该文件。卸载应用程序时,用户仍然可以使用这些文件。例如从应用程序或者其他下载文件获得的照片。
私密文件
卸载应用程序时,属于该应用程序的私密文件应该删除。尽管从技术角度由于外部存储,用户和其他应用程序可以访问这些文件。用户卸载应用程序时,系统会删除应用程序外部私密目录中的所有文件。
例如应用程序或者临时媒体文件下载的其他资源。
public File getAlbumStorageDir(String albumName) {
    // Get the directory for the user's public pictures directory. 
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}
public File getAlbumStorageDir(Context context, String albumName) {
    // Get the directory for the app's private pictures directory. 
    File file = new File(context.getExternalFilesDir(
            Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

使用API常量比如DIRECTORY_PICTURES提供的目录名称是很重要的。这些目录名称确保系统可以适当处理文件。例如保存在 DIRECTORY_RINGTONES的文件由系统媒体扫描来进行铃声分类而不是音乐分类.

getFreeSpace() 和 getTotalSpace()可以找出是否有足够的可用空间

删除文件可以是delete()。deleteFile()来请求Context定位和删除文件

注意:用户卸载应用程序时,安卓系统会删除以下内容:
  • 内部存储的所有文件。
  • 使用 getExternalFilesDir()外部存储的所有文件。
然而你要手动删除getCacheDir() 定期创建的所有缓存文件,同时定期删除其他不需要的文件。

Saving Data in SQL Databases:

http://wiki.eoeandroid.com/Saving_Data_in_SQL_Databases

转载于:https://www.cnblogs.com/gcg0036/p/4321278.html

这段代码是一段基于Android平台的数据库操作代码,主要用于向SQLite数据库插入数据,并根据结果给出相应的提示信息。以下是详细分析: ### 1. **代码功能** - `db.insert(MyDatabaseHelper.TABLE_NAME, null, values)` 这行代码通过`insert()`方法将一组数据(由`values`提供)插入到指定表 (`MyDatabaseHelper.TABLE_NAME`) 中。如果插入成功,则返回新插入行的主键值;若失败则返回 `-1`。 - 如果`newRowId != -1L` 表示数据插入成功,程序会弹出一条短暂的消息框显示“Data saved successfully!”。 - 如果`newRowId == -1L` 则表示插入失败,程序会弹出消息框显示 “Error saving data!” --- ### 2. **关键点解析** #### (1)**`db.insert()` 方法的作用** - 参数解释: - 第一参数:目标表格名称,在这里是 `MyDatabaseHelper.TABLE_NAME`; - 第二参数:nullColumnHack,通常设置为 `null`,当提供的列名为空时会自动添加一行包含空字段的数据; - 第三参数:`ContentValues` 对象,存储了需要插入的关键字对 (Key-Value),即要保存的具体内容。 #### (2)**判断条件 `if (newRowId != -1L)`** - 当 `insert()` 成功时,返回的是新增记录的 `_id` 值,也就是该条目在表中的唯一标识符。 - 若返回值为 `-1` ,说明发生了错误,例如违反约束、表不存在等。 #### (3)**Toast 消息机制** - 使用 `Toast.makeText(context, text, duration).show();` 来快速展示短时间内的反馈信息给用户。 - `context`: 上下文环境(如当前Activity实例)。 - `text`: 要显示的文字信息。 - `duration`: 显示持续的时间长度,这里用了 `Toast.LENGTH_SHORT` 短暂显示。 --- ### 3. **注意事项** - 需确认 `MyDatabaseHelper` 已经正确定义并且与实际使用的 SQLite 数据库相匹配。 - 插入前应保证 ContentValues 的 key 和 table schema 定义一致,否则可能导致异常。 - 错误处理可以进一步增强,比如打印日志或捕获更具体的 SQLException 异常情况。 --- ### 示例补充 假如我们要往一张名为"Users"的表里增加新的用户资料,假设包括用户名(username), 密码(password)以及年龄(age): ```kotlin val values = ContentValues().apply { put("username", "JohnDoe") put("password", "securePass123") put("age", 30) } ``` 然后使用上述类似结构完成插入动作即可。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值