今天上午学习了IDEA的调试 由于是看别人的帖子学习的图又太多就不抄袭了今天就收集一些Android数据存储相关的知识。
大致分为三种数据存储方式,分别为:Saving key-value sets(保存键值对的集合);saving file(磁盘文件);SQL database数据存储
第一种:Saving key-value sets(保存键值对的集合)
保存键值对的集合采用SharedPreferences APIs,一个SharedPreferences对象指向一个包含有键值对的文件,通过SharedPreferences APIs可以读写该文件。
1.1 创建/使用shared preference file
创建使用shared preference file的方式有以下两种:
1) getSharedPreferences():在任何地方都通过该api创建/使用多个shared preference file;
2) getPreferences() :在某一个activity中通过该api使用默认的preference file。
Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences(
getString(R.string.preference_file_key), Context.MODE_PRIVATE);
例子中,shared preferences files是通过resource string R.string.preference_file_key来识别的,文件访问模式是private mode,表示该文件只能被该app使用。访问模式还可以为:MODE_WORLD_READABLE 、MODE_WORLD_WRITEABLE。
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);//访问当前activity 的shared preferences file, 访问模式是private mode
1.2 写入shared preferences file
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();//通过edit()创建一个 SharedPreferences.Editor
editor.putInt(getString(R.string.saved_high_score), newHighScore);// putInt()和putString()写入键值对
editor.commit(); //保存改变
1.3 读取shared preferences file
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); // getInt() getString读取键值对
2. Saving files(读取磁盘文件)
这一部分即disk读取文件,通过File APIs读取android file system文件。文件读取分为两部分:内部存储(Internal storage)/外部存储 (External storage),internal storage即设备提供的内置的非易失性内存;External storage即SD卡。下面先简单介绍一下内部存储/外部存储的区别:
1) Internal storage:存储永远可用;文件仅限于该app使用;卸载app文件将被移除。
2) External storage:有SD卡时才可用;其余app也可以读取这些文件;卸载app时是否删除文件取决于是否调用了getExternalFilesDir(). 可以在PC上读取这些文件。
2.1 获取External storage的权限
需要在manifest file 中给与WRITE_EXTERNAL_STORAGE/ READ_EXTERNAL_STORAGE permission。
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
2.2 将文件保存在Internal storage中
1) getFilesDir()返回app的内部存储路径
2) getCacheDir()返回app的临时缓冲文件的内部存储路径,由于内存有限,这些文件需要及时清理。
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();
}
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;
}
2.3 将文件保存在External storage中
2.3.1 检查External Storage是否可用
先通过getExternalStorageState()检查External Storage是否可用,如果返回的状态是MEDIA_MOUNTED则表示可以读写外部存储。
/* 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;
}
2.3.2 外部存储文件
外部存储文件分为两类:
1) Public files:其他用户、app可以共享这些文件,删除app这些文件不会被删除。通过getExternalStoragePublicDirectory()保存public文件。
2) Private files:文件的使用仅限于该app,删除app文件也将被删除。通过getExternalFilesDir ()保存private文件,删除app这些文件都会被删除。如果希望删除app的时候不要删除这些文件,则需要调用getExternalStoragePublicDirectory() api来保存文件。
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;
}
2.3.3 查询可用的磁盘空间
写入文件之前需要考虑磁盘空间是否足够,如果磁盘空间不足会导致IOException。查询可用的磁盘空间的api为calling getFreeSpace()/ getTotalSpace()
2.4 文件删除
1) myFile.delete();//删除已打开的文件
2) myContext.deleteFile(fileName);//删除内部存储文件
3. Saving data in SQL databases(SQL数据库的存储)
对于重复性\有结构性的数据一般都保存在database中。Android database数据的存储调用的api在android.database.sqlite package中。SQL database需要定义schema/ contract模式,也就是数据如何组织。这一部分涉及到sql database操作,这里就不再继续详细翻译了。
参考 website:http://developer.android.com/training/basics/data-storage/index.html
转载 http://www.dzwanli.com.cn/?p=319
可以看看这个Android–sharepreference总结
Android目录用途
- src
source code源代码,src目录下的文件是根据package结构管理。
- gen
build之后自动生成,BuildConfig.java可以忽略,重要的是R.java。R.java文件是只读的,R类定义该项目所有资源的索引,通过R.java可以快速查找我们需要的资源,另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,可以减少应用在手机中占用的空间。
- Android {版本号}
该文件夹下android.jar文件包含了构建应用程序所需的所有的Android SDK库和APIs。通过android.jar将自己的应用程序绑定到Android SDK和Android Emulator,这允许你调用所有的Android库和包,且使你的应用程序可以用模拟器调试运行。
- res
res为外部资源文件(图片、数据文件等),并将它们编译进应用程序,默认会有三个子目录:drawabel、layout、values。
drawabel:包含一些你的应用程序可以用的图片、图标文件(.png、.jpg);
layout:界面布局文件(*.xml);
values:存储格式也为*.xml文件,主要是应用中要引用的key-value对。文件中声明了数组(Array)、颜色(color)、度量(Dimension)、字符串。之所以把这些东西分别放在单独的xml文件中主要是考虑到这些值能够在不更改源代码的情况下用于多语言环境。
- assets
这个目录和res文件夹差不多,也是应用中引用到的一些外部资源,比如视频、mp3文件。但主要区别在于这些资源是以原始格式保存,assets目录下的资源文件不会在R.java自动生成ID,所以读取assets目录下的文件必须指定文件的路径。res目录下的资源文件会在R.java自动生成ID,并将它们编译进应用程序。
- bin
bin包含项目编译之后生成的apk包和class文件。编译的过程首先是编译成为Android Java虚拟机(Dalvik Virtual Machine)文件classes.dex,再把该classes.dex文件打包成为apk包,apk包即为Android平台上安装的应用程序包。
- AndroidManifest.xml
项目的总配置文件,记录应用使用的各种组件activity、view、service之类的信息。AndroidManifest.xml列出了应用程序所提供的功能,用户权限列表,同时也详细描述了应用的项目结构等等信息。
- project.properties
记录项目中所需要的环境信息,比如Android的版本等。