Storage Options

来源:互联网 发布:青年网络公开课腾讯 编辑:程序博客网 时间:2024/04/29 12:20
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来查询数据.

0 0