基于Android的数独游戏的设计与实现外文翻译资料

 2022-09-15 15:12:12

英语原文共 564 页,剩余内容已隐藏,支付完成后下载完整资料


第九章 处理和存储数据

为了完成许多现代手机提供的活动,如跟踪联系,活动,和任务,一部手机的操作系统及其应用程序必须擅长存储和跟踪大量的数据。这些数据通常是以行和列的形式对其结构化,类似于电子表格或一个非常简单的数据库。Android应用程序生命周期的要求快速、一致持久性的数据以使它在波动的移动环境中生存下来,例如设备可能突然断电或Android操作系统武断的从内存中删除您的应用程序,这些都超越了传统的应用程序的存储数据的要求。

Android为持久化数据提供了轻量级但强大的SQLite的关系数据库引擎。此外,如第三章所述,内容提供特性让应用程序之间可以共享数据。

在这一章,我们提供一个简单的SQL教程,这样你可以学习使用Android SQLite的持久性。我们也介绍一个有趣的应用-MJAndroid-它展示了了如何在Android平台上操作数据库。之后,在第15章中,我们将引用相同的示例来演示在Android上怎样映射API。第十二章将向您展示如何实现content provider。

关系数据库概述

关系数据库提供了一种高效的、结构化的和通用的持久信息管理体制。有了数据库,应用程序可以使用结构化查询在被称为表的持续性二维矩阵中修改信息。开发人员用高级语言编写查询的代码,这种高级语言被称为结构化查询语言,它的更常见的称呼是SQL。SQL是关系数据库管理系统(RDBMS)的一种常见语言,自1970年代末,它一直是很受欢迎的数据管理工具。在1986年被NIST和1987年被ISO采用后,SQL成为了行业标准。它的应用很广泛,从tb Oracle和SQL Server安装到我们将看到的,在你的手机上存储邮件。

数据库表可用于存储包含很多相同类型实例的数据,这种情况在软件开发中很常见。例如,一个联系人列表有很多联系人,所有这些可能有相同类型的信息(如。地址,电话号码,等等)。在一张表中,每一“行”存储不同的人,而每一个“列”存储每个人的特定属性:名称在一列,地址在另一个列,家庭电话号码在第三列。当有人在多个相关事物(如多个地址),关系数据库也有解决的办法,,但我们这章不会深入这些细节。

SQLite

Android使用SQLite数据库引擎,它是一个独立的事务数据库引擎,不需要单独的服务器进程。许多应用程序和环境,Android只利用了它的一部分,并且一个大开源社区在不断积极发展SQLite。对于定位于台式机和企业的数据库,它们提供了过多的关于容错和并发访问数据的特性,SQLite与此不同,SQLite积极去除那些实现一个小的封装不必需的特性。例如,许多数据库系统使用静态类型,但SQLite并不存储这些数据库类型信息。相反,它让高级语言来保存这些类型信息,比如Java。

尽管谷歌作出了贡献,但SQLite并不是谷歌所开发的。SQLite背后是一个软件开发的国际性团队,他们致力于提高软件的功能和可靠性。SQLite的可靠性是一个关键的特性。在一个项目中,超过一半的的代码是用于测试库。这个库是用来处理各种各样的系统故障,如低内存,磁盘错误,和电源故障。由于在手机中重要数据被存储在数据库中,要是数据库不可恢复,手机将死机。幸运的是,SQLite没那么容易崩溃,要是它是那样的话,一次不合时宜的电池故障就能手机变得毫无用处。

SQLite项目提供了全面和详细的文档:http://www.sqlite.org/docs.html。

SQL语言

尽管对于那些最常见的与数据相关的活动提供了高级类,但编写Android应用程序通常需要有在SQL上编程的基本能力。 。本章是针对一个初学者的关于SQLite的介绍。虽然这不是一本关于SQL的书,但我们将为对基于Android的SQL介绍的足够仔细,来让你在各种各样的Android应用程序都能实现数据持久性。要想获得关于SQL语言更全面的信息,请参见http://www.sqlite.org/lang.html。我们将使用简单的SQL命令解释SQLite语言,并在这个过程中,我们将演示如何使用sqlite3命令查看这些对表的查询修改效果。你可能会发现W3Schools教程很有用:http://www.w3schools.com/sql/sql_intro.asp。

有了SQLite,数据库在Android文件系统中只是一个简单的文件,它可以存在闪存或外存中,但是你会发现,大多数应用程序的数据库驻留在一个目录名为lt;/data/data/com.example.your App Package/databasesgt;的文件中。你可以数据库的命令行解释器中使用ls命令列出Android在该目录中已创建的数据库。

数据库负责数据的持久性,也就是说 ,它更新SQLite文件的方式是由应用程序发布的每个SQL语句指明的。接下来,我们将介绍SQLite命令在sqlite3命令行实用程序中的使用。 以后我们将展示如何使用Android API实现相同的效果。虽然命令行SQL不是你编写的应用程序的一部分,但它可以在你开发应用程序是帮助你调试。你会发现在Android上编写数据库代码通常是一个编写Java代码以操作表的重复的过程,,之后就是用命令行看看创建的数据。

SQL数据定义命令

SQL语言中的语句分为两个不同的类别,一种是创建和修改那些存储数据的表,另一种是创建,读取,更新和删除表中的数据。在本节中,我们将看看前者,数据定义的命令

创建表

开发人员开始使用SQL时会创建一个表来存储数据。 CREATE TABLE的命令会在SQL的数据库中创建一个新表。它指定一个名字和各种列保存数据,这个名字在数据库的表中是唯一的。表中的每个列都有一个唯一的名称和类型(类型是由SQL定义的,如日期或文本字符串)。列还可以指定其他属性,比如值是否必须是唯一的,在插入没有指定值的一行时是否有默认值,以及是否允许值为NULL。

一个表类似于一张电子表格。返回联系人数据库的例子,表中的每一行包含一个联系人的信息。每一列是你收集的每个联系人的各种各样的信息:姓,名,生日,等等。在这章中,我们提供几个例子来帮助您开始使用我们的工作数据库。

DROP TABLE

这个语句会删除通过 CREATE TABLE创建的表。它只需要将要删除的标的名字。操作结束时,任何存储在表中的数据都将不可恢复。

下面是一些SQL代码,主要是为存储联系人而进行的见表和删除表的操作

CREATE TABLE contacts (

first_name TEXT,

last_name TEXT,

phone_number TEXT,

height_in_meters REAL);

DROP TABLE contacts;

当通过sqlite3进入命令行时,你必须用分号终止每个命令。

你可以通过ALTER TABLE命令来改变你创建的表的模式(你可能想要加入一列或改变某一列的默认值)

SQLite类型

正如在265页“SQL数据定义命令”中阐述的那样,你必须在你定义的所有表中为你创建的每一列指定一个类型。SQLite支持以下数据类型:

TEXT型

一个文本字符串,使用数据库存储编码(utf - 8、UTF-16BE或UTF-16LE)。你会发现TEXT是最常见的类型。

REAL

浮点数字,存储为8-byte IEEE浮点数

BLOB

任意二进制数据,输入和存储的是一致的。你可以使用BLOB数据类型来存储任何类型的变长数据,例如一个可执行文件或下载的图片。一般来说,大的二进制数据块会增加移动数据的性能开销,因此你通常需要避免使用它们。在第十三章,我们提出另一种方案来存储从互联网上下载的图片。

INTEGER

有符号整数,根据值的大小分别用1,2,3,4,6,或8个字节来存储。

关于SQLite类型的具体信息可参考:http://www.sqlite.org/datatype3.html

数据库的约束

数据库约束标标记具有特定属性的列。一些约束,加强了面向数据的局限性,比如要求列中的所有值是唯一的 (如一个包含社会安全号码的列)。其他约束表现出更多的功能。关系约束、PRIMARY KEY 和FOREIGN KEY,,形成表之间关系的基础。

大多数表应该有一个特定的列,惟一地标识每个给定的行。 在SQL指定主键的列往往仅作为每一行的一个标识符(与社会安全号码不同)没有任何意义。因此,您不需要指定这个列的值。相反,在添加新行时,你可以让SQLite分配递增整数值。其他数据库通常需要专门将某一列作为自动增量实现这一结果。SQLite还提供了一个显式AUTOINCREMENT约束,但默认自动增量为主键。递增的值在列中承担的角色类似于在高级语言如Java或C中的一个不透明的对象指针:其他数据库表和代码在高级语言可以使用列引用特定行。

当数据库行有唯一的的主键时,才可能得到表之间的依赖关系。例如,作为职员数据库的表可以定义一个整数列称为employer_id,它包括另一张被称为雇主的表中的行的主键值。如果你在雇主表中执行查询和选择一个或多个行的操作,你可以得到雇主id并且通过使用雇员表的employer_id列确定每一个雇主各自的雇员。这允许程序找到一个给定的雇员的雇主。这两个表(精经简称与这个例子相关的一些列)看起来像这样:

CREATE TABLE employers (

_id INTEGER PRIMARY KEY,

company_name TEXT);

CREATE TABLE employees (

name TEXT,

annual_salary REAL NOT NULL CHECK (annual_salary gt; 0),

employer_id REFERENCES employers(_id));

SQL允许一个表引用另一个表的主键作为外键列约束,这一点保证了交叉表引用的有效性。这个约束告诉数据库有外键约束的列的整数必须参照另一张表中数据库行的有效主键。因此,如果你将在雇主表中不存在的employer_id作为行插入到雇员表中,这违反了SQL的约束法则。这可以帮助你避免空引用,也称为执行外键。然而,在SQLite中,外键约束是可选的并且在Android中一般没有使用。你不能依赖一个外键约束发现错误的外键引用,所以你需要在创建使用外键的数据库模式时注意一点。

还有一些影响没那么深远的约束:

UNIQUE

当一行任何时候插入或更新,都强制要求给定的列的值不同于在所有现有中的那列的值。任何试图插入重复值的插入或更新的操作都会导致SQLIte的约束冲突。

NOT NULL

每一列的值不为空。注意主键唯一且非空

CHECK

采用布尔表达式并且要求对插入到列中的任何值,表达式返回真。一个例子是 CHECK (annual_salary gt;0),原在职工表中显示的属性。

SQL数据操作命令

一旦你使用数据定义命令定义表,你就可以插入数据和查询数据库。以下数据操作命令是最常用的SQL语句:

SELECT

这个语句提供了查询数据库的主要工具。这这个语句的效果是选择零个或多个数据行,每一行有固定数目的列。当只用你在声明中选择的行和列创建新表时,你可以用SELECT语句。在SQL语言中,SELECT语句是最复杂的命令,并且支持建立跨一个或多个数据库表的数据之间的关系的广泛的方法。Android API支持的SQL的SELECT命令的子句如下:

bull;FROM,它指定那些表中的数据将被查询

bull;WHERE,它指定条件,要求表中的行必须与查询返回的相匹配。

bull;GROUP BY,根据列名对结果进行成簇的排序。

bull;HAVING,通过评估群组是否违反表达式进一步缩小结果范围。你可能会从你的查询结果中删除那些少于最低元素数量的群组。

bull;ORDER BY,,通过指定列名设置查询结果的排序顺序,这些列名定义可类别和功能、、在指定列中通过元素对行进行排序的功能

bull;LIMIT, 剩余内容已隐藏,支付完成后下载完整资料


资料编号:[148747],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。