Android的数据存储


        android提供了五个选项,用来保存持久的应用数据。你的选择取决于你的特殊需求,比如,你是否需要这个数据为你的应用私有,或者能被其他的应用和用户访问,或者考虑到数据需要多大的存储空间。

        他们分别是:

1、Shared Preferences。以键值对的形式存储的基本数据。

2、Internal Storage。内部存储,存储私有数据到设备内存。

3、External Storage。外置存储,存储共有数据到共享的外部存储。

4、SQLite Databases。SQLite数据库,存储结构化的数据到私有的数据库。

5、网络存储。使用自己的网络服务将数据存储到网络上。

        android提供了一个内容提供者(content provider),来将你的数据(即使是私有数据)共享给其他的应用程序。内容提供者给你的应用程序公开读写访问,并会受到任何你强加的限制。

一、Shared Preferences

        SharedPrefereces类提供了一个总体框架,使你可以保存和检索你的键值对(key-value)数据。SharedPreferences可以用来保存一个最基本的数据类型,包括booleans,floats,ints,longs,和strings。这个数据会永久保留,即使你的应用被杀掉。它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息,它的存储位置是 /data/data/<package name>/shared_prefs目录下
        //TODO PreferenceActivity
        有两种方法可以创建SharedPreferences对象:
1、getSharedPreferences( )。如果你需要通过不同的名字来标记多个Preferences文件,那么你需要使用这个方法,并且这个方法的第一个入参,就表示了这个Preferences文件的名称。
2、getPreferences( )。如果你的activity只需要一个preferences文件,那么你需要使用这个方法,它只会创建一个prefrences文件,不需要给他定一个名字,他会以这个activity的名字来命名。
        SharedPreferences对象自己不能对数据本身进行存储或者修改,只能读取数据,它的存储和修改操作都是通过Editor对象实现的。
        向preferences文件写入数据:
1、调用SharedPreferences对象的edit( )方法,获取到SharedPreferences.Editor对象。
2、然后向Editor对象中放入数据,使用类似putBoolean( )和putString( )等的方法。
3、最后使用Editor的commit( )方法提交数据。最后一步做完,数据就被提交到了preferences文件中。
        读取preferences文件中的数据,需要使用到SharedPreferences对象的方法,比如putBoolean( )和putString( )等。
        下面是一个在计算机中保存静音按键模式的例子:
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();
    }
}
         getSharedPreferences(String name, int mode)第二个参数有四个选项:
1、Context.MODE_PRIVATE: 是默认操作模式,表示该SharedPreferences数据只能被本应用程序读、写。
2、Context.MODE_APPEND:会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
3、Context.MODE_WORLD_READABLE:  表示该SharedPreferences数据能被其他应用程序读,但不能写。
4、Context.MODE_WORLD_WRITEABLE:  表示该SharedPreferences数据能被其他应用程序读,

二、内部存储

        你可以直接在设备的内部存储文件。默认情况下,保存在设备内部的文件是当前应用私有的,其他的应用不能访问他们。当你删除这个应用的时候,他们会被移除。

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

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();
        操作模式同SharedPreferences的操作模式,也是那四种。

        从内部存储读取文件:

1、调用openFileInput()方法,入参只有文件名称。然后返回一个FileInputStream。

2、调用read()方法读取文件的二进制数据。

3、调用close()方法关闭流。

String fileName = "hello_file";
FileInputStream fin = openFileInput(fileName);
            int lenght = fin.available();
            byte[] buffer = new byte[lenght];
            fin.read(buffer);
fin.close();
        这里有一个小提示:如果你想在编译的时候,保存一个静态文件在你的应用下,只需要将文件放到项目的res/raw/路径下面即可。你可以通过R.raw<filename>这个资源id,调用openRawResource()方法来访问它。这个方法会返回一个InputStream对象,你可以使用这个对象来读取这个文件,但是不能通过它来写入原始文件。

        保存缓存文件

        如果你需要缓存一些数据,而不是像一贯的去存储它,你可以使用getCacheDir()来打开一个File,代表着你的应用程序应该保存的零时缓存文件的内部目录,它的目录是:/data/data/<application package>/cache

        当设备的内部存储空间很少,已经要影响设备正常运行的时候,android系统就会删除这些缓存文件来恢复存储空间。但是,你不应该依靠系统来帮你清理这些文件。你应该自己来保持缓存文件,并且保持消费的内存空间在一定的范围内,比如1M以内。当用户删除你的应用时,这些文件也一起被删除掉了。

        除了上面说到的getCacheDir()方法以外,这里还有一些其它常用的方法。

        getFilesDir():获取你的系统文件目录的绝对路径,你的内部文件都保持在这里,目录是:/data/data/<application package>/files。

      getDir():在你的内部存储空间中创建(或者打开现有的)目录。

        deleteFile():删除一个报酬在内部存储的文件。

        fileList() :返回当前你的应用保持的文件数组。

三、外置存储




        //TODO未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值