Storage Options
2016-07-29 18:10
429 查看
Android 系统提供很多种方法用于永久存储application的数据.选用哪种方式存储依赖于特定的需求。数据是不是私有还是其他application也可以访问,存储数据需要多大的空间等.
Shared Preferences:以key-value配对的方式存储
Internal Storage:在设备的存储空间上存储私有数据
External Storage:在外部存储设备上存储公用的数据
SQLite Databases:存储结构话的数据在私有的数据库中.
Network Connection:在网络服务器上存储数据
Shared Preferences:
sharedPreferences 类提供一个框架运行你存储和读取存储以key-value配对的方式存储永久存储器上的数据。数据的类型包括:booleans,ints,longs,和strings。
要在application中使用sharePreference,需要下面两个函数中的一个。
SharedPreferences getSharedPreferences (String name, int mode) 可以被其他application 用name来访问.
SharedPreferences getPreferences (int mode) 只在你的Activity中方位,不需要提供name.
1:呼叫edit(),获得一个SharedPreferences.Editor
2:通过putBoolean()/ putString()存储数据
3:call commit()提交改动
读的话调用getBoolean()/getString()
public class Calc extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override
protected void onCreate(Bundle state){
super.onCreate(state);
. . .
// Restore preferences
//使用两个参数的接口,可与被其他Activity 用name访问
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean silent = settings.getBoolean("silentMode", false);
setSilent(silent);
}
@Override
protected void onStop(){
super.onStop();
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// Commit the edits!
editor.commit();
}
}
举例如下:
public class Calc extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override
protected void onCreate(Bundle state){
super.onCreate(state);
. . .
// Restore preferences
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean silent = settings.getBoolean("silentMode", false);
setSilent(silent);
}
@Override
protected void onStop(){
super.onStop();
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// Commit the edits!
editor.commit();
}
}
你也可以以文件的形式将数据存在设备的内部存储空间上.默认情况下这种方式保存的文件只能在application 内
部访问,不能被其他application 访问,当application 卸载时,保存的文件会被删除.
可以调用openFileOutput,第一个参数是filename,第二个是mode(MODE_PRIVATE/MODE_APPEND/MODE_WORLD_REABEL/MODE_WORLD_WRITEABLE).打开文件后,调用write 命令或者read。完成后close文件.
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
如果你只是想把数据存到dram中作为cache来使用,你可以调用getCacheDir()来打开一个文件。当系统的dram 不足时,cache文件可能会被删掉。
getFileDir():返回存在内部存储文件的绝对路径.
getDir():创建或者打开一个存储在内部存储器上的文件.
deleteFile():删除内部存储器上的文件.
fileList():返回存储文件的数组.
你也可以把数据存到SD 卡上,这时候需要在manifest文件中申明权限。WRITE_EXTERNAL_STORAGE这个权限也保证有对SD 的读权限.
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
在你往SD 卡上写东西的时候应该要检测SD是否MOUNT状态,如下所示。
/* 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;
}
如果只是读的话,只要check是否READ_ONLY即可.
/* 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;
}
如果是通过getExternalStoragePublicDirectory 返回的目录可以被其他application 访问,例如DIRECTORY_MUSIC等.
也自己自建目录.
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;
}
通过getExternalFileDir()得到的目录是application 私有的目录,其他application 不能访问.
也可以通过调用GetExternalCacaheDir()将cache文件放到SD 中.
可以通过SQLite 开存application 私有的数据.一般要实现SQLiteOpenHelper的子类,并重新onCreate方法,如下所示:
public class DictionaryOpenHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 2;
private static final String DICTIONARY_TABLE_NAME = "dictionary";
private static final String DICTIONARY_TABLE_CREATE =
"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
KEY_WORD + " TEXT, " +
KEY_DEFINITION + " TEXT);";
DictionaryOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DICTIONARY_TABLE_CREATE);
}
}
通过getWritableDatabase 和 getReadableDatabase来读写data base,可以通过SQLiteDatabase query来查询数据.
Shared Preferences:以key-value配对的方式存储
Internal Storage:在设备的存储空间上存储私有数据
External Storage:在外部存储设备上存储公用的数据
SQLite Databases:存储结构话的数据在私有的数据库中.
Network Connection:在网络服务器上存储数据
Shared Preferences:
sharedPreferences 类提供一个框架运行你存储和读取存储以key-value配对的方式存储永久存储器上的数据。数据的类型包括:booleans,ints,longs,和strings。
要在application中使用sharePreference,需要下面两个函数中的一个。
SharedPreferences getSharedPreferences (String name, int mode) 可以被其他application 用name来访问.
SharedPreferences getPreferences (int mode) 只在你的Activity中方位,不需要提供name.
1:呼叫edit(),获得一个SharedPreferences.Editor
2:通过putBoolean()/ putString()存储数据
3:call commit()提交改动
读的话调用getBoolean()/getString()
public class Calc extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override
protected void onCreate(Bundle state){
super.onCreate(state);
. . .
// Restore preferences
//使用两个参数的接口,可与被其他Activity 用name访问
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean silent = settings.getBoolean("silentMode", false);
setSilent(silent);
}
@Override
protected void onStop(){
super.onStop();
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// Commit the edits!
editor.commit();
}
}
举例如下:
public class Calc extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override
protected void onCreate(Bundle state){
super.onCreate(state);
. . .
// Restore preferences
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean silent = settings.getBoolean("silentMode", false);
setSilent(silent);
}
@Override
protected void onStop(){
super.onStop();
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// Commit the edits!
editor.commit();
}
}
你也可以以文件的形式将数据存在设备的内部存储空间上.默认情况下这种方式保存的文件只能在application 内
部访问,不能被其他application 访问,当application 卸载时,保存的文件会被删除.
可以调用openFileOutput,第一个参数是filename,第二个是mode(MODE_PRIVATE/MODE_APPEND/MODE_WORLD_REABEL/MODE_WORLD_WRITEABLE).打开文件后,调用write 命令或者read。完成后close文件.
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
如果你只是想把数据存到dram中作为cache来使用,你可以调用getCacheDir()来打开一个文件。当系统的dram 不足时,cache文件可能会被删掉。
getFileDir():返回存在内部存储文件的绝对路径.
getDir():创建或者打开一个存储在内部存储器上的文件.
deleteFile():删除内部存储器上的文件.
fileList():返回存储文件的数组.
你也可以把数据存到SD 卡上,这时候需要在manifest文件中申明权限。WRITE_EXTERNAL_STORAGE这个权限也保证有对SD 的读权限.
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
在你往SD 卡上写东西的时候应该要检测SD是否MOUNT状态,如下所示。
/* 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;
}
如果只是读的话,只要check是否READ_ONLY即可.
/* 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;
}
如果是通过getExternalStoragePublicDirectory 返回的目录可以被其他application 访问,例如DIRECTORY_MUSIC等.
也自己自建目录.
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;
}
通过getExternalFileDir()得到的目录是application 私有的目录,其他application 不能访问.
也可以通过调用GetExternalCacaheDir()将cache文件放到SD 中.
可以通过SQLite 开存application 私有的数据.一般要实现SQLiteOpenHelper的子类,并重新onCreate方法,如下所示:
public class DictionaryOpenHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 2;
private static final String DICTIONARY_TABLE_NAME = "dictionary";
private static final String DICTIONARY_TABLE_CREATE =
"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
KEY_WORD + " TEXT, " +
KEY_DEFINITION + " TEXT);";
DictionaryOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DICTIONARY_TABLE_CREATE);
}
}
通过getWritableDatabase 和 getReadableDatabase来读写data base,可以通过SQLiteDatabase query来查询数据.
相关文章推荐
- linux -- 进程的查看、进程id的获取、进程的杀死
- 判断元素是否可以滚动scroll
- TIPOP 开发服务端WEB SERVER
- Ubuntu Server 安装 Subversion实现精细的目录访问权限控制 安装Subversion和Apache sudo apt-get install subversion li
- 理解RESTful架构
- Hadoop2.7.0学习——伪分布式搭建
- cat监控平台环境搭建 专题
- Linux进程调度之CFS调度器概述--Linux进程的管理与调度(二十四)
- Linux下的进程间通信-详解
- 教你Windows平台安装配置Hadoop2.5.2(不借助cygwin)
- openSNS(V2版本) 用户身份切换可能产生的bug以及正规流程
- 复制黏贴上传excel文件到网站
- linux一些基本认识、见解或看法
- linux下Ping工具的C语言实现
- ubuntu14.04+hadoop2.6.2+hive1.1.1
- Linux syslog机制
- Linux 解除安裝 Java?
- ubuntu下安装配置部署zabbix3.0――基于docker
- linux 下安装php Apache mysql
- Opencv Flann库的讲解