首页 > 代码库 > Android 数据存储

Android 数据存储

Android 数据存储

Android提供了多种可选的方式让你永久地保存应用程序的数据。方案的选择取决于你的特殊需要,如数据是否需要对你的应用程序是私有的或者可以被其他应用程序(或用户)访问,还有你需要多大的存储空间。

数据存储方案由以下几种:

Shared Preferences

以键-值对的形式保存私有的原始类型的数据

Internal Storage

将私有数据保存在设备的存储区中

External Storage

将共享数据保存在共享外部存储区中

SQLite Databases

将结构化的数据保存在私有的数据库中

Network Connection

将数据保存在你的web服务器中

Android也提供了一种可以对其他应用程序暴露私有数据的方式——通过 content provider. content provider 是一个可选的用于供其他应用程序读写你的应用程序数据的组件,取决于你要暴露哪些数据。想要获得更多的关于 content provider的信息,请参考文档 Content Providers 

 

Shared Preferences

通过以下两种方式的任何一种可以获得你的应用程序的 Shared Preferences 对象。

· getSharedPreferences() - 如果你需要多个用名字标识的 preferences 你可以用这个方法,通过第一个参数来指定需要的 preferences 。

· getPreferences() -如果你的 Activity 只需要一个 preferences 文件,你就可以使用这个方法。因为该方法得到的 preferences 文件将会是 Activity 中唯一的 preferences,你不需要提供一个名字。

写入值:

1. 调用 edit() t获得一个 SharedPreferences.Editor对象。

2. 通过 putBoolean()  putString()等方法写入值。

3. 通过 commit()方法提交修改后的数据。

通过 SharedPreferences  getBoolean()  getString()等方法读取其中的值。

下面是一个使用 : SharedPreferences 的例子:

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();
    }
}

Internal Storage

你可以直接把文件保存到设备的内部存储中。默认地,保存到内部存储中的文件对你的应用是私有的,其他应用程序(或用户)不能够访问它们。当用户卸载掉你的程序后,这些文件就被删除了。

创建并写入私有文件到内部存储中:

1. 调用 openFileOutput() 方法并传入文件的名称和操作方式。该方法返回一个 FileOutputStream 对象。

2. 通过 write()方法写文件。

3. 通过 close()方法关闭流。

例如:

String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();

MODE_PRIVATE 模式将会创建一个文件(或替换掉已有的同名文件)并使它对你的应该程序私有。其他可用的模式有: MODE_APPEND, MODE_WORLD_READABLE, and MODE_WORLD_WRITEABLE.

从内部存储空间读取文件:

1. 调用 openFileInput() 方法并传入要读取的文件的名字。该方法返回一个 FileInputStream 。

2. 从文件读取字节 read().

3. 关闭流 close().

提示:如果你想要在编译时在你的应用程序中保存一个静态文件,你可以将该文件存放在 res/raw/目录下。你可以通过 openRawResource()来打开该文件通过传入 R.raw.<filename> 资源ID.该方法返回一个 InputStream ,你可以通过该输入流来读取你的文件(但是不能写入到原始文件)。

保存缓存文件

如果你想缓存一些数据而不是永久地保存它们,你应该用 getCacheDir()方法来打开一个代表你的应用程序存放临时缓存文件的内部目录的File对象。

当你的设备内部存储空间不足时,Android 可能会删除这些缓存文件以恢复空间。然而,你不应该依赖于系统去为你清除这些文件。你应该始终自己去维护这些缓存文件并且使它们保持在一个合理的空间消耗大小范围内,例如 1MB.当用户卸载你的应用时,这些文件也将被删除。

其他常用方法:

getFilesDir()

获取你的内部文件在文件系统上保存的绝对路径。

getDir()

创建(如果存在则打开)你的内部存储空间的目录。

deleteFile()

删除内部存储中保存的一个文件。

fileList()

以文件数组的形式返回你的应用保存的文件。