转载请注明来源: http://blog.csdn.net/kjunchen/article/details/51549097
Android Data Storage
一、 存储选择
Android为我们持久化保存应用数据提供了几种可供选择的方法,具体选择可根据自己的特殊需求。
Shared Preferences: 用键值对的方式存储私有的原始数据。
Internal Storage: 在内存中存储私有数据。
Internal Storage: 在可共享的外部存储上存储公开的数据。
SQLite Databases: 在私有数据库上存储结构化数据
Network Connection: 网络存储
Shared Preferences:
二、 使用外部存储(Using the External Storage)
每一个兼容的Android设备都支持一个公用的外部存储,可以让你使用它去保存文件。这个可以是一个可移除的存储设备(如SD卡)或者是不可移除的内部存储。当用户通过USB将大量的存储文件转移到电脑上时,就可以对保存在外部存储器的文件进行读取和修改。
警告:如果用户在电脑上使用外部存储器或者移除外部存储器,那么外部存储就不可用了,此时强制保存在外部存储上是不安全的。所有的应用可以读写放在外部存储器中的文件,并且用户可以删除他们。
1. 获得外部存储权限
为了在外部存储器上读取或者写入文件,你的app必须获得READ_EXTERNAL_STORAGE或者WRITE_EXTERNAL_STORAGE系统权限。如:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果你既要读取文件又要写入文件,那么你只需要申请WRITE_EXTERNAL_STORAGE权限即可,因为它也隐含性的获得了读取的入口。
注:从Android4.4开始,在你自己的app中读取或写入文件可以不获得这些许可的。
2. 检查外部存储器的可用性
当你在外部存储器上做任何操作之前,你都应该调用getExternalStorageState()方法去检查外部存储器是否可用。因为你的存储器可能已经安装在电脑上、移除、只读或者其他的状态。
/* 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;
}
调用getExternalStorageState()方法返回的状态可能是你要检查的,例如,存储是否已经开始共享,完全失踪,已经彻底移除等等。当你的应用需要存储入口的时候你可以使用这些状态去通知你的用户更多的信息。
三、 使用SQLite数据库(Using Databases)
Android对SQLite数据库提供全面的支持。在应用的任何类中都可以通过名字创建数据库,但不能在应用外部。
创建一个新的SQLite数据的推荐做法是创建一个SQLiteOpenHelper的子类并重写onCreate()方法。在数据库里可以执行一条SQLite命令去创建表。如:
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);
}
}
使用自定义的构造器获得SQLiteOpenHelper实例,调用getWritableDatabase() and getReadableDatabase()方法分别从数据库中进行写和读操作。这两个方法都会返回一个SQLiteDatabase对象,代表数据库并且为SQLite提供操作方法。
欢迎加QQ群交流: 365532949
Homepage: http://junkchen.com