Android数据存取
阅读原文时间:2023年07月08日阅读:3

Android数据存取

SharedPreferences是使用键值对的方式来存储数据的,也就是在保存一条数据时,需要给这条数据提供一个对应的键,这样在读取的时候就可以通过这个键把相应的值取出来.

1、获取SharedPreferences

SharePreferences是一个接口,不能直接使用,但可以通过以下两种方法获得:

(1)Context类的getSharePreferences(String name ,ine mode)方法来获得一个SharePreferences对象

         此方法接收两个参数,第一个参数用于指定SharedPreference文件的名称,即存储XML文件的名称,如果存在,则会直接引用,如果指定的文件不存在则会创建一个,SharedPreference文件都是存放在 /data/data/<包名>/shared_prefs/存储的XML文件 目录下,第二个参数表示文件的存储模式(该方式创建的XML文件可以被同一个软件的Activity引用)。

文件的几种存储模式:

MODE_PRIVATE:只能被创建这个文件的当前应用访问;若文件不存在会创建文件;若创建的文件已存在则会覆盖掉原来的文件.

MODE_APPEND:只能被创建这个文件的当前应用访问;若文件不存在会创建文件;若文件存在则在文件的末尾进行追加内容.

MODE_WORLD_READABLE:创建出来的文件可以被其他应用所读取,但是不可以写入。

MODE_WORLD_WEITABLE:允许其他应用对其进行写入,也可以读取

MODE_MULTI_PROCESS:表示改文件可以被多个进程同时访问,适用于Android2.3及之后的版本。

(2)调用Activity对象的getPreferences(int mode)方法

         该方法有一个参数,表示文件的存储模式,具体模式童第轶中相同,这种方法获得的对象只能被该方法所在的Activity所调用.

SharePreferences要创建一个SharePreferences.Editor类的对象,该类负责具体的写入操作,创建方法使通过SharePreferences类的edit()方法来创建.常用方法:

putBoolean(String key,boolean value)

putString(String key,String value)

putInt(String key,int value)

putFloat(String key,float value)

putLong(String key,long value)

commit();//在执行完各种写入、删除、修改的操作后,通过此方法来正式提交数据,确认存储文件的数据变化

clear();//清除键值对的方法

remove(String key);//删除官集资所对应的值

getAll();//读取存储文件中的所有数据,返回一个Map类型的值,来存放所有的键值对

getBoolean(String key,boolean defValue)

getString(String key,String defValue)
getInt(String key,String defValue)
getFloat(String key,String defValue)
getLong(String key,String defValue)

contains(String key)

registerSharedPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener);//注册监听器,来监听SharePreferences的更改事件,在onCreate()方法中设置

unregisterSharedPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener);//注销监听器,不再监听SharePreferences的更改事件。

2、SharedPreferences存储数据

得到SharedPreference对象之后,就可以开始向SharedPreference文件中存储数据了,主要有三步:

  • a.使用SharedPreference对象的edit()方法来获取一个SharedPreference.Editor对象
  • b.向SharedPreference.Editor对象中添加数据,比如添加一个布尔型数据就是用putBoolean方法,添加一个字符串就是用putString()方法,以此类推
  • c.调用commit()方法将添加的数据提交,从而完成数据存储操作

如:

private SharePreferences sp;

//创建一个SharePreferences接口的实例对象,将生成一个XML名称为demo_01,模式为MODE_PRIVATE
sp=this.getSharedPreferences("demo_01",MODE_PRIVATE);

//通过edit()方法创建一个SharePreferences.Editor类的实例对象
SharePreferences.Editor editor =sp.edit();
//通过putString()方法,将数据存入文件中
editor.putString("name","sssss");

//用commit()方法予以正式提交
editor.commit();

打开文件,可看到如下代码:

<map>
    <string name="name">sssss</string>
</map>


删除数据:
editor.clear();//清除数据

查询数据:
String name = editor.getString("name","lisi");

3、从SharedPreferences中读取数据

SharedPreferences对象中提供了一系列的get方法用于读取数据,每种get对应了一种put方法.

get方法接收两个参数,第一个是键,第二个参数是默认值,即当传入的键找不到对应的值时,会以什么样的默认值进行返回.

二、LruCache存取数据

LruCache是android提供的一个缓存工具类,其算法是最近最少使用算法。它把最近使用的对象用“强引用”存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值达到预设定值之前就从内存中移除。其在API12被引进,低版本可以用support包中的类。

android中的内存:保存在内存中的程序和文件是相互关联的,什么意思呢?举个例子,假设你android手机内存中有一个程序叫bb,然后由bb程序创建了一份名叫cc的文件,当你删除bb的时候cc也会应为关联而被删除。像是Shared Preferences或SQLite的内容就是保存到内存储中的,这些保存的内容会随程序的删除而删除用过的同学因该很快能理解。

      android中的外存:我们平常在android手机使用的最多的就是外部存储,像是你用相机拍了一张照片,这些一般都是保存到外存中的,这些文件不会因为你删除了程序而不见。

      随着android版本的增加一般所谓的sd卡(外存储卡)都变成内置的了。

获取SD卡根目录的方法:

//为真则SD卡已装入
sdCardExist=Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if(sdCardExist){
    sdDir = Environment.getExternalStorageDirectory();//获取跟目录
    //查找SD卡根路径
    sdDir.toString();
    Log.e("main","得到的根目录路径:"+sdDir);
}

另外一个更灵活的获取外部路径的方法:

File directory_doc = Environment.getExternalStoragePublicDirectory(Environment. DIRECTORY_DOCUMENTS);
//使用这个方法需要传入公共目录的类型如Environment.DIRECTORY_DOCUMENTS
//查看公共目录文档文件的路径
Log.e("main","得到的公共目录:"+directory_doc);

获取路径的其他方法:

DIRECTORY_DOCUMENTS
标准文件目录,可以是用户自定义创建的。Standard directory in which to place documents that have been created by the user.

DIRECTORY_DOWNLOADS
下载目录. Standard directory in which to place files that have been downloaded by the user.

DIRECTORY_MOVIES
影视目录.Standard directory in which to place movies that are available to the user.

DIRECTORY_MUSIC
音乐目录.Standard directory in which to place any audio files that should be in the regular list of music for the user.

DIRECTORY_PICTURES
用户可以获得的图片目录.Standard directory in which to place pictures that are available to the user.

更多内容:https://developer.android.com/reference/android/os/Environment

当你有多个外部存储卡:

File[] files;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
    for(File file:files){
        Log.e("main", "得到的全部外存:" +String.valueOf(file));
        //便历所有外部存储
    }
}

得到内存:

File internal=getFilesDir();
Log.e("main","内存路径:"+internal);

参考博客:

【1】数据存储SharePreferences详解

【2】Android缓存LruCache详解

【3】Android获取SD卡路径/内存的几种方法