数据存储

一、 数据存储的5种方式


使用API Guide学习数据存储的五种方式。

1、 Shared Preferences :  使用键值对的形式去存储私有数据,这种数据只有当前应用可以访问,其他应用无法访问。(数据是以xml的形式存放在data/data/应用程序包名/.)

2、 Internal Storage :其实是以文件的方式,把数据存储到内部存储器上。

3、 External Storage : 其实是以文件的方式把数据存储在外部存储器上。

4、 SQLite Databases : 把数据存储在私有的数据库文件内

5、 Network Connection :把数据存储到远端网络上的服务器上。

 

【备注:】

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

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

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

· 最容易混淆的是外部存储,如果说pc上区分出外部存储和内部存储的话,那么自带的硬盘算是内部存储,U盘或者移动硬盘算是外部存储,因此我们很容易带着这样的理解去看待安卓手机,认为机身固有存储是内部存储,而扩展的SDCard卡是外部存储。比如Nexus 4有16G的内部存储,普通消费者可以这样理解,但是安卓的编程中不能,这16GB仍然是外部存储

 

 

一、 SharedPreferences存储

 SharedPreferencesAndroid系统提供的一个通用的数据持久化框架,用于存储和读取key-value类型的原始基本数据类型对,目前支持stringintlongfloatboolean基本类型的存储,对于自定义的对象数据类型,无法使用SharedPreferences来存储。

        SharedPreferences主要用于存储系统的配置信息。例如上次登录的用户名,上次最后设置的配置信息(如:是否打开音效、是否使用振动,小游戏的玩家积分等)。当再次启动程序后依然保持原有设置。SharedPreferences用键值对方式存储,方便写入和读取。

 

写数据步骤:

1、根据Context获取SharedPreferences对象   

SharedPreferences sp = ctx.getSharedPreferences("user", MODE_PRIVATE);

说明:参数一:文件名(不需要扩展名,会自动使用xml作为扩展名)  参数二:文件的访问模式。共四种:

Context.MODE_PRIVATE    =  0

Context.MODE_APPEND    =  32768(SharedPreferences不支持)

Context.MODE_WORLD_READABLE =  1

Context.MODE_WORLD_WRITEABLE =  2

(最后两种模式,从4.2开始android已经不推荐使用了!!!)

 

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND

Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。

Context.MODE_WORLD_READABLEContext.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

 

MODE_MULTI_PROCESS :这个是一个标示位,2.32.3以前默认都是开启的,2.3以后是默认不开启。主要用于跨进程访问。

 

2、利用edit()方法获取Editor对象。   

SharedPreferences.Editor editor = settings.edit();

获得一个编辑器,使用这个编辑可以向文件中写入数据

 

3、通过Editor对象存储key-value键值对数据。   

editor.putString(“name”,”lisi”);

 

editor.putString(“sex”,”男”);

存入数据,可以写字符串、intlongfloatbooleanSet

 

4、调用Editor对象的commit()方法提交数据。

必须调用该方法,否上述数据不会存入到文件中。

 

 

读数据步骤:

1、 根据Context获取SharedPreferences对象  

调用SharedPreferencesgetXxx(key, defaultValue)方法,取得相应 key对应的值。

二、 内部存储

内部存储路径是: /data/data/app包名/files

注意:真机若想看到此目录,必须root之后,安装相应的文件浏览器才可以看到,模拟器无此限制。

Activity内部调用:

1、 openFileInput(不需要路径的文件名)  //打开一个输入流,可以从指定的文件中读取数据

openFileOutput(不需要路径的文件名, mode) //打开一个输出流,可以向输入流写数据,然后数据保存到指定的文件中。

三、 外部存储

泛指sd卡,但是目前的很多手机读不支持外置sd卡,平时手机说的16g 32g等也是指的sd卡,只不过厂家内置,不再支持扩展而已。

读写sd上的文件请按如下步骤进行:

1、 app申请需要的权限。(尽量多申请)

 android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

允许向sd写数据的权限

允许挂载和卸载sd

允许读sd数据的权限。(这个权限默认是开启的,但是建议仍然申请,以备后患)

2、 调用EnviromentgetExternalStorageState()方法来判断手机是否插入SD卡。

String state = Environment.getExternalStorageState();

// 如果sd卡存在,并且正常挂载(分区从属目录),可读写

if(state.equals(Environment.MEDIA_MOUNTED)){

}

3、 调用EnvironmentEnvironment.getExternalStorageDirectory();获得外部存储器的sd卡的目录。

返回值类型是File类型。

4、 创建相应的IO流进行数据的读写。

 

 

 

 

 

补充:

1、 获得外部存储的公共目录Envirment.getExternalStoragePublicDirectory(参数)  DIRECTORY_MUSIC, DIRECTORY_PICTURES, DIRECTORY_RINGTONES, or others.

2、 获得外部该app的私有存储目录context.getExternalFilesDir(type) ;  type可以指定类型,然后会在相应的类型。如果不指定相应的类型,则获得路径是:Android/data /包名/files

DIRECTORY_ALARMS //警报的铃声
DIRECTORY_DCIM //相机拍摄的图片和视频保存的位置
DIRECTORY_DOWNLOADS //下载文件保存的位置
DIRECTORY_MOVIES //电影保存的位置, 比如 通过google play下载的电影
DIRECTORY_MUSIC //音乐保存的位置
DIRECTORY_NOTIFICATIONS //通知音保存的位置
DIRECTORY_PICTURES //下载的图片保存的位置
DIRECTORY_PODCASTS //用于保存podcast(博客)的音频文件
DIRECTORY_RINGTONES //保存铃声的位置

3、 获取磁盘空间大小:

File root = Environment.getExternalStorageDirectory(); //获得外部存储目录

    StatFs  Fs = new StatFs(root.getAbsolutePath()); //该对象可以 获取指定目录的文件系统的信息

    le total = statFs.getTotalBytes() / 1024.0 / 1024.0; //获取总的大小

    le current = statFs.getAvailableBytes() / 1024.0/ 1024.0; //获取可用大小

Toast.makeText(this, "" + total + "   " + current, 1).show();

 

 

注意:获取路径的时候,公共的一般是用的Environment的方法,app私有的一般是使用的上下文对象的方法。

 

android中常用路径总结:

1、公共路径:所有的app都可以访问

System.out.println(Environment.getDataDirectory());   //   /data

System.out.println(Environment.getDownloadCacheDirectory());  // /cache

System.out.println(Environment.getExternalStorageDirectory()); // /storage/sdcard

System.out.println(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS)); //  /strorage/sdcard/Alarms

System.out.println(Environment.getRootDirectory());  //  /system

2、私有路径:只有当前应用可以访问

System.out.println(getFilesDir()); //  /data/data/包名/files

System.out.println(getCacheDir());  // /data/data/包名/cache

System.out.println(getExternalCacheDir());  // /storage/sdcard/Android/data/包名/cache

//  /storage/sdcard/Android/data/包名/files/DCIM

System.out.println(getExternalFilesDir(Environment.DIRECTORY_DCIM));



你可能感兴趣的:(android知识点)