2:数据保存

一、保存到Preferences

提交数据改变:commit(),后来有建议是出于线程同步的需求,否则请使用apply()替代commit(),因为后者可能会卡到UI Thread.

二、保存到文件

File对象非常适合于读写流式顺序的数据。

1、存储在内部还是外部

所有Android设备都有两个文件存储区域:“internal”和"external"。只是现在不再以是否可以卸载区分了。两者区别分三个方面讲:能不能访问,谁能访问,删除。

Internal storage:

1)总是可用的

2)这里的文件默认是只能被你的app访问。如果你不想让用户和其他app访问某块区域,那么Internal是最佳的选择

3)当用户卸载你的app时,系统会把internal里面的相关文件都清除干净

External storage:

1)并不总是可用的

2)都可访问。如果你想让其他app共享某个文件,或者通过电脑能访问,那么它是最好的选择。弊端:大家都可访问,你有可能失去对该文件的访问控制权。

3)当用户卸载你的app时,系统仅仅会删除external根目录(getExternalFilesDir())下的相关文件。

note:app默认被安装到internal storage,可通过在清单文件中声明android:installLocation来指定安装到external storage。

2、保存到Internal Storage

当保存文件到internal storage时,可通过以下方法获取合适的目录作为FILE的对象:

1)getFileDir():返回一个FILE,代表你的app的internal目录。

2)getCacheDir():返回一个FILE,代表你的app的internal缓存目录。再说一遍,缓存。不要太大(最好1M内),因为系统内部存储空间不足时,会自动删除缓存文件。

怎么用:

1)创建一个新的文件

File file = new File(context.getFilesDir(), filename);
2)通过openFileOutput()获取一个FileOutputStream用于写文件到目录
String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;
try {
<span style="white-space:pre">	</span>outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
<span style="white-space:pre">	</span>outputStream.write(string.getBytes());
<span style="white-space:pre">	</span>outputStream.close();
} catch (Exception e) {
<span style="white-space:pre">	</span>e.printStackTrace();
}
获取缓存文件就不讲了~
note:

1)存放位置:你的app的internal storage目录是以你的app的包名作为标识存放在Android文件系统的特定目录下data/data/com.example.xxx。

2)可读性:不指定时,默认为MODE_PRIVATE,其他app不能读写你的internal文件。指定为可读时,其他app就可读取你的internal文件了。

3、保存文件到External Storage

因有时不可用,因此访问之前要检查:

/* Checks if external storage is available for read and write */
保存到Internal Storage
保存文件到External Storage
public boolean isExternalStorageWritable() {
<span style="white-space:pre">	</span>String state = Environment.getExternalStorageState();
<span style="white-space:pre">	</span>if (Environment.MEDIA_MOUNTED.equals(state)) {
<span style="white-space:pre">	</span>return true;
}
<span style="white-space:pre">	</span>return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
<span style="white-space:pre">	</span>String state = Environment.getExternalStorageState();
<span style="white-space:pre">	</span>if (Environment.MEDIA_MOUNTED.equals(state) ||
<span style="white-space:pre">	</span>Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
<span style="white-space:pre">	</span>return true;
}
<span style="white-space:pre">	</span>return false;
}
尽管external storage对于用户与其他app是可修改的,你可能会保存下面两种类型的文件:
public files:这些文件对于用户与其他app来说是public的,当用户卸载你的app时,这些文件应该保留。例如,被你的app拍摄的图片或下载的文件。

private files:这些文件应该是被你的app所拥有的,他们应该在你的app卸载时删除掉。尽管存储在external storage,从技术上讲课被用户与其他app访问,但实际上那些文件对于其他app没意义。因此,你卸载你的app时,系统会删除你app的private目录。

怎么实现以私有方式保存文件呢?

可通过执行getExternalFilesDir()来获取相应的目录,并传递一个指示文件类型的参数。每一个以这种方式创建的目录都会被添加到external storage封装你的app目录下的参数文件夹下。这下面的文件会在你的app被卸载时删除。

public File getAlbumStorageDir(Context context, String albumName) {
<span style="white-space:pre">	</span>// Get the directory for the app's private pictures directory.
<span style="white-space:pre">	</span>File file = new File(context.getExternalFilesDir(
<span style="white-space:pre">	</span>Environment.DIRECTORY_PICTURES), albumName);
<span style="white-space:pre">	</span>if (!file.mkdirs()) {
<span style="white-space:pre">		</span>Log.e(LOG_TAG, "Directory not created");
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>return file;
}
note:getExternalFilesDir()创建的目录会在app被卸载时删除。而getExternalStoragePublicDirectory()不会被删除。

4、查询剩余空间

如果你事先知道要保存到文件大小,可通过执行getFreeSpace() or getTotalSpace()来判断是否有足够的空间来保存文件,从而避免发生IOException。当然,如果你事先不知道文件大小,则通过捕获IOException来实现。

5、删除文件

myFile.delete();
如果文件保存在internal storage,还可通过以下方式:

myContext.deleteFile(fileName);
note:当用户卸载你的app时,Android系统会删除以下文件:
所有保存到internal storage的文件

所有使用getExternalFilesDir()方式保存在external storage的文件。

三、保存到数据库

暂无。

四、隐式跳转(与其他app通信)

暂无。

五、Android分享操作

讲解创建在不同的应用与设备之间进行分享的应用。

1、分享简单数据

2、分享文件

3、使用NFC分享大文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值