ImageVerifierCode 换一换
格式:DOCX , 页数:44 ,大小:35.27KB ,
资源ID:9526483      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9526483.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第十一章 应用程序找一个朋友.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第十一章 应用程序找一个朋友.docx

1、第十一章 应用程序找一个朋友应用程序:找一个朋友 第十一章(1)关键技能 & 概念 创建一个SQLite数据库 创建一个定制内容提供者 从数据库检索条目并且传递到一个Google Maps Overlay这是你将创建应用程序的最后一章,但是会是本书介绍的最大的一个应用程序。我将介绍一些到目前为止没有遇到过的话题,而且你会用到这些话题所谈到的技能创建一个非常健全的应用程序。在本章中,会学习如何在Android模拟器中创建SQLite数据库。我会向你展示如何在定制的数据库中读取,写入并且输出数据。这个过程包括创建并使用你自己的Content Provider来和数据库一同工作。然后,你拿取存储在数

2、据库中的数据并写入到GoogleMapsOverlay中。当你在前一章用Google地图时,还没有使用Overlay。使用GoogleMapsOverlays在地图上绘制形状并且写文本,得到一个有信息量的地图。在这个项目中,将创建一个两部分应用程序。应用程序的第一部分将允许用户输入“friends”到移动数据库中。(一个friend由姓名和地理坐标位置组成)。用户将能增加,修改并且删除friends.第二个部分将包括一个菜单项目。当用户选择这个菜单项目,应用程序将显示一个Google地图。这个Google地图和第九章创建的Google地图不同之处就是,这个地图会包含一个Google Maps

3、Overlay,它会允许你在Google地图的标题处写入姓名,给定信息并且绘制项目。要开始,在Eclipse内创建一个新的Android项目,命名为FindFriend,使用下图的设定(略)。现在,你应该对创建一个Android应用程序非常的熟悉了,创建本项目会需要一点小小的帮助。Google在AndroidSDK里有一个应用程序叫NotePad,非常简单但是允许你储存,修改并且删除数据库里的“notes”。你会去修改这个例子的一些代码来创建Friends数据库。如果你想要知道Google NotePad如何工作,在继续之前,在Eclipse中装载项目并且在模拟器中运行它。不久将会开始修改这个

4、代码,但是首先,在下一节里,将创建你的第一个SQLite数据库。创建一个SQLite数据库创建一个SQLite数据库 第十一章(2)Android设备将发布时会有一个内部的SQLite数据库。这个数据库的目的是允许用户和开发者一个可以在活动中储存信息的地方。如果你用过MicrosoftSQL服务器或者SQLite,使用Andorid的SQLite数据库的结构和过程对你将不会陌生。不管你有多少的经验,这个部分将涵盖所有需要创建和使用全功能SQlite数据库的技能。你将要在Android模拟器上创建一个数据库。要实现这个,你需要进入AndroidSDK命令行编辑器工具并使用shell命令来进入An

5、droid服务器。提示参考第三章来重拾你的记忆关于路径声明和使用命令行工具。一旦你进入服务器,你需要导航到数据库的位置。所有的Android SQLite数据库的位置是在data/data/ databases目录。使用cd命令来从当前的目录改变到data目录,并且再到目录。如果你不确定目录的名称,使用ls来列出文件和当前目录。改变目录至android_programmers_ guide.FindAFriend,如下所示(略)警告如果你没有android_programmers_guide.FindAFriend目录,按照前一部分描述的方式创建你的应用程序并且运行“Hello World!”

6、默认的由项目创建的应用程序,那样会确保你有个正确的目录。找到android_programmers_guide.FindAFriend目录后,运行Is命令。这个命令列出特定文件夹内所有的文件和目录。改命令应当返回空的内容。因为,此时在该目录内没有文件和文件夹。假定SQLite数据库必须在本目录下的一个数据库目录内,是时候来创建一个了。mkdir工具为你创建目录。因此,运行mkdir databases命令。它将创建保留数据库的目录。警告现在,你几乎是在服务器的根目录上。因此你刚刚创建的目录将被作为根目录进入。当你运行活动时,可能会出问题,因为每一个活动有一个不同的用户。出于开发的目的,要解决这

7、个问题,运行chmod777databases来准许每个人都能进入到数据库目录。将来,你必须对给予每个人的权力到一些敏感的Android条目非常谨慎才行。只给予特定的用户需要使用特定条目的权力。已经创建了数据库目录了,可以创建数据库了。使用cd命令导航到数据库目录。在数据库目录后,使用sqlite3 工具来创建数据库并命名它为friends.db,如下:# sqlite friends.db如果执行命令成功,你应当能看到一个SQLite3版本信息,本例是3.5.0,和一个 SQLite3 promptsqlite。这说明数据库已被建立但是是空的。数据库没有包含表格和数据。记住,下一步是为活动数

8、据创建一个表格。你需要创建一个名为friends的表格。这个表将保留id,name,location,created, 和 modified 字段。这些字段将为你的项目提供足够的信息。提示如果你对SQLite不熟悉,一个SQLite命令必须以分号结束。如果你想要跨越一个命令这个会有帮助。没有终止SQLite命令的情况下,按下ENTER键会继续给你一个提示符,。你不能在提示符继续输入命令,除非你使用分号。一旦分号被使用,SQLite将把连续的命令作为一个完整的命令。要在数据库内创建friends表格,在sqlite提示符输入下列命令:CREATE TABLE friends (_id INTEG

9、ER PRIMARY KEY, name TEXT, location TEXT, created INTEGER, modified INTEGER);如果命令执行成功,将返回到sqlite提示符,如下图所示(略)。数据库现在可以被使用了,你可以退出SQLite了。使用.exit来退出。然后可以退出shell部分返回到Eclipse.创建数据库是创建应用程序的第一步。现在数据库和相应的表格已经被创建,你需要一个方法来存储数据。受雇Android数据的存储方式是一个Content Provider。下面的部分带你走进如何为新数据库创建一个定制Content Provider并存储数据。创建一个

10、定制的Content Provider创建一个定制的Content Provider 第十一章(3)Android使用ContentProvider来存储数据。你在第九章使用过ContentProvider存储并从一个GPS中读取坐标信息。同样的过程应用于数据库。有这样一些Content Provider ContactLists,IMs,和 Recent Calls。总之,没有为你数据库准备的ContentProvider。Android是非常之灵活并且允许你为定制的数据创建定制的ContentProvider。在本节,将创建一个和Friends数据工作的ContentProvider。这是

11、存取friend数据和最终在屏幕上显示它们的关键所在。下一节,让我们来编辑string.xml文件。这个文件保留全局遍及活动的字符串内容。编辑string.xml文件 首先,为项目编辑string.xml文件。string.xml文件由每个项目创建但是你还没有使用过它。这个文件保留可以在活动中使用的静态字符串。通常,你不大可能在写这些字符串之前仔细查看所有的部分。那就是,当你构造活动时,你通常增加到string.xml的入口。因为那样会打断本书的流程,所以我预先给你所有string.xml文件的所有内容。编辑string.xml文件使它看上去像这样: FindAFriend Delete Ad

12、d Friend Find Friends Revert Discard Edit location Edit name Create Friend Edit Friend Friends Location Friend Name: OK Error Error loading note 完成string.xml文件后,需要创建一个.java文件来保留你的代码。应该命名这个文件为FriendsProvider.java。还要创建另外一个.java文件来保留数据定义。命名这个文件为Friends.java,因为它会定义一个Friends数据结构像什么样子并且允许你的Content Provide

13、r正常进入。(因为provider将会是项目中的一个类,没有必要来构建一个相应的.xml布局文件)。提示技术上,对于应用程序,你定制的ContentProvider不需要定居在同一项目或包装内作为代码的剩余部分。为了简单明了,我在FindAFriend项目里做了一个类。假如你计划创建一个可能用户多重项目的ContentProvider,在单独的包装中创建它吧。这样,当你只想要使用ContentProvider时,会允许你呼叫一个包装。让我们开始Friends.java文件。你只要为相关的类需要输入两个包装:import .Uri; import android.provider.BaseCol

14、umns;BaseColumns将被一个从主Friends类中的subclass执行。命名这个subclass为Friend,因为它代表Friends数据集中的一个friend。下面的代码显示如何设置类的概要:public final class Friends public static final class Friend implements BaseColumns 这个类将保留一下静态变量,它们定义Friends数据库中的每一列,Content URI,和记录的默认排序。提示Content URI被用于识别将要处理的内容。这个数值必须唯一。需要定义的字符串如下:public stati

15、c final Uri CONTENT_URI = Uri.parse(content:/android_programmers_guide.FindAFriend.Friends/friend); public static final String DEFAULT_SORT_ORDER = modified DESC; public static final String NAME = name; public static final String LOCATION = location; public static final String CREATED_DATE = created

16、; public static final String MODIFIED_DATE = modified; 有了变量的设定以后,Friends类放在一起应该是这样的:package android_programmers_guide.FindAFriend; import .Uri; import android.provider.BaseColumns; public final class Friends public static final class Friend implements BaseColumns public static final Uri CONTENT_URI

17、= Uri.parse(content:/android_programmers_guide.FindAFriend.Friends/friend); public static final String DEFAULT_SORT_ORDER = modified DESC; public static final String NAME = name; public static final String LOCATION = location; public static final String CREATED_DATE = created; public static final St

18、ring MODIFIED_DATE = modified; 创建Content Provider创建Content Provider 第十一章(4)使用Eclipse打开将会成为项目Content Provider的FriendsProvider.java文件。你将要在活动中使用这个定制的Content Provider来从Friends数据库中检索数据。和往常一样。让我们从导入文件开始。你需要输入Friends类和一些其它的类:import android_programmers_guide.FindAFriend.Friends; import android.content.*; im

19、port android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import .Uri; import android.text.TextUtils; import android.util.Log; import java.util

20、.HashMap;如你所见,你输入类的大多数和SQL打交道。当你用这些包装的时候,我再向你解释。第一个将要使用的包装是android.content。要成为一个ContentProvider,需要利用并优先要求的方法,你的FriendsProvider类需要扩展ContentProvider。看一下下面类的概要,它们包括一些将要使用在Provider的变量定义:public class FriendsProvider extends ContentProvider private SQLiteDatabase mDB; private static final String TAG = Fri

21、endsProvider; private static final String DATABASE_NAME = friends; private static final int DATABASE_VERSION = 2; private static HashMap FRIENDS_PROJECTION_MAP; private static final int FRIENDS = 1; private static final int FRIENDS_ID = 2; private static final UriMatcher URL_MATCHER;Content Provider

22、包含一些需要优先的方法,包括onCreate( ), query( ), insert( ),delete(), 和update( )。因为这些方法将被活动使用Content Provider呼叫,你必须优先使用它们来进入Friends数据库。你将优先onCreate( ) 方法呼叫一个SQLiteOpenHelper。因此,在能优先ContentProvider的onCreate()之前,你不得不创建一个类扩展SQLiteIpenHelper。代码块跟从的是一个Content Provider的子类。它扩展SQLiteOpenHelper:private static class Datab

23、aseHelper extends SQLiteOpenHelper Override public void onCreate(SQLiteDatabase db) db.execSQL(CREATE TABLE friends (_id INTEGER PRIMARY KEY, + name TEXT, + location TEXT, + created INTEGER, + modified INTEGER + );); Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) L

24、og.w(TAG, Upgrading database from version + oldVersion + to + newVersion + , which will destroy all old data); db.execSQL(DROP TABLE IF EXISTS friends); onCreate(db); 刚创建的DatabaseHelper类包含两个优先方法:onCreater()和onUpgrade()。onCreate()方法被用于当从代码中创建数据库,或者表格定义不存在的示例中。注意假定你从adb壳中创建数据库结构,你不会依赖于DatabaseHelper的o

25、nCreate()方法来建立你的数据库。DatabaseHelper类创建后,你现在可以为Content Provider优先onCreate()方法了:Override public boolean onCreate() DatabaseHelper dbHelper = new DatabaseHelper(); mDB = dbHelper.openDatabase(getContext(), DATABASE_NAME, null, DATABASE_VERSION); return (mDB = null) ? false : true; 这是个非常之简单的方法,结果就是返回一个布尔

26、值代表你的数据库是否可以被打开。你使用在兄弟类中创建的SQLiteOpenHelper来打开Friends数据库。注意你传递数据库名称到DatabaseHelper类。如果数据库对象mDB返回的不是null,然后数据库就成功的被打开并可以查询了。下一步,优先ContentProvider类的query()方法。这将是Content Provider的主要部分。query()方法是从活动通过Content Provider被呼叫来从数据库中获得记录。看下优先版本的query()方法代码:Override public Cursor query(Uri url, String projection

27、, String selection, String selectionArgs, String sort) SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); switch (URL_MATCHER.match(url) case FRIENDS: qb.setTables(friends); qb.setProjectionMap(FRIENDS_PROJECTION_MAP); break; case FRIENDS_ID: qb.setTables(friends); qb.appendWhere(_id= + url.getPathSe

28、gments().get(1); break; default: throw new IllegalArgumentException(Unknown URL + url); String orderBy; if (TextUtils.isEmpty(sort) orderBy = Friends.Friend.DEFAULT_SORT_ORDER; else orderBy = sort; Cursor c = qb.query(mDB, projection, selection, selectionArgs, null, null, orderBy); c.setNotification

29、Uri(getContext().getContentResolver(), url); return c; query()方法做了一点家务管理之类的事宜,通过检查传递到其中的数据库URL的有效性和定义一个查询分类序列达到的。URL检查是为了确保你只是要进入Friends数据库。如果你试图从其它活动进入数据库,或者从其它的Content Provider,query()方法投递一个例外。到方法的结尾,你使用SQLiteQueryBuilder来执行一个查询。通过下面的代码,导致的数据集被赋值到一个光标:Cursor c = qb.query(mDB, projection, selection, selectionArgs, null, null, or

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1