您的位置:首页 > 运维架构

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来查询数据.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: