当前位置:首页 » 服务存储 » 安卓5大存储数据方式
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

安卓5大存储数据方式

发布时间: 2022-04-26 17:37:03

① android程序的菜单文件在哪个文件夹下采用什么格式保存

Android应用开发中,给我们提供了5种数据的存储方式
1 使用SharedPreferences存储数据
2 文件存储数据
3 sqlite数据库存储数据
4 使用ContentProvider存储数据
5 网络存储数据
不同的业务逻辑,或者需求,用不同的实现方式
以下是这几中数据存储方式的说明用及法,
第一种: 使用SharedPreferences存储数据
SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,
一般在Activity中 重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,
它提供了Android平台常规的Long长 整形、Int整形、String字符串型的保存。

它是什么样的处理方式呢? SharedPreferences类似过去Windows系统上的ini配置文件,但是它分为多种权限,
可以全局共享访问,android123提示最终是以xml方式来保存,整体效率来看不是特别的高,
对于常规的轻量级而言比SQLite要好不少,如果真的存储量不大可以考虑自己定义文件格式。
xml 处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。

它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。
其存储位置在/data/data/< >/shared_prefs目录下。
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。

实现SharedPreferences存储的步骤如下:
一、根据Context获取SharedPreferences对象
二、利用edit()方法获取Editor对象。
三、通过Editor对象存储key-value键值对数据。
四、通过commit()方法提交数据。

下面是示例代码:

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//获取SharedPreferences对象
Context ctx = MainActivity.this;
SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
//存入数据
Editor editor = sp.edit();
editor.putString("STRING_KEY", "string");
editor.putInt("INT_KEY", 0);
editor.putBoolean("BOOLEAN_KEY", true);
editor.commit();

//返回STRING_KEY的值
Log.d("SP", sp.getString("STRING_KEY", "none"));
//如果NOT_EXIST不存在,则返回值为"none"
Log.d("SP", sp.getString("NOT_EXIST", "none"));
}
}

这段代码执行过后,即在/data/data/com.test/shared_prefs目录下生成了一个SP.xml文件,一个应用可以创建多个这样的xml文件。
SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。
但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。
所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。

② 请问android最安全的数据存储方式是什么

android存储有很多种方式的,比如你用的这种sharedpreferences,还有sqlite,sdcard,还有就是云端了,其实没有什么安全不安全,一般的重要数据会进行加密的,加密方式有很多种,比如MD5,base64,AES等,很多,一般加密就不容易破解了。普通的数据无所谓加密不加密。

③ 简述android平台提供了哪些数据存储方法

数据存储在开发中是使用最频繁的,Android平台主要有5种实现数据存储的方式。
第1种: 使用SharedPreferences存储数据
SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长 整形、Int整形、String字符串型的保存。
它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。
其存储位置在/data/data/<包名>/shared_prefs目录下。
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。
实现SharedPreferences存储的步骤如下:
一、根据Context获取SharedPreferences对象
二、利用edit()方法获取Editor对象。
三、通过Editor对象存储key-value键值对数据。
四、通过commit()方法提交数据。
SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。
第2种: 内部文件存储数据
关于文件存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。
文件可用来存放大量数据,如文本、图片、音频等。
默认位置:/data/data/<包>/files/***.***。
openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。
创建的文件保存在/data/data//files目录,如: /data/data/cn.itcast.action/files/itcast.txt ,通过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File Explorer视图,然后在File Explorer视图中展开/data/data//files目录就可以看到该文件。
openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入: openFileOutput(“itcast.txt”, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data//files),其他程序无法访问。
除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。 对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
Activity还提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用于获取/data/data//cache目录 getFilesDir()方法用于获取/data/data//files目录。
第3种: 外部文件存储数据
把文件存入SDCard:
使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。对于像视频这样的大文件,我们可以把它存放在SDCard。
SDCard是干什么的?你可以把它看作是移动硬盘或U盘。 在模拟器中使用SDCard,你需要先创建一张SDCard卡(当然不是真的SDCard,只是镜像文件)。
创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下: 在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀可以随便取,建议使用.img: mksdcard 2048M D:\AndroidTool\sdcard.img 在程序中访问SDCard,你需要申请访问SDCard的权限。
在AndroidManifest.xml中加入访问SDCard的权限如下:
要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。
注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限。
Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用于获取SDCard的目录,当然要获取SDCard的目录,你也可以这样写:
第4种: SQLite数据库存储数据
SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite.SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。
特点:
面向资源有限的设备,
没有服务器进程,
所有数据存放在同一文件中跨平台,
可自由复制。
SQLite 基本上符合 SQL-92 标准,和其他的主要 SQL 数据库没什么区别。它的优点就是高效,Android 运行时环境包含了完整的 SQLite。
SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite 称这为“弱类型”(manifest typing.)。 此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。 除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。
Android 集成了 SQLite 数据库 Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。
对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQLite 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些 API。
数据库存储在 data/< 项目文件夹 >/databases/ 下。 Android 开发中使用 SQLite 数据库 Activites 可以通过 Content Provider 或者 Service 访问一个数据库。
创建数据库 Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。
Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。
SQLiteOpenHelper 的子类,至少需要实现三个方法:
1 构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。
2 onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。
3 onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。
接下来讨论具体如何创建表、插入数据、删除表等等。调用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQLiteDatabase 实例,具体调用那个方法,取决于你是否需要改变数据库的内容:
update()方法有四个参数,分别是表名,表示列名和值的 ContentValues 对象,可选的 WHERE 条件和可选的填充 WHERE 语句的字符串,这些字符串会替换 WHERE 条件中的“?”标记。
update() 根据条件,更新指定列的值,所以用 execSQL() 方法可以达到同样的目的。 WHERE 条件和其参数和用过的其他 SQL APIs 类似。
delete() 方法的使用和 update() 类似,使用表名,可选的 WHERE 条件和相应的填充 WHERE 条件的字符串。 查询数据库 类似 INSERT, UPDATE, DELETE,有两种方法使用 SELECT 从 SQLite 数据库检索数据。
1 .使用 rawQuery() 直接调用 SELECT 语句; 使用 query() 方法构建一个查询。
Raw Queries 正如 API 名字,rawQuery() 是最简单的解决方法。通过这个方法你就可以调用 SQL SELECT 语句。
例如: Cursor c=db.rawQuery( “SELECT name FROM sqlite_master WHERE type=’table’ AND name=’mytable’”, null);
在上面例子中,我们查询 SQLite 系统表(sqlite_master)检查 table 表是否存在。返回值是一个 cursor 对象,这个对象的方法可以迭代查询结果。 如果查询是动态的,使用这个方法就会非常复杂。
例如,当你需要查询的列在程序编译的时候不能确定,这时候使用 query() 方法会方便很多。
Regular Queries query() 方法用 SELECT 语句段构建查询。SELECT 语句内容作为 query() 方法的参数,比如:要查询的表名,要获取的字段名,WHERE 条件,包含可选的位置参数,去替代 WHERE 条件中位置参数的值,GROUP BY 条件,HAVING 条件。 除了表名,其他参数可以是 null。所以,以前的代码段可以可写成:
String[] columns={“ID”, ”inventory”};
Java代码
String[] parms={"snicklefritz"}; Cursor result=db.query("widgets", columns, "name=?",parms, null, null, null);
使用游标
不管你如何执行查询,都会返回一个 Cursor,这是 Android 的 SQLite 数据库游标,
使用游标,你可以:
通过使用 getCount() 方法得到结果集中有多少记录;
通过 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍历所有记录;
通过 getColumnNames() 得到字段名;
通过 getColumnIndex() 转换成字段号;
通过 getString(),getInt() 等方法得到给定字段当前记录的值;
通过 requery() 方法重新执行查询得到游标;
通过 close() 方法释放游标资源;
在 Android 中使用 SQLite 数据库管理工具 在其他数据库上作开发,一般都使用工具来检查和处理数据库的内容,而不是仅仅使用数据库的 API。
使用 Android 模拟器,有两种可供选择的方法来管理数据库。
首先,模拟器绑定了 sqlite3 控制台程序,可以使用 adb shell 命令来调用他。只要你进入了模拟器的 shell,在数据库的路径执行 sqlite3 命令就可以了。
数据库文件一般存放在: /data/data/your.app.package/databases/your-db-name 如果你喜欢使用更友好的工具,你可以把数据库拷贝到你的开发机上,使用 SQLite-aware 客户端来操作它。这样的话,你在一个数据库的拷贝上操作,如果你想要你的修改能反映到设备上,你需要把数据库备份回去。
把数据库从设备上考出来,你可以使用 adb pull 命令(或者在 IDE 上做相应操作)。
存储一个修改过的数据库到设备上,使用 adb push 命令。 一个最方便的 SQLite 客户端是 FireFox SQLite Manager 扩展,它可以跨所有平台使用。
如果你想要开发 Android 应用程序,一定需要在 Android 上存储数据,使用 SQLite 数据库是一种非常好的选择。
第五种: 网络存储数据
前面介绍的几种存储都是将数据存储在本地设备上,除此之外,还有一种存储(获取)数据的方式,通过网络来实现数据的存储和获取。

我们可以调用WebService返回的数据或是解析HTTP协议实现网络数据交互。

④ Android本地存储的几种方式

Android 提供了5种方式存储数据: --使用SharedPreferences存储数据; --文件存储数据; --SQLite数据库存储数据; --使用ContentProvider存储数据; --网络存储数据; 先说下,Preference,File, DataBase这三种方式分别对应的目录是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。 在Android中通常使用File存储方式是用 Context.openFileOutput(String fileName, int mode)和Context.openFileInput(String fileName)。 Context.openFileOutput(String fileName, int mode)生成的文件自动存储在/data/data/Package Name/files目录下,其全路径是/data/data/Pac

⑤ 安卓需要存一些参数信息、测量数据和计算结果,File和SQlite哪个好

使用SQLite方式存储数据

在Android中一共提供了5种数据存储方式,分别为:

(1)Files:通过FileInputStream和FileOutputStream对文件进行操作。具体使用方法可以参阅博文《Android学习笔记34:使用文件存储数据》。

(2)Shared Preferences:常用来存储键值对形式的数据,对系统配置信息进行保存。具体使用方法可以参阅博文《Android学习笔记35:使用Shared Preferences方式存储数据》。

(3)Content Providers:数据共享,用于应用程序之间数据的访问。

(4)SQLite:Android自带的轻量级关系型数据库,支持SQL语言,用来存储大量的数据,并且能够对数据进行使用、更新、维护等操作。

(5)Network:通过网络来存储和获取数据。

本篇博文介绍第四种方式,通过Android自带的SQLite数据库存储数据。

1.SQLite简介

SQLite是一款开源的、嵌入式关系型数据库,第一个版本Alpha发布于2000年。SQLite在便携性、易用性、紧凑性、高效性和可靠性方面有着突出的表现。

SQLite和C/S模式的数据库软件不同,它是一款嵌入式数据库,没有独立运行的进程,与所服务的应用程序在应用程序进程空间内共生共存。它的代码与应用程序代码也是在一起的,或者说嵌入其中,作为托管它的程序的一部分。因此不存在数据库的客户端和服务器,使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。

数据库服务器在程序中的好处是不需要网络配置或管理。将数据库客户端与服务器运行在同一个进程中,可以省去不少的操作及麻烦:不用担心防火墙或者地址解析;不用浪费时间管理复杂的授权和权限;可以减少网络调用相关的消耗;可以简化数据库管理并使程序更容易部署。

SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但是只有一个可以写入数据。在某个进程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读写操作将不会再发生。

此外,SQLite数据库中的所有信息(比如表、视图、触发器等)都包含在一个文件内,方便管理和维护。SQLite数据库还支持大部分操作系统,除电脑上使用的操作系统之外,很多手机上使用的操作系统同样可以运行。同时,SQLite数据库还提供了多语言的编程接口,供开发者使用。

2.SQL基本命令

SQL是与关系型数据库通信的唯一方式。它专注于信息处理,是为构建、读取、写入、排序、过滤、映射、分组、聚集和通常的管理信息而设计的声明式语言。

在讲解SQL基本命令之前,有必要先了解一下SQLite所支持的数据类型都有哪些。

2.1 SQLite支持的数据类型

SQLite采用动态数据存储类型,会根据存入的值自动进行判断。SQLite支持以下5种数据类型:

(1)NULL:空值

(2)INTEGER:带符号的整型

(3)REAL:浮点型

(4)TEXT:字符串文本

(5)BLOB:二进制对象

2.2 SQL基本命令

表是探索SQLite中SQL的起点,也是关系型数据库中信息的标准单位,所有的操作都是以表为中心的。那么如何使用SQL命令创建一张表呢?

2.2.1创建表

表是由行和列组成的,列称为字段,行称为记录。

使用CREATE命令可以创建表,CREATE命令的一般格式为:

CREATE [TEMP/TEMPORARY] TABLE table_name (column_definitions [, constraints]);

其中,[]中的内容是可选的,用TEMP或TEMPORARY关键字声明的表是临时表,这种表只存活于当前会话,一旦连接断开,就会被自动销毁。如果没有明确指出创建的表是临时表,则创建的是基本表,将会在数据库中持久存在,这也是数据库中最常见的表。

CREATE TABLE命令至少需要一个表名和一个字段名,上述命令中的table_name表示表名,表名必须与其他标识符不同。column_definitions由用逗号分隔的字段列表组成,每个字段定义包括一个名称、一个域(类型)和一个逗号分隔的字段约束。其中,域是指存储在该列的信息的类型,约束用来控制什么样的值可以存储在表中或特定的字段中。

一条创建表的命令示例如下:

1 CREATE TABLE tab_student (studentId INTEGER PRIMARY KEY AUTOINCREMENT,
2 studentName VARCHAR(20),
3 studentAge INTEGER);

如上,我们创建了一个名为tab_student的表,该表包含3个字段:studentId、 studentName和studentAge,其数据类型分别为:INTEGER、VARCHAR和INTEGER。

此外,通过使用关键字PRIMARY KEY,我们指定了字段studentId所在的列是主键。主键确保了每一行记录在某种方式上与表中的其他行记录是不同的(唯一的),进而确保了表中的所有字段都是可寻址的。

SQLite为主键提供自增长功能,当定义字段类型为INTEGER PRIMARY KEY时,SQLite将为该字段创建默认值,该默认值确保整数值是唯一的。SQLite使用64-bit单符号整数主键,因此,该字段的最大值是9,223,372,036,854,775,807。当达到最大值时,SQLite会自动搜索该字段还未使用的值,并作为要插入的值。从表中删除记录时,rowid可能被回收并在后面的插入中使用。因此,新创建的rowid不一定是按照严格顺序增长的。如果想要SQLite使用唯一的自动主键值,而不是填补空白,可以在主键定义INTEGER PRIMARY KEY中加入关键字AUTOINCREMENT。AUTOINCREMENT关键字阻止rowid回收,它将为新插入的记录产生新的(不是回收的)rowid。

2.2.2插入记录

使用INSERT命令可以一次插入一条记录,INSERT命令的一般格式为:

INSERT INTO tab_name (column_list) VALUES (value_list);

其中,tab_name指明将数据插入到哪个表中,column_list是用逗号分隔的字段名称,这些字段必须是表中存在的,value_list是用逗号分隔的值列表,这些值是与column_list中的字段一一对应的。

比如,向刚才创建的tab_student表中插入一条记录,便可以使用如下的语句完成:

INSERT INTO tab_student (studentId, studentName, studentAge) VALUES (1, “jack”, 23);

通过以上的语句,便插入了一条studentName=”jack”, studentAge=”23”的记录,该记录的主键为studentId=1。

2.2.3更新记录

使用UPDATE命令可以更新表中的记录,该命令可以修改一个表中一行或者多行中的一个或多个字段。UPDATE命令的一般格式为:

UPDATE tab_name SET update_list WHERE predicate;

其中,update_list是一个或多个字段赋值的列表,字段赋值的格式为column_name=value。WHERE子句使用断言识别要修改的行,然后将更新列应用到这些行。

比如,要更新刚才插入到tab_student表中的记录,便可以使用如下的语句完成:

UPDATE tab_student SET studentName=”tom”, studentAge=”25” WHERE studentId=1;

通过以上的语句,便可以将刚才插入的主键为studentId=1的记录更新为studentName=”tom”, studentAge=”25”了。

2.2.4删除记录

使用DELETE命令可以删除表中的记录,DELETE命令的一般格式为:

DELETE FROM table_name WHERE predicate;

其中,table_name指明所要删除的记录位于哪个表中。和UPDATE命令一样,WHERE子句使用断言识别要删除的行。

比如,要删除刚才插入的记录,便可以使用如下的语句完成:


DELETE FROM tab_student WHERE studentId=1;

2.2.5查询记录

SELECT命令是查询数据库的唯一命令。SELECT命令也是SQL命令中最大、最复杂的命令。

SELECT命令的通用形式如下:

SELECT [distinct] heading

FROM tables

WHERE predicate

GROUP BY columns

HAVING predicate

ORDER BY columns

LIMIT count,offset;

其中,每个关键字(如FROM、WHERE、HAVING等)都是一个单独的子句,每个子句由关键字和跟随的参数构成。GROUP BY和HAVING一起工作可以对GROUP BY进行约束。ORDER BY使记录集在返回之前按一个或多个字段的值进行排序,可以指定排序方式为ASC(默认的升序)或DESC(降序)。此外,还可以使用LIMIT限定结果集的大小和范围,count指定返回记录的最大数量,offset指定偏移的记录数。

在上述的SELECT命令通用形式中,除了SELECT之外,所有的子句都是可选的。目前最常用的SELECT命令由三个子句组成:SELECT、FROM、WHERE,其基本语法形式如下:

SELECT heading FROM tables WHERE predicate;

比如,要查询刚才插入的记录,便可以使用如下的语句完成:


SELECT studentId, studentName, studentAge FROM tab_student WHERE studentId=1;

至此,我们介绍了SQL中最基本和最常用的CREATE、INSERT、UPDATE、DELETE和SELECT命令。当然了,这里只是对其进行了简单的介绍,有关SQLite中SQL命令的详细使用方法,可以参阅《SQLite权威指南》一书的第三章和第四章。

3.数据库操作辅助类SQLiteOpenHelper

Android提供了一个重要的类SQLiteOpenHelper,用于辅助用户对SQLite数据库进行操作。

SQLiteOpenHelper的构造函数原型如下:

public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version);

其中,参数context表示应用程序运行的环境,包含应用程序所需的共享资源。参数name表示Android的数据库名字。参数factory是SQLiteDatabase.CursorFactory类对象,用于存储查询Android SQLite数据库的结果集。参数version表示应用程序所用的数据库的版本,该版本并非SQLite的真正版本,而是指定应用程序中的SQLite数据库的版本,当该版本号发生变化时,将会触发SQLiteOpenHelper类中的onUpgrade()或onDowngrade()方法。

SQLiteOpenHelper类的所有方法如图1所示。

图1 SQLiteOpenHelper类的方法

其中,close()方法用于关闭SQLiteOpenHelper对象中的SQLite数据库;getReadableDatabase()方法和getWriteableDatabase()方法类似,getReadableDatabase()方法以只读状态打开SQLiteOpenHelper对象中指定的SQLite数据库,任何想要修改数据库的操作都是不允许的;getWriteableDatabase()方法也是打开数据库,但是允许数据库正常的读/写操作;在一个不存在的数据库上调用任何方法时,都会隐式的调用SQLiteOpenHelper对象的onCreate()方法;当应用程序第一次访问数据库时,则会调用onOpen()方法,但是,如果版本号发生了变化的话,则会调用onUpgrade()或onDowngrade()方法。

4.数据库类SQLiteDatabase

SQLiteDatabase类用来完成对数据库的操作任务,比如表的选择、插入、更新和删除语句等。

SQLiteDatabase类中常用的用于执行SQL语句的方法有以下一些。

(1)execSQL()方法:

public void execSQL (String sql);

public void execSQL (String sql, Object[] bindArgs);

(2)query()方法:

public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String
groupBy, String having,String orderBy, String limit);

public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String
groupBy, String having, String orderBy, String limit, CancellationSignal cancellationSignal);

public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String
having,String orderBy);

public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String
groupBy, String having, String orderBy, String limit);

(3)queryWithFactory()方法:

public Cursor queryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, boolean distinct, String table, String[]columns, String selection, String[] selectionArgs, String groupBy, String having, String
orderBy, String limit,CancellationSignal cancellationSignal);

public Cursor queryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, boolean distinct, String table, String[]columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);

(4)rawQuery()方法:

public Cursor rawQuery (String sql, String[] selectionArgs, CancellationSignal cancellationSignal);

public Cursor rawQuery (String sql, String[] selectionArgs);

(5)rawQueryWithFactory()方法:

public Cursor rawQueryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, String sql, String[]
selectionArgs,String editTable);

public Cursor rawQueryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, String sql, String[]
selectionArgs,String editTable, CancellationSignal cancellationSignal);

其中,execSQL()方法都有一个参数sql,这个参数是一个SQL语句。第二个参数bindArgs接收一个数组,数组中的每个成员捆绑了一个查询。execSQL()方法用于运行那些没有返回值的查询语句,比如创建、插入、更新和修改表。

query()方法和queryWithFactory()方法是在数据库中运行一些轻量级的单查询语句,参数包括table、columns、groupBy、having、orderBy、limit等SQL语句关键字。这些方法允许将SQL语句传递给相关方法,而不必直接使用SQL语句。

rawQuery()方法和rawQueryWithFactory()方法也都有一个参数sql,用于执行SQL查询语句,返回值是Cursor对象。这两个方法都有一个版本能够接收一个字符串数组selectionArgs作为参数,通过这个参数,SQLiteDatabase对象将把捆绑的SQL语句中的问号(?)用这个数组中的值代替,并按照一一对应的位置关系进行取代。

SQLiteDatabase类提供了大约50个方法,除此之外还有一些用于打开数据库的方法(如openDatabase()、openOrCreateDatabase()等),用于管理SQLite事务的方法(如beginTransaction()、endTransaction()等),用于测试数据库是否被锁住的方法(如isDbLockedByCurrentThread()、isDbLockedByOtherThread()等),以及获取数据库基本信息的方法(如getMaximumSiza()、getVersion()等)。这里就不一一介绍了,具体可以参阅SQLiteDatabase类的API帮助文档。

5.游标类Cursor

在Android中,查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()或SQLiteDatabase.rawQuery()方法时,会得到一个Cursor对象,Cursor指向的就是每一条记录,它提供了很多有关查询的方法,如图2所示。
http://www.cnblogs.com/menlsh/archive/2013/04/13/3019588.html

⑥ 安卓手机的3种储存分别指什么

手机容量指ROM分区,一般是软件和操作系统的储存位置,同时也存储应用的设定等一系列用户数据。

存储卡1可能指手机内置的储存(也就是你所说的16GB内置空间),一般像这样的储存空间默认被厂商设置为虚拟化的SD卡,因此作用和存储卡基本相同。

存储卡2可能指外部SD卡,也就是你插进去的内存卡。

注意:有些手机的设置选项中可以切换主要存储设备,切换以后内部存储和外部SD卡的路径可能会对调,例如华为的部分机型(\storage\sdcard0为主要存储器,sdcard1为次要存储器,可以切换内部空间或SD卡设为主要存储器,手机优先读sdcard0)。

⑦ 安卓系统的存储空间是怎么划分的

ROM分为三个分区:


1、系统分区----用于存放Android系统 (Android4.x版系统至少500MB以上)、还原备份(300MB左右)、刷机Recovery资源(约20MB~50MB)、系统级APP(安 装在此空间的APP需要Root权限才可卸载)以及交换空间、硬件底层空间等等,加在一起约1.5GB~2GB。这部分空间就好似PC上安装在C盘中的 Windows系统和硬件驱动程序,以及用于存放一键恢复镜像的隐藏分区。


2、程序分区----用于存放随机预装的第三方 APP(用户可卸载),你自己下载的所有APP主程序都会安装到这个空间内,手机厂商通常会为此分区预留1GB~3GB的存储空间。当该空间被占满后,你 再安装APP时会出现无空间安装的报错提示。我们可以将其理解为PC C盘里的“Program Files”文件夹,只是你所安装的所有程序默认只能安装于此且无法修改路径。“系统分区+程序分区”的总和就是电脑C盘的全部空间。


3、存储分区----这才是当手机连接PC后所识别 出来的“移动硬盘”,小米3的12.38GB和联想K900的7.88GB就是存储分区。这部分空间可以由用户自由支配,可存放大型游戏的数据包、音乐、 图片、视频,可像U盘一样随意折腾。换做PC领域,存储分区就好似D盘、E盘、F盘等非系统分区。


系统分区和程序分区,虽然无法被用户直接利用,但却承担着非常重要的角色。

⑧ android 数据存储的几种方式

总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络。其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式;数据库用起稍烦锁一些,但它有它的优点,比如在海量数据时性能优越,有查询功能,可以加密,可以加锁,可以跨应用,跨平台等等;网络,则用于比较重要的事情,比如科研,勘探,航空等实时采集到的数据需要马上通过网络传输到数据处理中心进行存储并进行处理。 对于Android平台来讲,它的存储方式也不外乎这几种,按方式总体来分,也是文件,数据库和网络。但从开发者的角度来讲它可以分为以下五种方式: 1.SharedPreferences共享偏好 2.Internal Storage内部存储空间 3.External Storage外部存储空间 4.SQLite Database数据库 5.Internet网络 这几种方式各自有各自的优点和缺点,要根据不同的实际情况来选择,而无法给出统一的标准。下面就各种方式谈谈它们的优缺点,以及最合适的使用情况: 1.Shared Preferences共享偏好 SharedPreferences是用来存储一些Key/Value类似的成对的基本数据类型,注意,它只能存储基本数据类型,也即int, long, boolean, String, float。事实上它完全相当于一个HashMap,唯一不同的就是HashMap中的Value可以是任何对象,而SharedPreferences中的值只能存储基本数据类型(primitive types)。 对于它的使用方法,可以参考Android Developer Guide,这里不重复。 如此来看,最适合SharedPreferences的地方就是保存配置信息,因为很多配置信息都是Key/Value。事实上,在Android当中SharedPreferences使用最多的地方也是用来保存配置(Settings)信息,系统中的Settings中这样,各个应用中的Settings也是这样。并且,Android中为了方便的使用SharedPreferences保存配置信息,它来专门有PreferenceActivity用来封装。也就是说如果你想在应用程序中创建配置(Settings),你可以直接使用PreferenceActivity和一些相关的专门为Preference封装的组件,而不用再直接去创建,读取和保存SharedPreference,Framework中的这些组件会为你做这些事。 再谈谈一些使用SharedPreference时的技巧,它只能保存基本数据类型,但假如我想保存一个数组,怎么办?可以把数据进行处理,把它转化成一个String,取出的时候再还原就好了;再如,如想保存一个对象,怎么办,同样,可以把对象序列化成为字符序列,或转成String(Object.toString()),或是把它的HashCode(Object.hashCode())当成Value保存进去。 总之,SharedPreferences使用起来十分的方便,可以灵活应用,因为它简单方便,所以能用它就尽量不要用文件或是数据库。 1.Internal Storage内部存储空间 所谓的内部存储与外部存储,是指是否是手机内置。手机内置的存储空间,称为内部存储,它是手机一旦出厂就无法改变,它也是手机的硬件指标之一,通常来讲手机内置存储空间越大意味着手机价格会越贵(很多地方把它称为手机内存,但我们做软件的知道,这并不准确,内存是指手机运行时存储程序,数据和指令的地方;这里应该是手机内部存储的简称为内存,而并非严格意义上的内存)。 内部存储空间十分有限,因而显得可贵,所以我们要尽可能避免使用;另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。上面所谈到的Shared Preferences和下面要谈到的SQLite数据库也都是存储在内部存储空间上的。 Android本身来讲是一个Linux操作系统,所以它的内部存储空间,对于应用程序和用户来讲就是“/data/data"目录。它与其他的(外部的存储)相比有着比较稳定,存储方便,操作简单,更加安全(因为可以控制访问权限)等优点。而它唯一的缺点就是它比较有限,比较可贵。 虽然,可以非常容易的知道程序本身的数据所在路径,所有的应用程序的数据路径都是“/data/data/app-package-name/”,所有的程序用到的数据,比如libs库,SharedPreferences都是存放在这个路径下面。但我们在使用的时候最好不要,或是千万不要直接引用这个路径。 使用内部存储主要有二个方式,一个是文件操作,一个是文件夹操作。无论哪种方式,Context中都提供了相应的函数来支持,使用Context不但操作简单方便,最重要的是Context会帮助我们管理这些文件,也可以方便帮助我们控制文件的访问权限。先来系统的说下Context中关于文件和文件夹操作的函数有哪些。 a. 创建一个文件,并打开成一个文件输出流,需要提供一个String,作为文件名 1.FileOutputStream output = Context.openOutputFile(filename, Context.MODE_PRIVATE); 2.output.write(data);// use output to write whatever you like 3.output.close(); 1.FileOutputStream output = Context.openOutputFile(filename, Context.MODE_PRIVATE); output.write(data);// use output to write whatever you like output.close(); b. 同样,想打开一个文件作为输入的话,也是只需要提供文件名 1.FileInputStream input = Context.openInputFile(filename); 2.input.read(); 3.input.close(); 1.FileInputStream input = Context.openInputFile(filename); input.read(); input.close(); c. 列出所有的已创建的文件 1.String[] files = Context.fileList(); 2.for (String file : files) { 3. Log.e(TAG, "file is " + file); 4.} 1.String[] files = Context.fileList(); for (String file : files) { Log.e(TAG, "file is " + file); } d. 删除文件,能创建就要能够删除,当然也会提供了删除文件的接口,它也非常简单,只需要提供文件名 1.if (Context.deleteFile(filename)) { 2. Log.e(TAG, "delete file " + filename + " sucessfully“); 3.} else { 4. Log.e(TAG, "failed to delete file " + filename); 5.} 1.if (Context.deleteFile(filename)) { Log.e(TAG, "delete file " + filename + " sucessfully“); } else { Log.e(TAG, "failed to delete file " + filename); } e. 获取文件已创建文件的路径,它返回一个文件对象用于操作路径 1.File fileDir = Context.getFileDir(); 2.Log.e(TAG, "fileDir " + fileDir.getAbsolutePath(); 1.File fileDir = Context.getFileDir(); Log.e(TAG, "fileDir " + fileDir.getAbsolutePath(); f. 创建一个目录,需要传入目录名称,它返回 一个文件对象用到操作路径 1.File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); 2.Log.e(TAG, "workdir " + workDir.getAbsolutePath(); 1.File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); Log.e(TAG, "workdir " + workDir.getAbsolutePath(); g. 以File对象方式查看所创建文件,需要传入文件名,会返回文件对象 1.File store = Context.openFileStreamPath(filename); 2.Log.e(TAG, "store " + store.length()); 1.File store = Context.openFileStreamPath(filename); Log.e(TAG, "store " + store.length()); h. 获取Cache路径,无需要传入参数,返回文件对象 1.File cachedir = Context.getCacheDir(); 2.Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath()); 1.File cachedir = Context.getCacheDir(); Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath()); 总结一下文件相关操作,可以得出以下三个特点: 1. 文件操作只需要向函数提供文件名,所以程序自己只需要维护文件名即可; 2. 不用自己去创建文件对象和输入、输出流,提供文件名就可以返回File对象或输入输出流 3. 对于路径操作返回的都是文件对象。 如前所述,内部存储空间有限,可贵,安全,稳定,所以应该用来保存比较重要的数据,比如用户信息资料,口令秘码等不需要与其他应用程序共享的数据。也可以用来创建临时文件,但一定要注意及时删除。另外,对于内部存储还有一个非常重要的特点,那就是在应用程序被卸载时,应用程序在内部存储空间的文件数据将全部被删除。系统这样做的原因很简单,就是因为内部存储很有限,它必须保证它的可用性,因为一旦添满,系统将无法再正常工作。 1.External Storage外部存储空间 再来谈谈手机外部存储空间,与内部存储空间相对,外部存储空间是指手机出厂的时候不存在,用户在使用时候可以自由添加的外部存储介质比如TS卡,SD卡等闪存储介质。这些闪存介质由最初的空间小价格贵,到现在的大容量价格便宜,所以几乎每个支持外部存储的手机上面都有大容量(大于等于2G)的闪存卡。 Android也是不例外,它完全支持外部存储介质。其实更确切的说,它是要依赖于外部存储卡的,因为对于Android系统,如果没有外部存储卡,很多的系统应用无法使用,比如多媒体相关的应用程序无法使用。虽然Android很依赖,但是外部存储卡也有它自身的特点,它最大的优点就是存储空间大,基本上你可无限制的使用,也不怎么担心去清除数据。就目前来看,很多程序都在使用外部存储卡,但很少有程序去主动清理数据,所以无论你的SD卡有多大,它的可用空间却越来越少。与内部存储不同的是,当程序卸载时,它在外部存储所创建的文件数据是不会被清除的。所以清理外部存储空间的责任丢给了用户自己,每隔一段时间就去查看下SD卡,发现无用数据立马删除。外部存储的缺点就是不是很稳定,对于Android手机来讲可以说,很不稳定,本身闪存介质就容易出问题,SD卡处于不能正常使用的状态十分多。 先来说说外部存储相关的使用方法和API: a. Check media availability检查介质的可用性 如前所述,外部存储介质的稳定性十分的差,所以在使用之前一定要先检查它的可用性,如果可用再去用 view plain to clipboardprint? 1.final String state = Environment.getExternalStorageState(); 2.if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } view plain to clipboardprint? 1.final String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } final String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } b. Get the directory获取外部存储卡的路径 事实上,外部存储卡的路径是“/mnt/sdcard",所以你直接这样写去访问也能访问的到。鉴于可读性和可移植性的考虑,建议这样写: view plain to clipboardprint? 1.File sdcardDir = Environment.getExternalStorageDirectory(); view plain to clipboardprint? 1.File sdcardDir = Environment.getExternalStorageDirectory(); File sdcardDir = Environment.getExternalStorageDirectory(); c. For API 8 or greater, there are some other useful APIs helping to manager files and directories. 如果你使用API 8(Android 2.2)或者更高,那么SDK中又多了几个操作外部存储文件和路径的接口,文档中也建议开始者更加规范的使用SD卡。比如,创建相应的目录去存储相应的数据,Music,Picture,Video等。应用程序目录也变成了"/Android/data/package-name/data"。具体的使用可以参考文档,这里不重复。当然,就像编程规范一样,这里只是规范,你完全可以不遵守它,但出于可读性和可移植性,还是建议按照文档建议的去做。 下面总结一下使用时应该注意的一些和外部存储的特点: a. 外部存储卡不是随时想用就能够用的,所以一定要记得在使用之前检查它的可用性 b. 存储在外部存储卡上的数据是所有应用程序都可见,用户也可见(使用FileManager),所以安全性不是很好,虽然文档声称可以在外部存储卡上写程序私有数据,但貌似没用,用FileManager仍然可以删除或编辑文件(Market上面的FileManager功能都十分的强大,能让用户看到SD卡中的所有文件,和操作能看到的文件)。 c. Android手机支持把外部存储卡Mount至PC做为U盘,当连接数据线时,这时SD卡变成了U盘连接到了另外的操作系统中。什么意思,就是在Android当中虽然有的文件属性(隐藏,私有等),到了PC上就不一定管用了,用户在PC上可以随意操作文件(这就是第二点中所提及的)。 d. 如果使用外部存储卡保存数据,一定要额外做好异常处理:外部存储卡不可用时把数据存入哪里;可用的时候再怎么同步数据(这是比较头疼的地方,可行的做法就是当SD卡不可用时不准用户写数据,但这用户体验又不是很好,但如你所知,很多应用都这么干);你的数据被破坏了。当然常见的异常也要考虑,比如空间满了,无法写入,磁盘坏道等。 1.SQLite Database数据库 Android对数据库的支持很好,它本身集成了SQLite数据库,每个应用都可以方便的使用它,或者更确切的说,Android完全依赖于SQLite数据库,它所有的系统数据和用到的结构化数据都存储在数据库中。 它具有以下优点: a. 效率出众,这是无可否认的 b. 十分适合存储结构化数据 c. 方便在不同的Activity,甚至不同的应用之间传递数据 先前有一篇文章讲到了不同Activity和不同应用之间传递数据的麻烦,特别是对于大型数据结构,因为Activity虽是Java对象,但去无法像使用其他类对象那样去创建一个实例然后使用它,更无法给Activity加上Setters和Getters(虽然这样做了没有编译错误)。比较好的解决方案就是把结构化数据写入数据库,然后在不同的Activity之间传递它们的Uri。 d. 由专门的ContentProvider来帮忙管理和维护数据库 e. 可以方便的设置访问权限,私有还是都可见 f. 操作方便,使用标准的CRUDE语句,ContentResolver.query(), update(), delete() insert(),详见ContentResolver g. 良好的可移植性和通用性,用标准的SQL语句就能实现CRUDE 对于它的使用方法可以去参考文档,这里也说不清楚。 1.Internet网络 网络是比较不靠谱的一个,因为移动终端的网络稳定性,以及所产生的流量让人伤不起,用户更伤不起。但若是对于非常重要的实时数据,或是需要发送给远端服务器处理的,也可以考虑使用网络实时发送。这已经有先例了,Apple和Google就是这样,iPhone设备和Android设备都会在用户不知情的情况 下收集用户的信息,然后又在用户不知情的情况 下发送到Apple和Google的服务器上,也就是所谓的“跟踪门”。除此之外,智能手机(特别是Android和火热的iPhone)上面的应用程序都会偷偷的在后台运行,收集用户数据,然后再偷偷的发服务器,直接伤害是用户流量,请看先前的文章。 对比这几种方式,可以总结下: 1. 简单数据和配置信息,SharedPreference是首选; 2. 如果SharedPreferences不够用,那么就创建一个数据库 3. 结构化数据,一定要创建数据库,虽然这稍显烦锁,但是好处无穷 4. 文件就是用来存储文件(也即非配置信息或结构化数据),如文本文件,二进制文件,PC文件,多媒体文件,下载的文件等等。 5. 尽量不要创建文件 6. 如果创建文件,如果是私密文件或是重要文件,就存储在内部存储,否则放到外部存储 7. 不要收集用户数据,更不要发到网络上,虽然你们也有很多无奈。用户也无奈,也无辜,但更无助 平台为开发者准备了这么多的方式固然是一件好事,但我们要认清每一种的优点和缺点,根据实际情况选择最合适的。还有一个原则就是最简单原则,也就是说能用简单的方式处理,就不要用复杂的方式。

⑨ android中五大数据存储有哪些

第一种: 使用SharedPreferences存储数据
SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长 整形、Int整形、String字符串型的保存。

实现SharedPreferences存储的步骤如下:
一、根据Context获取SharedPreferences对象
二、利用edit()方法获取Editor对象。
三、通过Editor对象存储key-value键值对数据。
四、通过commit()方法提交数据。

openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。
创建的文件保存在/data/data/<package name>/files目录,如: /data/data/cn.itcast.action/files/itcast.txt ,通过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File Explorer视图,然后在File Explorer视图中展开/data/data/<package name>/files目录就可以看到该文件。
openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入: openFileOutput(“itcast.txt”, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。
除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。

对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
Activity还提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用于获取/data/data/<package name>/cache目录 getFilesDir()方法用于获取/data/data/<package name>/files目录。
把文件存入SDCard:
使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。对于像视频这样的大文件,我们可以把它存放在SDCard。
SDCard是干什么的?你可以把它看作是移动硬盘或U盘。 在模拟器中使用SDCard,你需要先创建一张SDCard卡(当然不是真的SDCard,只是镜像文件)。
创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下: 在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀可以随便取,建议使用.img: mksdcard 2048M D:\AndroidTool\sdcard.img 在程序中访问SDCard,你需要申请访问SDCard的权限。

第三种: SQLite数据库存储数据
SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite.SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。
特点:
面向资源有限的设备,
没有服务器进程,
所有数据存放在同一文件中跨平台,
可自由复制。
SQLite 内部结构:

SQLite 基本上符合 SQL-92 标准,和其他的主要 SQL 数据库没什么区别。它的优点就是高效,Android 运行时环境包含了完整的 SQLite。
SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite 称这为“弱类型”(manifest typing.)。 此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。 除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。
Android 集成了 SQLite 数据库 Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。
对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQLite 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些 API。
数据库存储在 data/< 项目文件夹 >/databases/ 下。 Android 开发中使用 SQLite 数据库 Activites 可以通过 Content Provider 或者 Service 访问一个数据库。
下面会详细讲解如果创建数据库,添加数据和查询数据库。 创建数据库 Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。
Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。
SQLiteOpenHelper 的子类,至少需要实现三个方法:
1 构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。
2 onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。
3 onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。

第四种: 使用ContentProvider存储数据
Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据。那这个时候有读者就会提出问题,难道两个程序之间就没有办法对于数据进行交换?Android这么优秀的系统不会让这种情况发生的。解决这个问题主要靠ContentProvider。一个Content Provider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。也就是说,一个程序可以通过实现一个Content Provider的抽象接口将自己的数据暴露出去。外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,可以读取程序的数据,也可以删除程序的数据,当然,中间也会涉及一些权限的问题。
一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProviders是以类似数据库中表的方式将数据暴露,也就是说ContentProvider就像一个“数据库”。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI来表示外界需要访问的“数据库”。
Content Provider提供了一种多应用间数据共享的方式,比如:联系人信息可以被多个应用程序访问。
Content Provider是个实现了一组用于提供其他应用程序存取数据的标准方法的类。 应用程序可以在Content Provider中执行如下操作: 查询数据 修改数据 添加数据 删除数据
标准的Content Provider: Android提供了一些已经在系统中实现的标准Content Provider,比如联系人信息,图片库等等,你可以用这些Content Provider来访问设备上存储的联系人信息,图片等等。

这样我们就可以调用insertRecords(name, phoneNo)的方式来向联系人信息簿中添加联系人姓名和电话号码。
删除记录:
Content Provider中的getContextResolver.delete()方法可以用来删除记录。
下面的记录用来删除设备上所有的联系人信息:

private void deleteRecords() {

Uri uri = People.CONTENT_URI;

getContentResolver().delete(uri, null, null);

}

别忘记了在配置文件中设置访问网络权限:
<uses-permission android:name="android.permission.INTERNET" />

⑩ android怎样缓存数据面试题

共有七个周期函数,按顺序分别是: onCreate(), onStart(), onRestart(), onResume(), onPause(),onStop(), onDestroy()。
onCreate(): 创建Activity时调用,设置在该方法中,还以Bundle的形式提供对以前存储的任何状态的访问。
onStart(): Activity变为在屏幕上对用户可见时调用。
onResume(): Activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用。
onPause(): Activity被暂停或收回cpu和其他资源时调用,该方法用户保护活动状态的,也是保护现场。
onStop(): Activity被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart(): Activity被重新启动时调用。该活动仍然在栈中,而不是启动新的Activity。
1、完整生命周期: 即从一个Activity从出现到消失,对应的周期方法是从onCreate()到onDestroy()。
2、可见生命周期: 当Activity处于可以用户看见的状态,但不一定能与用户交互时,将多次执行从onStart()到onStop()。
3、前景生命周期: 当Activity处于Activity栈最顶端,能够与其他用户进行交互时,将多次执行从onResume()到onPause()。

2. 两个Activity之间跳转时必然会执行的是哪几个方法。
答: 两个Activity之间跳转必然会执行的是下面几个方法。
onCreate()//在Activity生命周期开始时调用。
onRestoreInstanceState()//用来恢复UI状态。
onRestart()//当Activity重新启动时调用。
onStart()//当Activity对用户即将可见时调用。
onResume()//当Activity与用户交互时,绘制界面。
onSaveInstanceState()//即将移出栈顶保留UI状态时调用。
onPause()//暂停当前活动Activity,提交持久数据的改变,停止动画或其他占用GPU资源的东西,由于下一个Activity在这个方法返回之前不会resume,所以这个方法的代码执行要快。
onStop()//Activity不再可见时调用。
onDestroy()//Activity销毁栈时被调用的最后一个方法。

3. 横竖屏切换时候Activity的生命周期。
答:
1、不设置Activity的android: configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
2、设置Activity的android: configChanges=“orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
3、设置Activity的android: configChanges=“orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfiguration方法

4. 如何将一个Activity设置成窗口的样式。
答: 第一种方法,在styles.xml文件中,可以新建如下的类似Dialog的style。
<style name=“Theme.FloatActivity” parent=“android:style/Theme.Dialog”> </style>。
第二种方法,在AndroidManifest.xml中在需要显示为窗口的Activity中添加如下属性: android: theme=“@style/Theme.FloatActivity”即可。也可以直接添加对应需要展示为Dialog style的Activity的android: theme属性为android: theme=“@ android: style/Theme.Dialog”。

5. 两个Activity之间怎么传递数据?
答: 可以在Intent对象中利用Extra来传递存储数据。
在Intent的对象请求中,使用putExtra(“键值对的名字”,”键值对的值”);在另外一个Activity中将Intent中的请求数据取出来:
Intent intent = getIntent();
String value = intent.getStringExtra(“testIntent”);

6. 怎么让在启动一个Activity是就启动一个service?
答: 首先定义好一个service,然后在Activity的onCreate里面进行连接并bindservice或者直接startService。

7. Activity怎么和service绑定,怎么在activity中启动自己对应的service?
答:
1、activity能进行绑定得益于Serviece的接口。为了支持Service的绑定,实现onBind方法。
2、Service和Activity的连接可以用ServiceConnection来实现。需要实现一个新的ServiceConnection,重现onServiceConnected和OnServiceDisconnected方法,一旦连接建立,就能得到Service实例的引用。
3、执行绑定,调用bindService方法,传入一个选择了要绑定的Service的Intent(显示或隐式)和一个你实现了的ServiceConnection的实例

8.什么是Service以及描述下它的生命周期。Service有哪些启动方法,有什么区别,怎样停用Service?
答: Android Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序进程的上下文里。需要通过某一个Activity或者Context对象来调用。Service有两个启动方法,分别是Context.startService()和Context.bindService()。如果在Service执行耗时的操作需要启动一个新线程来执行。
Android Service只继承了onCreate(), onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用onCreate(), onStart()这两个方法,当停止Service时,则执行onDestroy()方法时。如果Service已经启动了,当我们再次启动Service时,不会再执行onCreate()方法,而是直接执行onStart()方法。

9. 什么时候使用Service?
答: 比如播放多媒体的时候,用户启动了其他Activity,这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你的地理信息位置的改变等等。

10. 请描述一下Intent 和 Intent Filter。
答: Intent在Android中被翻译为”意图”,他是三种应用程序基本组件-Activity,Service和broadcast receiver之间相互激活的手段。在调用Intent名称时使用ComponentName也就是类的全名时为显示调用。这种方式一般用于应用程序的内部调用,因为你不一定会知道别人写的类的全名。而Intent Filter是指意图过滤,不出现在代码中,而是出现在android Manifest文件中,以<intent-filter>的形式。(有一个例外是broadcast receiver的intent
filter是使用Context.registerReceiver()来动态设定的,其中intent filter也是在代码中创建的)
一个intent有action,data,category等字段。一个隐式intent为了能够被某个intent filter接收,必须通过3个测试,一个intent为了被某个组件接收,则必须通过它所有的intent filter中的一个。

11. Intent传递数据时,可以传递哪些类型数据?
答: intent间传送数据一般有两种常用的方法: 1、extra 2、data。
extra可以用Intent.putExtra放入数据。新启动的Activity可用Intent.getExtras取出Bundle,然后用Bundles.getLong,getInt,getBoolean,getString等函数来取放进去的值。
Data则是传输url。url可以是指我们熟悉的http,ftp等网络地址,也可以指content来指向ContentProvider提供的资源。Intent.setData可以放入数据,Intent.getData可以取出数据。

12. 说说Activity,Intent,Service是什么关系 ?
答: 一个Activity通常是一个单独的屏幕,每一个Activity都被实现为一个单独的类,这些类都是从Activity基类中继承而来的。Activity类会显示由视图控件组成的用户接口,并对视图控件的事件做出响应。
Intent的调用是用来进行屏幕之间的切换。Intent描述应用想要做什么。Intent数据结构中两个最重要的部分是动作和动作对应的数据,一个动作对应一个动作数据。
Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程里,也可以运行在其他应用程序进程的上下文里。需要一个Activity或者其他Context对象来调用。
Activity跳转Activity,Activity启动Service,Service打开Activity都需要Intent表明意图,以及传递参数,Intent是这些组件间信号传递的承载着。

13. 请描述一下BroadcastReceiver。
答: Broadcast Receiver用于接收并处理广播通知(broadcast announcements)。多数的广播是系统发起的,如地域变换、电量不足、来电短信等。程序也可以播放一个广播。程序可以有任意数量的broadcast receivers来响应它觉得重要的通知。Broadcast receiver可以通过多种方式通知用户: 启动activity、使用NotificationManager、开启背景灯、振动设备、播放声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。通常我们的某个应用或系统本身在某些事件(电池电量不足、来电短信)来临时会广播一个Intent出去,我们利用注册一个broadcast
receiver来监听这些Intent并获取Intent中的数据。

14. 在manifest和代码中如何注册和使用 broadcast receiver 。
答: 在android的manifest中注册
<receiver android: name =“Receiver1”>
<intent-filter>
<!----和Intent中的action对应--->
<actionandroid: name=“com.forrest.action.mybroadcast”/>
</intent-filter>
</receiver>
在代码中注册
1、 IntentFilter filter = new IntentFilter(“com.forrest.action.mybroadcast”);//和广播中Intent的action对应;
2、 MyBroadcastReceiver br= new MyBroadcastReceiver();
3、 registerReceiver(br, filter);

15. 请介绍下ContentProvider是如何实现数据共享的。
答: 一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content provider是以类似数据库中的表的方式将自己的数据暴露。Content provider存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。
要想使应用程序的数据公开化,可通过2种方法:创建一个数据自己的Content Provider或者将你的数据添加到一个已经存在的Content Provider中,前提是有相同数据类型并且有写入Content Provider的权限,Android提供了Content Resolverr,外界的程序可以通过Content Resolver接口访问Content Provider提供的数据。

16. 请介绍下Android的数据存储方式。
答: Android提供了5中存储数据的方式,分别是以下几种
1、使用Shared Preferences存储数据,用来存储key-value,pairs格式的数据,它是一个轻量级的键值存储机制,只可以存储基本数据类型。
2、使用文件存储数据,通过FileInputStream和FileOutputStream对文件进行操作。在Android中,文件是一个应用程序私有的,一个应用程序无法读写其他应用程序的文件。
3、使用SQLite数据库存储数据,Android提供的一个标准数据库,支持SQL语句。
4、使用Content Provider存储数据,是所有应用程序之间数据存储和检索的一个桥梁,它的作用就是使得各个应用程序之间实现数据共享。它是一个特殊的存储数据的类型,它提供了一套标准的接口用来获取数据,操作数据。系统也提供了音频、视频、图像和个人信息等几个常用的Content Provider。如果你想公开自己的私有数据,可以创建自己的Content Provider类,或者当你对这些数据拥有控制写入的权限时,将这些数据添加到Content Provider中实现共享。外部访问通过Content Resolver去访问并操作这些被暴露的数据。
5、使用网络存储数据

17. 请介绍下Android中常用的五种布局。
答: 最常用的布局方式为Absolute Layout、Relative Layout、Linear Layout、FrameLayout、TableLayout。其中Linear Layout和Relative Layout是最常用的方式,他们可以通过在xml配置文件或者代码中进行布局。
1、Frame Layout是最简单的布局方式,放置的控件都只能罗列到左上角,控件会有重叠,不能进行复杂的布局。
2、Linear Layout可以通过orientation属性设置线性排列的方向是垂直还是纵向的,每行或每列只有一个元素,可以进行复杂的布局。
3、Absolute Layout可以让子元素指定准确的x、y坐标值,并显示在屏幕上。Absolute Layout没有页边框,允许元素之间相互重叠。它是绝对坐标,所以在实际中不提倡使用。

4、Relative Layout允许子元素制定他们相对于其他元素或父元素的位置(通过ID制定)。因此,你可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素。元素按顺序排列,因此如果第一个元素在屏幕的中央,那么相对于这个元素的其他元素将以屏幕中央的相对位置来排列。这个是相对于Absolute Layout的,采用相对坐标,所以在实际中比较常用。
5、Table Layout将以子元素的位置分配到行或列。一个Table Layout由许多的Table Row组成,每个Table Row都会定义一个row。Table Layout容器不会显示row、column或者cell的边线框。每个row拥有0个或多个的cell; 和html中的table差不多。在实际中也经常使用。

18. 谈谈UI中, Padding和Margin有什么区别?
答: Padding是控件的内容相对控件的边缘的边距,而Margin是控件边缘相对于其他控件的边距。如下图所示:

19. android本身的一些限制,比如apk包大小限制,读取大文件时的时间限。
答:apk包大小限制不好说,有的apk为100M,还是能装到手机上。一般的apk大小为5~10M左右。读取大文件的时间应该是在main线程里面,时间限制为5秒左右。

20. ListView如何提高其效率?
答:1、使用分页加载,不要一次性加载所有数据。
2、复用convertView。在getItemView中,判断converView是否为空,如果不为空,可复用。
3、异步加载图片。Item中如果包含有webimage,那么最好异步加载。
4、快速滑动时,不显示图片。当快速滑动列表(SCROLL_STATE_FLING),item中的图片或获取需要消耗资源的view,可以不显示出来;而处于其他两种状态(SCROLL_STATE_IDLE和SCROLL_STATE_TOUCH_SCROLL),则将那些view显示出来