67.Android中的数据存储总结

转载:http://mp.weixin.qq.com/s?__biz=MzIzMjE1Njg4Mw==&mid=2650117688&idx=1&sn=d6c73f9f04d02ede7a741b45e801d74e#rdhtml

本篇文章会帮助你们快速了解Android中各类数据存储机制的应用场景以及基本使用方法,力求在头脑中创建一个“目录”。有了这个目录,具体使用细节在实际应用时再查询文档便可获得。android

0. 概述数据库

Android为咱们提供了如下存储机制:缓存

  • Shared Preferences:  以键-值对方式存储应用私有的原始类型数据。服务器

  • Internal Storage(内部存储):  存储应用私有数据于设备自己的存储空间中网络

  • External Storage(外部存储):  将公共数据存储于外部存储(如SD卡)中ide

  • SQLite Databases(SQLite数据库):  将结构化数据存储于私有数据库中ui

  • Network Connection:  将数据存储在你的网络服务器中spa

     

 在以上几种数据存储方式中,咱们能够根据实际需求进行灵活选择。好比,“数据是本应用私有的仍是与其余应用共享”、“要存储的数据大概须要多少存储空间”等都是咱们在选择具体的数据存储机制时所要考虑的问题。下面咱们来一块儿看一下这几种存储机制的应用场景和基本使用方法。code

 

 

1. 使用Shared Preferences

这种存储方式用于存储原始类型数据,包括boolean、int、long、float、double、String等。具体的存储方式是键-值对,若咱们不主动删除,这些数据会一直存在。

根据以上介绍,咱们很容易得出Shared Preferences适合存储的数据有:

  • 小游戏的历史最高分(整型数据);

  • 用户偏好设置:是否只在wifi时才加载图片(boolean型)、是否开启夜间模式(boolean型);

  • 全部可以用原始类型所表示的用户数据...

     

要使用Shared Preferences,咱们首先要获取一个SharedPreference对象,要获取这个对象有两种方法:

  • getSharedPreferences() - :使用这个方法能够为每一个数据文件指定一个文件名。

  • getPreferences() -当你的Activity只须要一个数据文件来保存用户数据时,这个方法就是你的菜。

 

在经过以上两种方式之一获取到一个SharedPreferences对象后,咱们就能够开始向其中写如用户数据了,具体步骤以下:

  • 调用edit()方法得到一个SharedPreferences.Editor对象

  • 经过putBoolean()putDouble() 方法向其中添加键-值对

  • 调用commit()进行提交

 

只需三步,咱们就成功地把用户数据存起来啦。那么当咱们想再此获取已保存的数据时,该怎么作呢?很简单:只须要获得一个SharedPreferences后调用 getBoolean(),getBoolean()等方法便可。

 

咱们来看一下来自Android Developer的示例代码:

public class Calc extends Activity {
    public static final String PREFS_NAME = "MyPrefsFile";

    @Override
    protected void onCreate(Bundle state){
       super.onCreate(state);
       . . .

       //从preferences文件中读取以前咱们保存的数据
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       boolean silent = settings.getBoolean("silentMode", false);
       setSilent(silent);
    }

    @Override
    protected void onStop(){
       super.onStop();

      // 保存用户数据
      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
      SharedPreferences.Editor editor = settings.edit();
      editor.putBoolean("silentMode", mSilentMode);

      // 提交后对用户数据的保存才生效
      editor.commit();
    }
}

 

 

2. 使用内部存储

使用这种方式会把数据存到应用私有的存储空间中,其余应用无权访问这个存储空间,而且当用户卸载你的应用时,这些数据也会被删除掉。由此咱们能够知道当咱们要保存的数据只用于本应用时,而且但愿它同本应用“同生共死”时,就可使用内部存储。

 

要建立一个应用私有文件用于数据保存也只须要三步:

  • 调用 openFileOutput()获得一个FileOutputStream(文件输出流)对象

  • 使用write()向其中写入数据

  • 调用write()关闭以前打开的文件输出流

 

示例以下:

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

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

 

上面方法中的MODE_PRIVATE 参数的意思就是这个数据文件是本应用私有的,其余应用不能够访问。

 

要从内部存储的文件中读取数据也很简单,只需三步:

  • 调用并提供给它咱们要读取的文件的名称,它会返回给咱们一个FileInputStream对象

  • 使用read()方法从中读取数据

  • 调用close()方法关闭以前打开的文件输入流

 

有些时候咱们想要存储一些临时数据在应用的私有存储空间中,这时候咱们能够经过 getCacheDir()方法获得应用用于保存临时缓存文件的内部目录。存储在这个目录下的文件有个特色:当内部存储空间不足时,系统会自动删除一些这个文件夹下的文件。固然,刚靠谱的方式是咱们本身维护这个文件夹下的文件。一样,这个文件夹下的文件在应用被卸载时候也会被删除。

关于使用内部存储更详细的介绍请参考文末”参考资料“部分给出的连接。

 

3. 使用外部存储

 

Android中的外部存储一般指SD卡,存储于外部存储的文件一般对于各个应用来讲是共享的。显然,当咱们但愿保存的数据被系统中的各个应用共享时,就能够考虑使用外部存储;另外一方面,因为手机的内部存储广泛较外部存储小,咱们也应该把一些比较大的数据文件放于外部存储中。存储于外部存储中的数据文件不会随着应用的卸载而被删除。

 

要读写外部存储中的文件,咱们首先须要在AndroidManifest.xml文件中声明以下权限:

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

 

这样既能够了吗?显然不行,咱们在使用外部存储前首先要确保用户的手机中存在可用的外部存储(万一用户的手机里压根没有SD卡呢...)。实现这个很简单,请看官方给出的示例代码:

/* 检查是否能够读写外部存储 */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* 检查是否只可以读而不能写外部存储 */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

 

对于一些公共的音乐、图片或是铃声文件,咱们能够将它们分别存储于外部存储的 Music/Pictures/,Ringtones/文件夹中。要获得表明上述公共文件夹的File对象,只需调用getExternalStoragePublicDirectory()方法,并传入一个参数指明咱们具体想访问哪一个文件夹(DIRECTORY_MUSIC,  DIRECTORY_PICTURESDIRECTORY_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;
}

 

那么当咱们仅仅是由于手机内部存储不足而把数据存于外部存储,有没有办法让这些数据是本应用私有的呢?答案是确定的。咱们只需调用getExternalFilesDir()方法来获取一个外部存储中的私有存储目录。位于这个目录中的数据文件会随着应用的卸载而被删除,毕竟它们只对该应用自己有意义。

从Android 4.4(API 19)开始,读写这个位于外部存储中的应用私有目录无需加上权限声明。因此咱们能够在AndroidManifest.xml中添加maxSdkVersion 属性来讲明这一权限只在Android 4.4以前才须要。

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

 

同内部存储同样,外部存储中也有个专门用来保存临时文件的缓存文件夹。要获取表明本应用的缓存文件夹的File对象,只需调用getExternalCacheDir()方法,当用户卸载引用时,这些文件也会被自动删除。

 

4. 使用SQLite数据库

前面咱们提到过,SQLite数据库用来存储结构化数据,所谓机构化数据就是有着固定结构的数据。好比成绩表、工资表等等就是自然的适合用数据库存储的结构化数据。

Android推荐的访问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子类的实例开始对数据库进行操做了。咱们能够分别调用 getReadableDatabase()和getWritableDatabase()方法来对数据库进行读操做和写操做。这俩方法都会返回一个 SQLiteDatabase 对象,这个对象提供了查改增删等数据库常规操做方法。

要对SQLite数据库执行查询操做,能够调用 SQLiteDatabase query() 方法。对于复杂查询操做,则使用SQLiteQueryBuilder是个更好的选择。

每一个SQLite查询操做都会返回一个指向了“符合查询条件的全部行"的Cursor对象。关于Android中使用SQLite更加详细的介绍,你们能够参考文末给出的连接。

 

5. 参考资料

  • Android Developer: https://developer.android.com/guide/topics/data/data-storage.html(墙内用户请看这里:http://hukai.me/android-training-course-in-chinese/basics/data-storage/index.html)

  • Android中SQLite的使用:http://www.cnblogs.com/Excellent/archive/2011/11/19/2254888.html

相关文章
相关标签/搜索