安卓中的5种数据存储方式

来源:互联网 发布:手机版开淘宝店铺 编辑:程序博客网 时间:2024/05/21 11:09

安卓的5种数据存储方式主要有

  • SharedPreferences
  • Internal Stroage
  • External Stroage
  • SQLite Database
  • Network Connection

SharedPreferences

我们可以使用SharedPreferences保存任何原始的数据,比如说booleans, floats, ints, longs, and strings。即使你的应用被杀死,这些数据也是可持续的。

为了得到SharedPreferences对象,以下有两种方法

  • getSharedPreferences()。需要指定名字
  • getPreferences。Activity独有的,你不需要指定名字。

向里面写入数据需要经历下面几步

  1. 调用call()方法获得Editor对象
  2. 调用Editor的putBoolean()等方法
  3. 调用commit方法

为了读取数据,调用SharedPreferences的getBoolean()等方法

下面是一个实例

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 Stroage

你可以直接在设备上直接进行存储,默认的情况下,存储在Internal Stroage的数据是私有,其他应用是不能读取的,如果应用被卸载,那么这些file也会跟着被删除。
为了创建和写入数据需要经历以下几个步骤

  1. 调用opeanOutputStream(),public abstract FileOutputStream openFileOutput (String name, int mode),是Context里面的方法,返回一个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的意思是对应用来说是私有的,而且如果有相同的文件名字,没有则会创建,有,则会覆盖原有文件。

为了读取文件我们需要经历以下几个步骤

1.openFileInput(),传入我们需要读取的文件的名字,返回一个FileInputStream对象。
2.调用read()方法
3.调用colse()方法

如果你想在编译期保存一个static file文件,把文件放在res/raw/ 目录下,如果你想打开它,调用 openRawResource()方法,向方法传入 R.raw.参数,这个方法会返回一个InputStream对象,你可以进行读取,但是不能够写入

保存缓存文件
调用getCacheDir方法,会返回一个缓存目录,我们可以把缓存文件存在里面,如果安卓设备的存储量不够,安卓系统可能自动的删除里面的文件,但是我们也可以做相同的事情。应用程序删除会删除上面的文件

下面是一些有用的方法
getFilesDir()
Gets the absolute path to the filesystem directory where your internal files are saved.
getDir()
Creates (or opens an existing) directory within your internal storage space.
deleteFile()
Deletes a file saved on the internal storage.
fileList()
Returns an array of files currently saved by your application.

External Stroage

存储在external stroage上的数据是公开的当启用USB大容量存储的时候。
如果你想向里面存储数据和读取数据只需要 WRITE_EXTERNAL_STORAGE权限
如果你只是想读取数据,需要READ_EXTERNAL_STORAGE权限

<manifest ...>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    ...</manifest>

从安卓4.4开始,如果你读取或者写入对你应用来说是私有的文件的话,这些权限是不需要的。

因为外部存储并不是一定是可用的,所以在存储之前检查他的可用性,例如下面代码

/* 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;}

保存和其他app共享的文件

getExternalStoragePublicDirectory (String type),向里面传入DIRECTORY_MUSIC, DIRECTORY_PICTURES, DIRECTORY_RINGTONES
下面是一个示例

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

保存app私有的文件

getExternalFilesDir()
其中传入一个type参数用来指定子文件夹的类型,如果不需要则传入一个null值。从安卓4.4开始,读或者写app私有的文件是不需要权限的。所以我们可以指定一个 maxSdkVersion属性。如下所示

<manifest ...>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"                     android:maxSdkVersion="18" />    ...</manifest>

当应用程序卸载的时候,保存在上述文件夹里的文件也会被删除。同时私有性的原因,不会被媒体扫描器扫到。但即使是这样,其他应用具有READ_EXTERNAL_STORAGE权限的也会有读的权限,所以如果真的是私有的话,应该把它保存到内部存储当中。

保存缓存文件
getExternalCacheDir()

SQLite Database

这个我之前讲过。。。

Network Connection

和服务器进行交互,所用的类在以下两个包中,这里就不做讨论了

java.net.*android.net.*
0 0