Android数据存储(2)向机身内存(Internal Storage)和SDcard(External Storage)读写数据实例 (1)
- 格式:pdf
- 大小:250.19 KB
- 文档页数:10
第4章Android中的数据存取程序是数据的输入、处理、输出的过程,不管是操作系统还是应用程序,都不可避免要用到大量的数据。
由于内存容量有限,且一旦关机,内存中的信息都消失,因此,一般把需要下次使用的数据保存在磁盘(对于手机来说SD卡)中。
操作系统一般以文件的形式来保存数据,而应用程序更喜欢使用数据库来保存。
在手机中,也有许多需要保存的数据,如音频文件、视频、图片、通讯录、短信、游戏中的设置等数据。
Android作为一种手机上的操作系统,提供了以下几种数据存取方式:Preference(配置)、File(文件)、SQLite(数据库)、网络等。
另外,在Android中,各个应用程序组件之间是相互独立的,彼此的数据一般不能共享,为了实现数据的共享,Android提供Content Provider组件来实现应用程序之间的数据共享(最典型的共享就如通讯录)。
4.1 PreferencePreference提供了一种轻量级的数据存取方法,应用场合主要是数据比较少的配置信息。
它以“键-值”(是一个Map)对的方式将数据保存在一个XML配置文件中。
4.1.1 Preference简介使用Preference方式来存取数据,要用到SharedPreferences接口和SharedPreferences的一个内部接口SharedPreferences.Editor,这两个接口在android.content包中。
调用Context.getSharedPreferences( String name, int mode)方法可得到SharedPreferences接口,该方法的第一个参数是文件名称,第二个参数是操作模式。
操作模式有三种:MODE_PRIV ATE(私有)、MODE_WORLD_READABLE (可读)和MODE_WORLD_WRITEABLE(可写)。
SharedPreferences提供了获得数据的方法,如:getString、getInt等。
DataStorage(数据存储)之内部储存(InternalStorage)Data Storage(数据存储)之内部储存(Internal Storage)读取⼿机内部储存,Activity 中调⽤ openFileOutput(file_name, mode)⽅法返回File 对象;file_name: ⽂件名mode: 操作⽂件的类型Context.MODE_PRIVATE:代表⽂件是私有的,如果重新调⽤,则原来的数据会被覆盖Context.MODE_APPEND:先判断⽂件是否存在,如果存在,则在在原来的数据后⾯追加内容 />Context.MODE_WORLD_READABLE:其他应⽤程序由权限读取Context.MODE_WORLD_WRITEABLE:其他应⽤程序由权限写⼊如果当其他程序同时具有读写功能,则应该这样写:openFileOutput(FILE_NAME, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);下⾯是个⼩Demo:public void writeFile(View view) {try {FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);fos.write(string_01.getBytes());fos.close();Toast.makeText(InternalStorageActivity.this, "Saved...", Toast.LENGTH_LONG).show();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}读取或者写⼊⽂件,默认⽬录是:/data/data/<package-name>/files/⽂件夹下我们也可以使⽤Activity 提供的getCacheDir()和getFilesDir()⽅法:获取/data/data/<package-name>/下的/cache和/files读取⽂件则调⽤openFileInput(FILE_NAME)⽅法public void readFile(View view) {try {FileInputStream fis = openFileInput(FILE_NAME);BufferedReader br = new BufferedReader(new InputStreamReader(fis));String line = null;while ((line = br.readLine()) != null) {String str = new String(line);Log.i(TAG, str);}Toast.makeText(InternalStorageActivity.this, "Read...", Toast.LENGTH_LONG).show();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}操作外部储存(内存卡)由于Android 系统内存⼤⼩的局限,⽐如我们储存⽂件就要把它放在外部存储中,在操作之前,我们要在AndroidManifest.xml 中设置读写操作:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 、、、、<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>操作外部储存(内存卡)由于Android 系统内存⼤⼩的局限,⽐如我们储存⽂件就要把它放在外部存储中,在操作之前,我们要在AndroidManifest.xml 中设置读写权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />创建和删除权限<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>Android 中的Environment 类对外部存储卡的操作,getExternalStorageState() ⽅法,判断外部储存卡的状态,如果为MEDIA_MOUNTED 则表⽰可操作getExternalStorageDirectory() ⽅法,获取外部储存的⽬录,可以对其⽬录进⾏操作/*** 读取外部储存卡* 在外部储存卡上创建⼀个demo.tet ⽂件,并写⼊字符* 为了沿着⽂件已经写⼊外部储存,所有读取创建的⽂件*/public void getExternalStorage(View view) throws IOException {// Android 中的Environment 类对外部存储卡的操作,// getExternalStorageState() ⽅法,判断外部储存卡的状态,如果为MEDIA_MOUNTED 则表⽰可操作//getExternalStorageDirectory() ⽅法,获取外部储存的⽬录,可以对其⽬录进⾏操作String state = Environment.getExternalStorageState();if (Environment.MEDIA_MOUNTED.equals(state)) {File sdcardDir = Environment.getExternalStorageDirectory();File saveFile = new File(sdcardDir, "demo.text");FileOutputStream fos = new FileOutputStream(saveFile);fos.write("text".getBytes());fos.close();Toast.makeText(InternalStorageActivity.this, "getExternalStorage", Toast.LENGTH_LONG).show();File[] fileDir = sdcardDir.listFiles();for (File file : fileDir) {String fileName = file.toString();Log.i(TAG, "FileName: " + fileName);}FileInputStream fis = new FileInputStream(saveFile);byte[] buffer = new byte[1024];int len = 0;String value = null;while ((len = fis.read(buffer)) != -1) {value = new String(buffer, 0, len);}fis.close();Log.i(TAG, "getValue = " + value);}}。
Android提供几种保存持久化应用程序数据的选择。
依赖具体的需求来选择解决适合的方案,如数据应该是应用程序私有的还是共享的,以及数据所需要的存储空间等。
以下是可选择的数据存储方案:共享偏好(Shared Preferences)用键---值对的形式保存私有的原始数据。
内部存储(Internal Storage)在设备的内存上保存私有的数据。
外部存储(External Storage)在共享的外部存储器上保存公共的数据。
SQLite数据库在私有的数据库中保存结构化的数据。
网络连接(Network Connection)把数据保存在自己的互联网服务器上。
Android提供了内容提供器(content provider),能够你的私有数据公开给其他应用程序。
内容提供器是一种公开应用程序数据的读写访问权限的可选组件,这种读写访问会受到你所施加的任何限制的影响。
使用共享偏好SharedPreference类提供了一个一般性的框架,它允许用原始类型数据的键---值对的形式来保存和获取持久化的数据。
使用SharedPreference能够保存任意类型的原始类型数据:布尔型、浮点型、整数型、以及字符串。
这种数据会跨越用户的会话周期被持久化保存(即使是应用程序进程被杀死)。
有两种方法来为应用程序获取SharedPreferences对象:1.getSharedPreferences()方法---如果需要多个用名称来标识的偏好文件,就要使用这个方法,它的第一个参数要指定偏好文件的名称。
2.getPreferences()方法---如果仅需要针对Activity的一个偏好文件,就使用这个方法。
因为这个方法仅返回当前Activity的偏好文件,不需要提供偏好文件的名称。
以下是向偏好文件中写入数据的方法:1.调用edit()方法来获取一个SharedPreferences.Editor对象;2.调用诸如putBoolean()和putString()等方法来添加要保存的值;3.调用commit()方法来提交要保存的新值。
Android内部存储外部存储及读写权限在我们使用 Android 设备的过程中,经常会涉及到数据的存储和读写操作。
了解 Android 的内部存储、外部存储以及相应的读写权限对于开发者和普通用户来说都非常重要。
首先,我们来谈谈 Android 的内部存储。
内部存储是指设备内部为应用程序分配的一块私有存储空间。
这个空间对于每个应用来说是相对独立和安全的,其他应用无法直接访问。
内部存储的优点在于其数据的保密性和安全性较高。
应用在内部存储中保存的数据,除非用户明确授予权限或者应用本身存在漏洞,否则其他应用无法获取。
这使得一些敏感信息,比如用户的登录凭证、个人设置等,可以安全地存放在内部存储中。
然而,内部存储也有其局限性。
由于它的空间相对较小,对于一些需要大量存储数据的应用,比如视频播放软件、大型游戏等,可能会很快耗尽内部存储的空间。
接下来,我们再看看 Android 的外部存储。
外部存储通常指的是我们常见的 SD 卡或者设备内置的可扩展存储空间。
与内部存储不同,外部存储是可以被多个应用共享访问的。
外部存储的优势在于其存储空间通常较大,可以满足应用存储大量数据的需求,比如照片、视频、音乐等文件。
但这也带来了一些潜在的问题。
由于多个应用可以访问外部存储,数据的安全性和一致性可能会受到一定影响。
在 Android 系统中,对于应用访问内部存储和外部存储,都有相应的读写权限控制。
这些权限的设置旨在保护用户的隐私和数据安全。
对于内部存储的读写权限,应用在默认情况下就具有读写自己内部存储空间的权限。
但如果应用想要访问其他应用的内部存储数据,这是被严格禁止的,除非通过特殊的系统机制或者用户明确授权。
而对于外部存储的读写权限,情况则相对复杂一些。
在 Android 60(API 级别 23)及更高版本中,应用在运行时需要动态申请读写外部存储的权限。
这意味着应用不能在安装时默认获得这些权限,而是在需要进行相关操作时向用户请求授权。
Android应用开发入门数据存储方式Android应用程序开发是现代软件开发领域中的重要一环。
对于一个功能完备的Android应用而言,数据的存储是至关重要的。
本文将介绍Android应用开发中的数据存储方式,并探讨其各自的优缺点。
1. Shared Preferences(共享首选项)Shared Preferences是Android中最简单的数据存储方式之一。
它基于键值对的形式存储数据,并将数据存储在应用包的私有目录中。
Shared Preferences适用于存储少量简单的配置数据,如用户偏好设置或应用程序的状态信息。
Shared Preferences的优点在于它的易用性和速度。
由于数据存储在本地文件中,读写速度非常快。
同时,Shared Preferences支持多种数据类型,包括布尔型、整型、浮点型、字符串型等。
然而,Shared Preferences的局限性也不容忽视。
它适用于存储少量简单的数据,如果数据量大或者复杂,Shared Preferences可能不够灵活。
此外,由于数据存储在私有目录中,不适合用于存储敏感数据。
2. Internal Storage(内部存储)Internal Storage是Android应用程序的内部存储空间,可以用于存储私有文件或数据库。
通过Internal Storage存储的数据仅对应用程序本身可见。
这种数据存储方式适用于需要保存大量数据或者需要保护数据安全性的场景。
使用Internal Storage存储数据的过程很简单,只需调用相应的API即可。
可以使用FileOutputStream和FileInputStream来读写文件,也可以使用SQLite数据库进行数据存储。
SQLite是Android内置的轻量级关系型数据库,对于结构化的数据存储非常方便。
Internal Storage的优点包括数据隔离性、数据安全性和高速读写能力。
然而,与Shared Preferences相比,使用Internal Storage需要处理文件和数据的读写操作,并需要关注内存空间的管理,因此稍显复杂。
android面试基础知识1. 什么是Android?Android是一个基于Linux平台、由Google开发的移动操作系统,主要面向手机、平板电脑等移动设备。
它拥有开放的应用程序开发平台,对第三方开发者非常友好,有丰富的应用程序、游戏等。
2. Android应用程序的基本组成部分是什么?Android应用程序的基本组成部分有四个:活动(Activity)、服务(Service)、内容提供者(Content Provider)和广播接收器(Broadcast Receiver)。
3. 什么是活动(Activity)?活动是Android中最基本的应用程序单元,每个活动就是一个界面。
用户通过这个界面和应用程序进行交互。
活动可以包含一个用户界面,主要用于展示应用程序的功能和数据。
4. 什么是服务(Service)?服务是后台运行的应用程序组件,没有任何用户界面,主要用于在后台执行长时间运行的任务,如下载数据、播放音乐等。
5. 什么是内容提供者(Content Provider)?内容提供者是Android中用于管理应用程序私有数据或者共享数据的组件,可以让其他应用程序通过Content Resolver来访问和修改数据,实现数据共享的目的。
6. 什么是广播接收器(Broadcast Receiver)?广播接收器是Android中的一种机制,用于在不同的应用程序之间传递消息或事件。
广播接收器可以监听特定的广播事件,并在广播事件发生时做出响应。
7. 什么是Intent(意图)?Intent是Android中非常重要的一种消息传递机制,可以用来指明某个应用程序需要执行什么操作,或者要启动哪个组件。
具体来说,Intent表示应用程序的意图,用于描述想要完成的操作或者打开哪个界面。
8. Android中四种存储方式?Android中四种存储方式包括:1)Shared Preferences:用于存储少量的键值对数据,常用于存储应用程序的配置信息等;2)Internal Storage:用于存储应用程序的私有数据,只能被应用程序本身访问,不需要权限;3)External Storage:用于存储应用程序的公共数据,可被其他应用程序访问,需要特定权限(如写SD卡的权限);4)SQLite数据库:用于存储应用程序的大数据量,可进行高效的数据查询和管理。
1. 常用的数据持久化(长久保存数据)方式有哪些?答:1、SharedPreference,共享参数形式,一种以Key-Value的键值对形式保存数据的方式,Android内置的,一般应用的配置信息,推荐使用此种方式保存,不能存文件也不适合。
其存储的位置在/data/data/packageName/shared_prefs文件夹下面。
2、Internal Storage:把数据存储到手机内部的存储空间,主要用来保存私有数据/data/data/packageName/files文件夹下面3、External Storage:把数据存储到手机的外部存储SD卡中,主要用来保存非私有和大型数据,它有应用程序专用的文件夹,也有所有程序公用的文件夹(这个文件夹不会随着应用程序的卸载而卸载),需要赋予应用程序访问Sdcard的权限,Android的权限控制尤为重点,在Android程序中,如果需要做一些越界的操作,均需要对其进行授权才可以访问。
在AndroidManifest.xml中添加代码:<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>4、SQLite Databases:以表格形式存储信息的一个轻量级的小型数据库5、Network Connection:将数据存储到网络服务器上6、ContentProvider:他提供一种方式实现两个不同应用程序之间的通讯2. ShareedPrefrence的读写数据的基本方法?答:它保存的数据主要是简单类型的Key-value对。
并且Value部分只能是一些基本数据类型:boolean、float、int、long、String等。
1、得到SharedPreference对象的方法有:a、Context类中的getSharedPreference(String name,int mode)方法,name :存储的文件名,如果不存在会自动创建一个mode:访问模式,一般有两个参数MODE_PRIVTE(私有,只有当前应用程序才能进行读写)和MODE_MULTI_PROCESS(多个进程对同一个文件进行读写)b、Activity类中的getSharedPreference(int mode)方法,自动将当前活动的类名作为文件名c、PreferenceManager类的getDefaultSharedPreferences(Context context)方法,这是一个静态方法,接收Context参数,会自动将应用程序的包名作为前缀去命名文件2、读常用方法:a、boolean contains(String Key):判断SharedPreferences是否包含特定Key的数据b、abstract Map<String,?> getAll():获取SharedPreferences数据里全部的Key-Value对。
彻底搞懂Android⽂件存储---内部存储,外部存储以及各种存储
路径解惑
疑问3、什么是APP专属⽂件?
上⾯疑问2我们提到了专属⽂件,所谓专属⽂件就是它是属于某个具体的应⽤的,他的⽂件路径都带有相应的包名,当APP卸载时,它们会随应⽤⼀起删除,当我们在设置⾥⾯⼿动清除某个应⽤数据时(不是清除缓存),它们也会⼀起被清掉。
Android使⽤这种专属⽂件的⽬的就是为了⽅便⽂件管理,避免⽂件随意存储,显得很乱,另⼀个⽬的就是为了当应⽤被卸载时不会留下很多垃圾⽂件。
疑问4、既然内部存储与外部存储都有APP专属⽂件,那么我们该使⽤哪个呢?
内部存储与外部存储都有APP专属⽂件,我们该⽤哪个呢,很显然应该⽤外部存储的,因为内部存储本⾝就⽐较⼩,⽽且已经存储了⼀些系统的⽂件,因此内部存储我们尽量不要去使⽤。
但是当⼿机没有外部存储时,我们还是得使⽤内部存储,⼀般程序员会做判断是否有外部存储,没有再使⽤内部存储,。