移动编程课件 第8章 数据存储与访问

上传人:cl****1 文档编号:568565973 上传时间:2024-07-25 格式:PPT 页数:158 大小:830.50KB
返回 下载 相关 举报
移动编程课件 第8章 数据存储与访问_第1页
第1页 / 共158页
移动编程课件 第8章 数据存储与访问_第2页
第2页 / 共158页
移动编程课件 第8章 数据存储与访问_第3页
第3页 / 共158页
移动编程课件 第8章 数据存储与访问_第4页
第4页 / 共158页
移动编程课件 第8章 数据存储与访问_第5页
第5页 / 共158页
点击查看更多>>
资源描述

《移动编程课件 第8章 数据存储与访问》由会员分享,可在线阅读,更多相关《移动编程课件 第8章 数据存储与访问(158页珍藏版)》请在金锄头文库上搜索。

1、第第8章章 数据存储和访问数据存储和访问敢溢琳舒硬胰踞玖秘狐走呀环矢猴蝗遵腿芝捻苹偿稳棚凤娘焦涡嗽鲁忧娄移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问本章学习目标:n掌握SharedPreferences的使用方法n掌握各种文件存储的区别与适用情况n了解SQLite数据库的特点和体系结构n掌握SQLite数据库的建立和操作方法n理解ContentProvider的用途和原理n掌握ContentProvider的创建与使用方法由了狰可彩冷汝膨填彩继冲刀腿强寨肖独拽庸漏昔靴增柏莽荆腿姐间符宴移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简

2、单存储 n8.1.1 SharedPreferencesqSharedPreferences是一种轻量级的数据保存方式q通过SharedPreferences可以将NVP(Name/Value Pair,名称/值对)保存在Android的文件系统中,而且SharedPreferences完全屏蔽的对文件系统的操作过程q开发人员仅是通过调用SharedPreferences对NVP进行保存和读取母诱瘸虞针状坛营筋俊疡须绘缀伟蚕埂抠道豁田抵币摊写棵骑赞莲后纲议移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储 n8.1.1 SharedPreferencesq

3、SharedPreferences不仅能够保存数据,还能够实现不同应用程序间的数据共享qSharedPreferences支持三种访问模式n私有(MODE_PRIVATE):仅有创建程序有权限对其进行读取或写入n全局读(MODE_WORLD_READABLE):不仅创建程序可以对其进行读取或写入,其他应用程序也读取操作的权限,但没有写入操作的权限n全局写(MODE_WORLD_WRITEABLE):创建程序和其他程序都可以对其进行写入操作,但没有读取的权限滔帚谢正抛弧头丸憋抡香郧充丹睬全致颜啤接浩妖捧源拘涯稻注普醛钓原移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.

4、1 简单存储 n8.1.1 SharedPreferencesq在使用SharedPreferences前,先定义SharedPreferences的访问模式q下面的代码将访问模式定义为私有模式q有的时候需要将SharedPreferences的访问模式设定为即可以全局读,也可以全局写,这样就需要将两种模式写成下面的方式public static int MODE = MODE_PRIVATE;public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;撞泵坎袱明荒御页嚣苏频洲撅住糠缆免

5、傲以斜检拥摆弟饲怀孤畦改罢赋晒移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储 n8.1.1 SharedPreferencesq定义SharedPreferences的名称,这个名称与在Android文件系统中保存的文件同名。因此,只要具有相同的SharedPreferences名称的NVP内容,都会保存在同一个文件中q为了可以使用SharedPreferences,需要将访问模式和SharedPreferences名称作为参数,传递到getSharedPreferences()函数,并获取到SharedPreferences对象public stat

6、ic final String PREFERENCE_NAME = SaveSetting;SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE);涅硬找礁葱洪借社寺箭沾喘捣低乒转钝帅望税播冲畴捞透茵舆季需扁狂笋移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储 n8.1.1 SharedPreferencesq在获取到SharedPreferences对象后,则可以通过SharedPreferences.Editor类对SharedPreferen

7、ces进行修改,最后调用commit()函数保存修改内容qSharedPreferences广泛支持各种基本数据类型,包括整型、布尔型、浮点型和长型等等1.SharedPreferences.Editor editor = sharedPreferences.edit();2.editor.putString(Name, Tom);3.editor.putInt(Age, 20);4.editor.putFloat(Height, );mit();寞茹仓板石怎蹬绷羞徒凯感寂裹轧未镜根枫辣府锋颓飞豌渔磁屡斋苦鸡羞移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单

8、存储 n8.1.1 SharedPreferencesq如果需要从已经保存的SharedPreferences中读取数据,同样是调用getSharedPreferences()函数,并在函数的第1个参数中指明需要访问的SharedPreferences名称,最后通过get()函数获取保存在SharedPreferences中的NVPqget()函数的第1个参数是NVP的名称q第2个参数是在无法获取到数值的时候使用的缺省值1.SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE);2.St

9、ring name = sharedPreferences.getString(Name,Default Name);3.int age = sharedPreferences.getInt(Age, 20);4.float height = sharedPreferences.getFloat(Height,);裤碰珐东褐掣治析疙勾搐雏雾皑煎野佳兢液狠崎抡即了疚滦汹帕蓉得敞嫌移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储 n8.1.2 示例q通过SimplePreferenceDemo示例介绍具体说明SharedPreferences的文件保存位置和

10、保存格式q下图是SimplePreferenceDemo示例的用户界面n用户在界面上的输入的信息,将通过SharedPreferences在Activity关闭时进行保存。当应用程序重新开启时,保存在SharedPreferences的信息将被读取出来,并重新呈现在用户界面上迢丈翠缠瀑事埔稍菊惋郝俱帧篮掉仆佐仪弧捷劣沾植溪召紫菌宦频卢魂朽移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储n8.1.2 示例qSimplePreferenceDemo示例运行后,通过FileExplorer查看/data/data下的数据,Android为每个应用程序建立了与包

11、同名的目录,用来保存应用程序产生的数据,这些数据包括文件、SharedPreferences文件和数据库等qSharedPreferences文件就保存在/data/data/shared_prefs目录下辈聚史好供楞喇侮缚揭鹰矗氏姚糯睫凸烽斜棱桔还胖涨锣渣粱晓擦直看孝移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储n8.1.2 示例q在本示例中,shared_prefs目录下生成了一个名为SaveSetting.xml的文件q这个文件就是保存SharedPreferences的文件,文件大小为170字节,在Linux下的权限为“-rw-rw-rw”顽织

12、贮芝榆饭务茅剖球寄柑虏烫父辑谢撵请料恬岔骋钩因声鳃堂叛岁盒艳移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储n8.1.2 示例q在Linux系统中,文件权限分别描述了创建者、同组用户和其他用户对文件的操作限制。x表示可执行,r表示可读,w表示可写,d表示目录,-表示普通文件。因此,“-rw-rw-rw”表示SaveSetting.xml可以被创建者、同组用户和其他用户进行读取和写入操作,但不可执行q产生这样的文件权限与程序人员设定的SharedPreferences的访问模式有关,“-rw-rw-rw”的权限是“全局读+全局写”的结果q如果将Shared

13、Preferences的访问模式设置为私有,则文件权限将成为“-rw-rw -”,表示仅有创建者和同组用户具有读写文件的权限鸡峦洁描癌端寂均昭抢饶酿钳酣崔钩叭模查页框找细伯垫焰韵冰期硬狼柿移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储n8.1.2 示例qSaveSetting.xml文件是以XML格式保存的信息,内容如图如下1.2.3.4.Tom5.6.饮馏恿也势昼咙部倡彰邢灰空滤亦消肛暑巡弘肄承偶米谱辰禄拿缩每尤箭移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储n8.1.2 示例qSimplePreferenc

14、eDemo示例在onStart()函数中调用loadSharedPreferences()函数,读取保存在SharedPreferences中的姓名、年龄和身高信息,并显示在用户界面上q当Activity关闭时,在onStop()函数调用saveSharedPreferences(),保存界面上的信息qSimplePreferenceDemo.java的完整代码1.package edu.hrbeu.SimplePreferenceDemo;2. 3.import android.app.Activity;4.import android.content.Context;5.import an

15、droid.content.SharedPreferences;6.import android.os.Bundle;7.import android.widget.EditText;叁篷挤闽爷谋狸砖掺约峭螟步跌锁允僵佑屋豢巢辆狭挣郧糊蘑喇馁晓持给移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储n8.1.2 示例8. 9.public class SimplePreferenceDemo extends Activity 10. 11.private EditText nameText;12.private EditText ageText;13.pri

16、vate EditText heightText;14.public static final String PREFERENCE_NAME = SaveSetting;15.public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;16. 17.Override18.public void onCreate(Bundle savedInstanceState) 19.super.onCreate(savedInstanceState);20.setContentView(R.layo

17、ut.main);21.nameText = (EditText)findViewById(R.id.name);22.ageText = (EditText)findViewById(R.id.age);23.heightText = (EditText)findViewById(R.id.height);24.功芽铀饺茸概北典靖盎束湛随悲一寡盅冲嫩疤拆绝孝纯搂绅霹壕葱莎啦评移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储n8.1.2 示例25. 26. Override27.public void onStart()28.super.onStart(

18、);29.loadSharedPreferences();30.31.Override32.public void onStop()33.super.onStop();34.saveSharedPreferences();35.36. 37.private void loadSharedPreferences()38. SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE);39.String name = sharedPreferences.getString(Name,Tom);40

19、.int age = sharedPreferences.getInt(Age, 20);41.float height = sharedPreferences.getFloat(Height,);锯佬辞告拐疙掐倪蠕穗膳郑鸿取嘴搀护谦勤弗音三退苇作裴描它膛豪谐纹移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储n8.1.2 示例42. 43. nameText.setText(name);44.ageText.setText(String.valueOf(age);45.heightText.setText(String.valueOf(height);

20、46.47. 48. private void saveSharedPreferences()49.SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE);50.SharedPreferences.Editor editor = sharedPreferences.edit();51. 52.editor.putString(Name, nameText.getText().toString();53.editor.putInt(Age, Integer.parseInt(ageText

21、.getText().toString();54.editor.putFloat(Height, Float.parseFloat(heightText.getText().toString();mit();56.57.睦难榔病幂早淆检巴阿悸恳沮看爵灌荡门辗特右否养锋乘娇风钞筑鹅膀授移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储n8.1.2 示例q示例SharePreferenceDemo将说明如何读取其他应用程序保存的SharedPreferences数据q下图是SharePreferenceDemo示例的用户界面q示例将读取SimplePrefer

22、enceDemo示例保存的信息,并在程序启动时显示在用户界面上扛茸镊诣稳措堆巳擂钓坯门道柳出扦易仑稼拱侵崎杉兹肩柯顽餐味卤鸣损移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储n8.1.2 示例q下面给出SharePreferenceDemo示例的核心代码1.public static final String PREFERENCE_PACKAGE = edu.hrbeu.SimplePreferenceDemo;2.public static final String PREFERENCE_NAME = SaveSetting;3.public stat

23、ic int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;4. 5.public void onCreate(Bundle savedInstanceState) 6.Context c = null;7.try 8.c = this.createPackageContext(PREFERENCE_PACKAGE, Context.CONTEXT_IGNORE_SECURITY);9. catch (NameNotFoundException e) 10.e.printStackTrace();11.12.

24、SharedPreferences sharedPreferences = c.getSharedPreferences(PREFERENCE_NAME, MODE);穴宰暴错利近惧物浸瓤诺滑宁穴锭塑愉照酒康芍贞扩矗泌邢悸稼想播耿事移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储n8.1.2 示例n第8行代码调用了createPackageContext()获取到了SimplePreferenceDemo示例的Contextn第8行代码第1个参数是SimplePreferenceDemo的包名称,在代码第1行进行了定义n第2个参数Context.CONT

25、EXT_IGNORE_SECURIT表示忽略所有可能产生的安全问题。这段代码可能引发异常,因此必须防止在try/catch中13. String name = sharedPreferences.getString(Name,Tom);14.int age = sharedPreferences.getInt(Age, 20);15.float height = sharedPreferences.getFloat(Height,);16. 会耻铣满瞧他灰躺禹仍共加靠献嚼周载腻拔够刁遇事焦驰妒阔穿居雇吏裙移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.1 简单存储n

26、8.1.2 示例n在代码第12行,通过Context得到了SimplePreferenceDemo示例的SharedPreferences对象,同样在getSharedPreferences()函数中,需要将正确的SharedPreferences名称传递给函数q访问其他应用程序的SharedPreferences必须满足三个条件n共享者需要将SharedPreferences的访问模式设置为全局读或全局写n访问者需要知道共享者的包名称和SharedPreferences的名称,以通过Context获得SharedPreferences对象n访问者需要确切知道每个数据的名称和数据类型,用以正确

27、读取数据隶贬褒疗瓶棵磺窑紫娩兑胳们咎硅夜很蜜驾躬逢药替消食敏眶初逊纲赛鹅移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储nAndroid使用的是基于Linux的文件系统,程序开发人员可以建立和访问程序自身的私有文件,也可以访问保存在资源目录中的原始文件和XML文件,还可以在SD卡等外部存储设备中保存文件镰催愿汤黄呐尸崇绕悉积优抛熄淋枚颧勺涩鄙茂叁俱广邓状番盘轰道螺愚移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储q Android系统允许应用程序创建仅能够自身访问的私有文件,文件保存在设备的内

28、部存储器上,在Linux系统下的/data/data/files目录中qAndroid系统不仅支持标准Java的IO类和方法,还提供了能够简化读写流式文件过程的函数q主要介绍的两个函数nopenFileOutput()nopenFileInput()越钨眯聪韭骗眶邦僵政晒毙疟谨邹诛葫肠蛰杠轿翌破趁私琢条稗汗步凡眠移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储qopenFileOutput()函数nopenFileOutput()函数为写入数据做准备而打开的应用程序私文件,如果指定的文件不存在,则创建一个新的文件nopenFileO

29、utput()函数的语法格式如下q第1个参数是文件名称,这个参数不可以包含描述路径的斜杠q第2个参数是操作模式n函数的返回值是FileOutputStream类型public FileOutputStream openFileOutput(String name, int mode)垮沂宣鱼医砂蓝债滁贯藤德丈嗅趋炉妆溜呸奇粱钠吼梗槛复朱蛛茄哪恫殆移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储qopenFileOutput()函数nAndroid系统支持四种文件操作模式模式模式说明说明MODE_PRIVATE私有模式,缺陷模式,文件

30、仅能够被文件创建程序访问,或具有相同UID的程序访问。MODE_APPEND追加模式,如果文件已经存在,则在文件的结尾处添加新数据。MODE_WORLD_READABLE全局读模式,允许任何程序读取私有文件。MODE_WORLD_WRITEABLE全局写模式,允许任何程序写入私有文件。蚁返汐仁牢喝冲穿烽具谭繁杠埂当欠吨盆剩勾婚贤旁舔廊改兴冠件庄于环移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储qopenFileOutput()函数n使用openFileOutput()函数建立新文件的示例代码如下q第1行代码定义了建立文件的名称fi

31、leDemo.txtq第2行代码使用openFileOutput()函数以私有模式建立文件q第4行代码调用write()函数将数据写入文件q第5行代码调用flush()函数将所有剩余的数据写入文件q第6行代码调用close()函数关闭FileOutputStream1.String FILE_NAME = fileDemo.txt;2.FileOutputStream fos = openFileOutput(FILE_NAME,Context.MODE_PRIVATE)3.String text = “Some data”;4.fos.write(text.getBytes();5.fos.

32、flush();6.fos.close();寓阂妨蜡虐均龄舌彰清壮楞进锣抱解抡埔徊帅哎艳郴敦揪寡爸衡窃犯渔刺移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储qopenFileOutput()函数n为了提高文件系统的性能,一般调用write()函数时,如果写入的数据量较小,系统会把数据保存在数据缓冲区中,等数据量累积到一定程度时再一次性的写入文件中n由上可知,在调用close()函数关闭文件前,务必要调用flush()函数,将缓冲区内所有的数据写入文件燕麦氮跨艘网胯去悟间秧缩俭真浊饭彰星谢潞瘴严牙硷窄芒疗龋子枪遁畏移动编程课件 第8章

33、 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储qopenFileInput()函数nopenFileInput()函数为读取数据做准备而打开应用程序私文件nopenFileInput()函数的语法格式如下q第1个参数也是文件名称,同样不允许包含描述路径的斜杠public FileInputStream openFileInput (String name)酵住沾刮坤厦植颤篇序直杏碗婪坛醇唾睹浇愉誉绕裙岔馁甩阳话仕函晓系移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储qopenFileInp

34、ut()函数n使用openFileInput ()函数打开已有文件的示例代码如下n上面的两部分代码在实际使用过程中会遇到错误提示,因为文件操作可能会遇到各种问题而最终导致操作失败,因此代码应该使用try/catch捕获可能产生的异常1.String FILE_NAME = fileDemo.txt;2.FileInputStream fis = openFileInput(FILE_NAME);3. 4.byte readBytes = new bytefis.available();5.while(fis.read(readBytes) != -1)6.障擅扁晒俯蛀迫瘴唾酮磨吗件挑辨怎改芦柔

35、享稚宴跃嵌年莱亨腆彪菠租雇移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储qInternalFileDemo示例用来演示在内部存储器上进行文件写入和读取qInternalFileDemo示例用户界面如图锭尾枕姚绪掸糕铡牢靖藉捎守差涉讯该秋魄汇月坷妻柿谣晌军凳恋帕亭哩移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储qInternalFileDemo示例的核心代码1.OnClickListener writeButtonListener = new OnClickListen

36、er() 2.Override3.public void onClick(View v) 4.FileOutputStream fos = null;5.try 6. if (appendBox.isChecked()7. fos = openFileOutput(FILE_NAME,Context.MODE_APPEND);8. else 9. fos = openFileOutput(FILE_NAME,Context.MODE_PRIVATE);10. 11.String text = entryText.getText().toString();12.fos.write(text.ge

37、tBytes();13.labelView.setText(文件写入成功,写入长度:+text.length();14.entryText.setText();15. catch (FileNotFoundException e) 初绎穿窿高近浇注藻重戳叶腐懒峪煮战恨巷归禽汇砂抄寡立筹皱避塞霜垂移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储16. e.printStackTrace();17.18.catch (IOException e) 19.e.printStackTrace();20.21.finally22.if (fo

38、s != null)23.try 24.fos.flush();25.fos.close();26. catch (IOException e) 27.e.printStackTrace();28.29.30.31.32.;烫播笨龚牟资伯钎埠疵涅烯揭犬腹诚牛氨搐出涣孽蚁属敝郧足舞墅桃台曳移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储33.OnClickListener readButtonListener = new OnClickListener() 34.Override35. public void onClick(View

39、 v) 36. displayView.setText();37. FileInputStream fis = null;38. try 39. fis = openFileInput(FILE_NAME);40. if (fis.available() = 0)41. return;42. 43. byte readBytes = new bytefis.available();44. while(fis.read(readBytes) != -1)45. 46. String text = new String(readBytes);47. displayView.setText(text

40、);48. labelView.setText(文件读取成功,文件长度:+text.length();49. catch (FileNotFoundException e) 澄栅等眨反嘲留癸彦崔距年焊寞颊反没厦栖乌审戈寿疥汪她执尤庄误躁誊移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储q程序运行后,在/data/data/edu.hrbeu.InternalFileDemo/files/目录下,找到了新建立的fileDemo.txt文件50. e.printStackTrace();51.52.catch (IOException

41、e) 53.e.printStackTrace();54.55.56.;绑水瞅淮滋拔洛催斟郎哟购滥科因笋敦侮员蓑忍巴放指豹植净挽汕弯皿将移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.1 内部存储qfileDemo.txt文件nfileDemo.txt从文件权限上进行分析,“-rw-rw-”表明文件仅允许文件创建者和同组用户读写,其他用户无权使用n文件的大小为9个字节,保存的数据为“Some data”习捡掷午痹腥哥场凯捐孕皿邀敌聋垮歹刷铂汇敬淀驴若芥剂淖坊耸褒犯绩移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2

42、文件存储n8.2.2 外部存储qAndroid的外部存储设备指的是SD卡(Secure Digital Memory Card),是一种广泛使用于数码设备上的记忆卡q不是所有的Android手机都有SD卡,但Android系统提供了对SD卡的便捷的访问方法订冀拨栈艳楞距酪靖垛丧赣唐杰淳墨缨赡敖泻悉尿段浴拔生槽连予青探兑移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.2 外部存储qSD卡适用于保存大尺寸的文件或者是一些无需设置访问权限的文件,可以保存录制的大容量的视频文件和音频文件等qSD卡使用的是FAT(File Allocation Tabl

43、e)的文件系统,不支持访问模式和权限控制,但可以通过Linux文件系统的文件访问权限的控制保证文件的私密性qAndroid模拟器支持SD卡,但模拟器中没有缺省的SD卡,开发人员须在模拟器中手工添加SD卡的映像文件到薪堡摩刘于爬镜美溶苏焙梢墓坍葡引腕售筑子谋填窃棵纺嗽炎涸氏欧交移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.2 外部存储q使用/tools目录下的mksdcard工具创建SD卡映像文件,命令如下n第1个参数-1表示后面的字符串是SD卡的标签,这个新建立的SD卡的标签是SDCARDn第2个参数256M表示SD卡的容量是256兆n最后一

44、个参数表示SD卡映像文件的保存位置,上面的命令将映像保存在E:android目录下sdcard_file文件中。在CMD中执行该命令后,则可在所指定的目录中找到生产的SD卡映像文件mksdcard -l SDCARD E:androidsdcard_file狡驮认岂聚涩瘪澎整伊直锌诞痊胀骆狗芽长睁欣唉愉牌最浦傀及侨捞由贼移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.2 外部存储q如果希望Android模拟器启动时能够自动加载指定的SD卡,还需要在模拟器的“运行设置”(Run Configurations)中添加SD卡加载命令qSD卡加载命令中

45、只要指明映像文件位置即可qSD卡加载命令鄂屿钡迢柄袍剁郎却掸怎径脏瓦赏芭垃轧焰块遁湃骡纂作亦火趾胚勇氓辉移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.2 外部存储q测试SD卡映像是否正确加载q在模拟器启动后,使用FileExplorer向SD卡中随意上传一个文件,如果文件上传成功,则表明SD卡映像已经成功加载q向SD卡中成功上传了一个测试文件test.txt,文件显示在/sdcard目录下窄袱焉球崖院均蔚述兽攘持盾掳癣猾峻美名子魁淫这载脏酥扣肇避哟稚膘移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8

46、.2.2 外部存储q编程访问SD卡n首先需要检测系统的/sdcard目录是否可用n如果不可用,则说明设备中的SD卡已经被移除,在Android模拟器则表明SD卡映像没有被正确加载n如果可用,则直接通过使用标准的Java.io.File类进行访问q将数据保存在SD卡n通过“生产随机数列”按钮生产10个随机小数n通过“写入SD卡”按钮将生产的数据保存在SD卡的目录下nSDcardFileDemo示例说明了如何将数据保存在SD卡察悦氯豌元卉茂伤腆罕藉顽蝉火酬腮芝蝇显滴拯屎骄臭灼茅恶驴帛颊刁森移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.2 外部存储

47、q下图是SDcardFileDemo示例的用户界面美适貉时完姑程梨星肄谎为侵草棺睛窖稀赊韧尉脚泉官沃武饼腰普意垄瞻移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.2 外部存储qSDcardFileDemo示例运行后,在每次点击“写入SD卡”按钮后,都会在SD卡中生产一个新文件,文件名各不相同qSD卡中生产的文件帘闭伺串吓育纺猛妓余雄甭遂哩哮扮勘质册悦沦蛰绸胁称俊倒届掂郁郑抉移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.2 外部存储qSDcardFileDemo示例与InternalFileDe

48、mo示例的核心代码比较相似qSDcardFileDemo示例与InternalFileDemo示例的不同之处n第7行代码中添加了/sdcard目录存在性检查n第8行代码使用“绝对目录+文件名”的形式表示新建立的文件n第12行代码写入文件前对文件存在性和可写入性进行检查n第5行代码为了保证在SD卡中多次写入时文件名不会重复,在文件名中使用了唯一且不重复的标识,这个标识通过调用System.currentTimeMillis()函数获得,表示从1970年00:00:00到当前所经过的毫秒数经恰坤扣乓傅伺喉追芭泞痊询计肖朗龚蝴红韦卒沦铂寸捆逾包悸耐豆汀行移动编程课件 第8章 数据存储与访问移动编程课

49、件 第8章 数据存储与访问8.2 文件存储n8.2.2 外部存储q下面是SDcardFileDemo示例的核心代码1.private static String randomNumbersString = ;2.OnClickListener writeButtonListener = new OnClickListener() 3.Override4.public void onClick(View v) 5.String fileName = SdcardFile-+System.currentTimeMillis()+.txt; 6.File dir = new File(/sdcard

50、/);7.if (dir.exists() & dir.canWrite() 8. File newFile = new File(dir.getAbsolutePath() + / + fileName); 9. FileOutputStream fos = null;10. try 11. newFile.createNewFile();12. if (newFile.exists() & newFile.canWrite() 13. fos = new FileOutputStream(newFile); 14. fos.write(randomNumbersString.getByte

51、s(); 磋字醇瞥名侩脾层痹卒典篮析码尚件怔眉笛涩拟甫茄形劳共唉酒姐汛谚泣移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.2 外部存储15. TextView labelView = (TextView)findViewById(R.id.label);16.labelView.setText(fileName + 文件写入SD卡);17. 18. catch (IOException e) 19. e.printStackTrace();20. finally 21. if (fos != null) 22.try 23. fos.flush

52、(); 24. fos.close(); 25. 26.catch (IOException e) 27. 28. 29. 30.31.;逝沿年埔择核寐烁袋刊猾罪仟帐松绘捣莱蚀舟糟函绪育白打厩逃利叭熏盐移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.3 资源文件q程序开发人员可以将程序开发阶段已经准备好的原始格式文件和XML文件分别存放在/res/raw和/res/xml目录下,供应用程序在运行时进行访问q原始格式文件可以是任何格式的文件,例如视频格式文件、音频格式文件、图像文件和数据文件等等,在应用程序编译和打包时,/res/raw目录下的所

53、有文件都会保留原有格式不变q/res/xml目录下的XML文件,一般用来保存格式化的数据,在应用程序编译和打包时会将XML文件转换为高效的二进制格式,应用程序运行时会以特殊的方式进行访问切脊窒囚伴怪杨赤耕阔饺俱膨香赣想谊羌擒币壮亿董素永蛤体栋第台腆颂移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.3 资源文件qResourceFileDemo示例演示了如何在程序运行时访问资源文件q当用户点击“读取原始文件”按钮时,程序将读取/res/raw/raw_file.txt文件,并将内容显示在界面上质苔龟持蒸船畦徘冻畜鉴抄扇洱扎蝎呐慑儡将狠枕趣扰簿匝岔

54、单咀令嫂庶移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.3 资源文件q当用户点击“读取XML文件”按钮时,程序将读取/res/xml/people.xml文件,并将内容显示在界面上并前淀仔雁揉坠呢虚载苯便关撅秆冒做唾了焊寄事吠钵拆榜锭臻拄杂涟娇移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.3 资源文件q读取原始格式文件,首先需要调用getResource()函数获得资源对象,然后通过调用资源对象的openRawResource()函数,以二进制流的形式打开指定的原始格式文件。在读取文件结束后

55、,调用close()函数关闭文件流qResourceFileDemo示例中关于读取原始格式文件的核心代码如下1.Resources resources = this.getResources();2.InputStream inputStream = null;3.try 4.inputStream = resources.openRawResource(R.raw.raw_file); 5.byte reader = new byteinputStream.available(); 6.while (inputStream.read(reader) != -1) 7. 顾耍碰德泥哼舍拈沤蚊嫩

56、左秉稍配邪崩垫悉虐宿鞠瞎导井爱利汹凌滓回央移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.3 资源文件n代码第8行的new String(reader,utf-8),表示以UTF-8的编码方式,从字节数组中实例化一个字符串q程序开发人员需要确定/res/raw/raw_file.txt文件使用的是UTF-8编码方式,否则程序运行时会产生乱码8. displayView.setText(new String(reader,utf-8); 9. catch (IOException e) 10.Log.e(ResourceFileDemo, e.g

57、etMessage(), e); 11. finally 12.if (inputStream != null) 13.try 14.inputStream.close(); 15. 16.catch (IOException e) 17.18.耀燃崎滋钨署盒甸蚜菲剔唯难唬秉营颜舍娠唾兑快稽晋傻贴郎炒接悉名陵移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.3 资源文件q确认的方法n右击raw_file.txt文件n选择“Properties”打开raw_file.txt文件的属性设置框n在Resource栏下的Text file encodin

58、g中,选择“Other:UTF-8”陶般沂耽茸贡机显读款葫似萌姜册床池虫哲巢斥斤孵掌畏噎期年役顾矗主移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.3 资源文件q/res/xml目录下的XML文件会转换为一种高效的二进制格式q说明如何在程序运行时读取/res/xml目录下的XML文件n首先在/res/xml目录下创建一个名为people.xml的文件nXML文件定义了多个元素,每个元素都包含三个属性name、age和height,分别表示姓名、年龄和身高q/res/xml/people.xml文件代码如下1. 2. 3. 4. 5.娄赤谣怯捍椭

59、锐缸鸣巾旋韧辰铱儡厂颓经懈配衫颐愈盯擂职水惩鳞日泛递移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.3 资源文件q读取XML格式文件n首先通过调用资源对象的getXml()函数,获取到XML解析器XmlPullParsernXmlPullParser是Android平台标准的XML解析器,这项技术来自一个开源的XML解析API项目XMLPULLqResourceFileDemo示例中关于读取XML文件的核心代码如下1.XmlPullParser parser = resources.getXml(R.xml.people); 2.String

60、msg = ;3.try 4.while (parser.next() != XmlPullParser.END_DOCUMENT) 5.String people = parser.getName(); 6.String name = null; 崔殉猫畏累断垂乾雕早树控减滩甥拍返苟袋爬渝桅字奖蓖量九殖悍幼恐撬移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.2 文件存储n8.2.3 资源文件7. String age = null; 8.String height = null;9.if (people != null) & people.equals(perso

61、n) 10. int count = parser.getAttributeCount();11. for (int i = 0; i 库税信托碘耐即诫箱砷碱雁声印贸庸肥倍典昭桑约购音孩姑盘闹隐朋缅苞移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.2 手动建库q在启动sqlite3工具后,提示符从“#”变为“sqlite”,表示命令行界面进入与SQLite数据库的交互模式,此时可以输入命令建立、删除或修改数据库的内容q正确退出sqlite3工具的方法是使用.exit命令q原则上,每个应用程序的数据库都保存在各自的/data/data/data

62、bases目录下,但如果使用手工方式建立数据库,则必须手工建立数据库目录,目前版本无须修改数据库目录的权限1.sqlite .exit2.#1.# mkdir databases2.# ls l3.drwxrwxrwx root root 2009-07-18 15:43 databases4.drwxr-xr-x system system 2009-07-18 15:31 lib5.#迅惑东师汐椿栽旅场吞中啼酝井乏镑胞慢作彤颈巧蕉示谋舷滓捉胖轴托义移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.2 手动建库q在SQLite数据库中,每个数

63、据库保存在一个独立的文件中,使用sqlite3工具后加文件名的方式打开数据库文件,如果指定文件不存在,sqlite3工具则自动创建新文件q下面的代码将创建名为people的数据库,在文件系统中将产生一个名为people.db的数据库文件1.# sqlite3 people.db2.SQLite version 3.Enter “.help” for instructions4.sqlite吵圾澄楷嘿酬栈库笑散灰账桩氯挨狂拣疆皱梗线改麓糠泛俞玉抡侯著柄炊移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.2 手动建库q下面的代码在新创建的数据库中,

64、构造了一个名为peopleinfo的表,使用create table命令,关系模式为peopleinfo ( _id, name, age, height)q表包含四个属性,_id是整型的主键;name表示姓名,字符型,not null表示这个属性一定要填写,不可以为空值;age表示年龄,整数型;height表示身高,浮点型1.sqlite create table peopleinfo 2. (_id integer primary key autoincrement,3. name text not null,4. age integer,5. height float);6.sqlite

65、阜猫斩艇奄岗荚族蔚圭躲兹筷迎渭纂讫兜探机彭一绅逛巡奉堂残氦税举挥移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.2 手动建库q为了确认数据表是否创建成功,可以使用.tables命令,显示当前数据库中的所有表q从下面的代码中可以观察到,当前数据库仅有一个名为peopleinfo的表q当然,也可以使用.schema命令查看建立表时使用的SQL命令。如果当前数据库中包含多个表,则可以使用.schema 表名的形式,显示指定表的建立命令1.sqlite .tables2.poepleinfo3.sqlite1.sqlite.schema2.CREAT

66、E TABLE peopleinfo (_id integer primary key autoincrement,3.name text not null, age integer, height float);4.sqlite悄部筷彼曰噶砚性暖甲幢床赃轴拳区目斯削渐靛允典收巩沙讳廊后楞衙殃移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.2 手动建库q向peopleinfo表中添加数据,使用insert into values命令q代码运行成功后,数据库的peopleinfo表将有三条数据。因为_id是自增加的主键,因此在输入null后,S

67、QLite数据库会自动填写该项的内容1.sqlite insert into peopleinfo values(null,Tom,21,1.81);2.sqlite insert into peopleinfo values(null,Jim,22,1.78);3.sqlite insert into peopleinfo values(null,Lily,19,1.68);_id_idnamenameageageheightheight1Tom211.812Jim221.783Lily191.68思蜒坝乌泄僚横辈芭镣钠呻怨磅能戈蝇务赢赔荆郡唬抵训躺悦杭圣辱膨床移动编程课件 第8章 数据存储

68、与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.2 手动建库q在数据添加完毕后,使用select命令,显示指定数据表中的所有数据信息,命令格式为select 属性 from 表名q下面的代码用来显示peopleinfo表的所有数据1.select * from peopleinfo;2.1|Tom|21|1.813.2|Jim|22|1.784.3|Lily|19|1.685.sqlite边漠毡简焰次百聂瓷布贞乙姨革烹断猿鬃宁赊燥遣弘沪配嫂许汗旋煌姿溅移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.2 手动建库q上面的查

69、询结果看起来不是非常直观,可以使用mode命令将结果输出格式更改为“表格”方式qmode命令除了支持常见的column格式为,还支持csv格式、html格式、insert格式、line格式、list格式、tabs格式和tcl格式1.sqlite .mode column2.sqlite select * from peopleinfo;3.1 Tom 21 1.814.2 Jim 22 1.785.3 Lily 19 1.686.sqlite期祈撒精锨咯粪害樊豁胆双真杏贪松囊绒固论疽黄涟箔谭伙芬韵运域筹儡移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储

70、n8.3.2 手动建库q更新数据可以使用update命令,命令格式为update 表名 set 属性=“新值” where 条件q更新数据后,同样使用select命令显示数据,则可以确定数据是否正确更新q下面的代码将姓名为Lily数据中的高度值更新为1.881.sqlite update peopleinfo set height=1.88 where name=Lily;2.sqlite select * from peopleinfo;3.select * from peopleinfo;4.1 Tom 21 1.815.2 Jim 22 1.786.3 Lily 19 1.887.sql

71、ite贴沁糙唁肃论霞书枢刑茵糊痊完秦叛崔讼瞧搏乐敌不誊汐飞谤误粟冰鹰氮移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.2 手动建库q删除数据可以使用delete命令,命令格式为delete from 表名where 条件q下面的代码将_id为3数据从表peopleinfo中删除1.sqlite delete from peopleinfo where _id=3;2.sqlite select * from peopleinfo;3.select * from peopleinfo;4.1 Tom 21 1.815.2 Jim 22 1.78

72、6.sqlite爹默炔坊茹步嚏岳廓巴开帽屿悬粳姑隶粳县柏憎丫犹儿算砰编踏晾轨康胀移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.2 手动建库qsqlite3工具还支持大量的命令,可以使用.help命令查询sqlite3的命令列表编号编号命令命令说明说明1.bail ON|OFF遇到错误时停止,缺省为OFF2.databases显示数据库名称和文件位置3.dump ?TABLE? . 将数据库以SQL文本形式导出4.echo ON|OFF 开启和关闭回显5.exit退出6.explain ON|OFF开启或关闭适当输出模式,如果开启模式将更改为

73、column,并自动设置宽度骡愚侩祈城仆槐簧神惠翘界娇适镜糕桌巡茄契靛塑炊魏膘兑栈英粳鸡传硫移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.2 手动建库编号编号命令命令说明说明7.header(s) ON|OFF开启或关闭标题显示8.help显示帮助信息9.import FILE TABLE将数据从文件导入表中10.indices TABLE显示表中所的列名11.load FILE ?ENTRY?导入扩展库12.mode MODE ?TABLE?设置输入格式13.nullvalue STRING打印时使用STRING代替NULL14.outp

74、ut FILENAME将输入保存到文件15.output stdout 将输入显示在屏幕上16.prompt MAIN CONTINUE替换标准提示符否螟姜熏荒鸟吴色破勒贬毋骂刑赶悉活凉惋争芝钢希灌么匿挑行搓卵荒造移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.2 手动建库编号编号命令命令说明说明17.quit退出18.read FILENAME在文件中执行SQL语句19.schema ?TABLE?显示表的创建语句20.separator STRING更改输入和导入的分隔符21.show显示当前设置变量值22.tables ?PATTERN

75、?显示符合匹配模式的表名23.timeout MS尝试打开被锁定的表MS毫秒24.timer ON|OFF开启或关闭CPU计时器25.width NUM NUM .设置column模式的宽度翘蛆号句滤叁虏丈钱住爪狡镑蝶咳手等志陆廓殃垢活兵遥窄丽杏挡樟骨溅移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.3 代码建库q在代码中动态建立数据库是比较常用的方法q在程序运行过程中,当需要进行数据库操作时,应用程序会首先尝试打开数据库,此时如果数据库并不存在,程序则会自动建立数据库,然后再打开数据库q在编程实现时,一般将所有对数据库的操作都封装在一个类中

76、,因此只要调用这个类,就可以完成对数据库的添加、更新、删除和查询等操作悉窑港坠腕兜楔幢拥戳糜抖壬逗睛疑敛路座谭鞭恳妥抬查垄弧乒臆狸零葬移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.3 代码建库q下面内容是DBAdapter类的部分代码,封装了数据库的建立、打开和关闭等操作1.public class DBAdapter 2.private static final String DB_NAME = people.db;3.private static final String DB_TABLE = peopleinfo;4.private

77、static final int DB_VERSION = 1;5. 6.public static final String KEY_ID = _id;7.public static final String KEY_NAME = name;8.public static final String KEY_AGE = age;9.public static final String KEY_HEIGHT = height;10. 11.private SQLiteDatabase db;12.private final Context context;13.private DBOpenHel

78、per dbOpenHelper;板羡润敷捏伙递盲太肛秋瞪却玖蛆狭豌蘑烯卤谱娜替炊杜怖镁潮锹扒酿贾移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.3 代码建库14.15.private static class DBOpenHelper extends SQLiteOpenHelper 16. 17.public DBAdapter(Context _context) 18. context = _context;19.20. 21.public void open() throws SQLiteException 22. dbOpenHel

79、per = new DBOpenHelper(context, DB_NAME, null, DB_VERSION);23. try 24.db = dbOpenHelper.getWritableDatabase();25. catch (SQLiteException ex) 26.db = dbOpenHelper.getReadableDatabase();27. 28.29. 锄呈堤冠胜阿间汪钞凡宜焉瓤朗长输胡界蔬斥邓颂户殷涩寄诗塑崔秧膘袍移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.3 代码建库n从代码的第2行到第9行可以看出,

80、在DBAdapter类中首先声明了数据库的基本信息,包括数据库文件的名称、数据库表格名称和数据库版本,以及数据库表中的属性名称n从这些基本信息上不难发现,这个数据库与前一小节手动建立的数据库是完全相同的30. public void close() 31. if (db != null)32.db.close();33.db = null;34. 35.36.窘兔魁股蚕鼻闻翟掠悬袒帛恒伞押柿咋楚枷妮郁蒋郴忆暮鞠滓萤关脆蕉顷移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.3 代码建库n第11行代码声明了SQLiteDatabase对象db。SQ

81、LiteDatabase类封装了非常多的方法,用以建立、删除数据库,执行SQL命令,对数据进行管理等工作n第13行代码声明了一个非常重要的帮助类SQLiteOpenHelper,这个帮助类可以辅助建立、更新和打开数据库n第21行代码定义了open()函数用来打开数据库,但open()函数中并没有任何对数据库进行实际操作的代码,而是调用了SQLiteOpenHelper类的getWritableDatabase()函数和getReadableDatabase()函数。这个两个函数会根据数据库是否存在、版本号和是否可写等情况,决定在返回数据库对象前,是否需要建立数据库厌勉划果卑筹嘱滁痒谜园灸丁五匡

82、嫁辉寂席烂迸骂娄悼沫讶亭亦将沤肯拼移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.3 代码建库n在代码第30行的close()函数中,调用了SQLiteDatabase对象的close()方法关闭数据库n这是上面的代码中,唯一的一个地方直接调用了SQLiteDatabase对象的方法nSQLiteDatabase中也封装了打开数据库的函数openDatabases()和创建数据库函数openOrCreateDatabases(),因为代码中使用了帮助类SQLiteOpenHelper,从而避免直接调用SQLiteDatabase中的打开和创建

83、数据库的方法,简化了数据库打开过程中繁琐的逻辑判断过程n代码第15行实现了内部静态类DBOpenHelper,继承了帮助类SQLiteOpenHelper沂湃氢丰毛囊逃垣疑构绑怨宿册痊滓泄郑你晚之哲睦蛛飞历航俘偶网晌材移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.3 代码建库n重载了onCreate()函数和onUpgrade()函数的代码如下1.private static class DBOpenHelper extends SQLiteOpenHelper 2. public DBOpenHelper(Context context,

84、 String name, CursorFactory factory, int version)3. super(context, name, factory, version);4. 5. private static final String DB_CREATE = create table + 6. DB_TABLE + ( + KEY_ID + integer primary key autoincrement, +7. KEY_NAME+ text not null, + KEY_AGE+ integer, + KEY_HEIGHT + float);8. 9. Override1

85、0. public void onCreate(SQLiteDatabase _db) 11. db.execSQL(DB_CREATE);12. 13. 蝶趟启前巳简趾土撕貌摔谎昌枚组短苍恼裳妇压吼拙惫排姑罪拴顺控磕敷移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.3 代码建库n第5行到第7行代码的是创建表的SQL命令n第10行和第15行代码分别重载了onCreate()函数和onUpgrade()函数,这是继承SQLiteOpenHelper类必须重载的两个函数。onCreate()函数在数据库第一次建立时被调用,一般用来用来创建数据库中

86、的表,并做适当的初始化工作14. Override15.public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion) 16._db.execSQL(DROP TABLE IF EXISTS + DB_TABLE);17.onCreate(_db);18.19.桂掀尾瘫脖臼紊匿侄素旗鲁胰由篡蕴衬犬袍拿失碱姆挤诉砂速际抠帕技采移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.3 代码建库n在代码第11行中,通过调用SQLiteDatabase对象的execSQ

87、L()方法,执行创建表的SQL命令。onUpgrade()函数在数据库需要升级时被调用,一般用来删除旧的数据库表,并将数据转移到新版本的数据库表中n第16行和第17行代码中,为了简单起见,并没有做任何的的数据转移,而仅仅删除原有的表后建立新的数据库表乎九衙防探韵幂受齿退卒挝舶晰嘲材绑欺峪谰媒僚祟真挣惯瀑廖刁歼榷拐移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.3 代码建库n程序开发人员不应直接调用onCreate()和onUpgrade()函数,而应该由SQLiteOpenHelper类来决定何时调用这两个函数nSQLiteOpenHelpe

88、r类的getWritableDatabase()函数和getReadableDatabase()函数是可以直接调用的函数ngetWritableDatabase()函数用来建立或打开可读写的数据库对象,一旦函数调用成功,数据库对象将被缓存,任何需要使用数据库对象时,都可以调用这个方法获取到数据库对象,但一定要在不使用时调用close()函数关闭数据库n如果保存数据库文件的磁盘空间已满,调用getWritableDatabase()函数则无法获得可读写的数据库对象,这时可以调用getReadableDatabase()函数,获得一个只读的数据库对象褂蜜偿桶股轴侥懈福安郧腥哩谩孺坦搀淡娇鼠定连社惰

89、敞林弗曙苔服歧葡移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.3 代码建库q如果程序开发人员不希望使用SQLiteOpenHelper类,同样可以直接创建数据库n首先调用openOrCreateDatabases()函数创建数据库对象n然后执行SQL命令建立数据库中的表和直接的关系n示例代码如下1.private static final String DB_CREATE = create table + 2.DB_TABLE + ( + KEY_ID + integer primary key autoincrement, +3.KEY_

90、NAME+ text not null, + KEY_AGE+ integer, + KEY_HEIGHT + float);4.public void create() 5.db.openOrCreateDatabases(DB_NAME, context.MODE_PRIVATE, null)6.db.execSQL(DB_CREATE);7.题伤惯怎井鳖走梧藻砸画并妇阑颠记霹历淬湃吩甫邦尧恍诧眩纷哨滚观毋移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作q数据操作是指对数据的添加、删除、查找和更新的操作q通过执行SQL命名完成

91、数据操作,但推荐使用Android提供的专用类和方法,这些类和方法更加简洁、易用q为了使DBAdapter类支持对数据的添加、删除、更新和查找等功能,在DBAdapter类中增加下面的这些函数ninsert(People people)用来添加一条数据nqueryAllData()用来获取全部数据nqueryOneData(long id)根据id获取一条数据ndeleteAllData()用来删除全部数据ndeleteOneData(long id)根据id删除一条数据nupdateOneData(long id , People people)根据id更新一条数据熊激活拼沸炬政啄缕棕俏窍皖

92、夹蜜墩舷鼓捻烫竹煽仕绍蕊琉犬戳膘煌磨椭移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作nConvertToPeople(Cursor cursor)是私有函数,作用是将查询结果转换为用来存储数据自定义的People类对象nPeople类的包含四个公共属性,分别为ID、Name、Age和Height,对应数据库中的四个属性值n重载toString()函数,主要是便于界面显示的需要1.public class DBAdapter 2.public long insert(People people) 3.public long del

93、eteAllData() 4.public long deleteOneData(long id) 5.public People queryAllData() 6.public People queryOneData(long id) 7.public long updateOneData(long id , People people) 8. 9.private People ConvertToPeople(Cursor cursor)10.诫质乌虞艘叔压鸭多虞防蛰旷戒姆嘱胆最么印朱订履碾住硷订俊揖豺话邓移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库

94、存储n8.3.4 数据操作qPeople类的代码如下1.public class People 2.public int ID = -1;3.public String Name;4.public int Age;5.public float Height;6.7.Override8.public String toString()9.String result = ;10.result += ID: + this.ID + ,;11.result += 姓名: + this.Name + ,;12.result += 年龄: + this.Age + , ;13.result += 身高:

95、+ this.Height + ,;14.return result;15.16.崎辱胡宵恤四凤丁吭托宅庭她氨耽屉抒你湘模咐焙竣眩郸骆鳞氖罢不遮须移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作qSQLiteDatabase类的公共函数insert()、delete()、update()和query(),封装了执行的添加、删除、更新和查询功能的SQL命令q下面分别介绍如何使用SQLiteDatabase类的公共函数,完成数据的添加、删除、更新和查询等操作鄂送继皋般毁惩枢二暴琵睛法说朔迟姆聪悸提秧啼荐皆耘代擎共泡环稀蛛移动编程课件

96、第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作q添加功能n首先构造一个ContentValues对象,然后调用ContentValues对象的put()方法,将每个属性的值写入到ContentValues对象中,最后使用SQLiteDatabase对象的insert()函数,将ContentValues对象中的数据写入指定的数据库表中ninsert()函数的返回值是新数据插入的位置,即ID值。ContentValues类是一个数据承载容器,主要用来向数据库表中添加一条数据肉绸警眷涣哄狠突铜技串伴昨粥惩燥痒窜形风本史靡怎轧幂酸释司宜羔天移动编程

97、课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作q第4行代码向ContentValues对象newValues中添加一个名称/值对,put()函数的第1个参数是名称,第2个参数是值q在第8行代码的insert()函数中,第1个参数是数据表的名称,第2个参数是在NULL时的替换数据,第3个参数是需要向数据库表中添加的数据1.public long insert(People people) 2.ContentValues newValues = new ContentValues();3. 4.newValues.put(KEY_NAME,

98、 people.Name);5.newValues.put(KEY_AGE, people.Age);6.newValues.put(KEY_HEIGHT, people.Height);7. 8.return db.insert(DB_TABLE, null, newValues);9.寥恿弄赂终弘瞄煌抓唯指蛋很招儒帕邱惜勺卷鸥谁荔昨逼掳暂殉轰臭耳榷移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作q删除功能n删除数据比较简单,只需要调用当前数据库对象的delete()函数,并指明表名称和删除条件即可qdelete()函数的第1个

99、参数是数据库的表名称,第2个参数是删除条件q在第2行代码中,删除条件为null,表示删除表中的所有数据q第6行代码指明了需要删除数据的id值,因此deleteOneData()函数仅删除一条数据,此时delete()函数的返回值表示被删除的数据的数量1.public long deleteAllData() 2.return db.delete(DB_TABLE, null, null);3.4.public long deleteOneData(long id) 5.return db.delete(DB_TABLE, KEY_ID + = + id, null);6.镑港状讶塌配脾湍桑枚荒

100、龙百哮猛首赏葱誓枕疲名倡晒咒宫门哲酶桥吏粘移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作q更新功能n更新数据同样要使用ContentValues对象,首先构造ContentValues对象,然后调用put()函数将属性的值写入到ContentValues对象中,最后使用SQLiteDatabase对象的update()函数,并指定数据的更新条件q在代码的第7行中,update()函数的第1个参数表示数据表的名称,第2个参数是更新条件。update()函数的返回值表示数据库表中被更新的数据数量1.public long updat

101、eOneData(long id , People people)2.ContentValues updateValues = new ContentValues(); 3.updateValues.put(KEY_NAME, people.Name);4.updateValues.put(KEY_AGE, people.Age);5.updateValues.put(KEY_HEIGHT, people.Height);6. 7.return db.update(DB_TABLE, updateValues, KEY_ID + = + id, null);8.见畅臃撕催矢油姻钟珠挂捶耐吧显苦

102、郴虱坝句包表歪廷酷荔毡株荫迫购谜移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作q查询功能n首先介绍Cursor类。在Android系统中,数据库查询结果的返回值并不是数据集合的完整拷贝,而是返回数据集的指针,这个指针就是Cursor类nCursor类支持在查询的数据集合中多种方式移动,并能够获取数据集合的属性名称和序号糊囤绣尤贩透眉娘汀豹囱亡简话柱面猛喷默忿晓提龄徽炬说古凌构贱洛路移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作qCursor类的方法和说明函数函数说

103、明说明moveToFirst将指针移动到第一条数据上moveToNext将指针移动到下一条数据上moveToPrevious将指针移动到上一条数据上getCount获取集合的数据数量getColumnIndexOrThrow返回指定属性名称的序号,如果属性不存在则产生异常getColumnName返回指定序号的属性名称getColumnNames返回属性名称的字符串数组getColumnIndex根据属性名称返回序号moveToPosition将指针移动到指定的数据上getPosition返回当前指针的位置汀危舞稼心棘笑觅卿蟹夯末标墓蟹甫盘杖展匈括礼辰毡毋炬缘资绵作攻现移动编程课件 第8章 数

104、据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作q从Cursor中提取数据可以参考ConvertToPeople()函数的实现方法q在提取Cursor数据中的数据前,推荐测试Cursor中的数据数量,避免在数据获取中产生异常,例如代码的第3行到第5行q从Cursor中提取数据使用类型安全的get()函数,函数的输入值为属性的序号,为了获取属性的序号,可以使用getColumnIndex()函数获取指定属性的序号陡橇处煽源斜肄版牙毛姨悼猛蘸猴灸伙孙藤层菠唁理丘矢钓凄算垂肄得波移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数

105、据库存储n8.3.4 数据操作1.private People ConvertToPeople(Cursor cursor)2.int resultCounts = cursor.getCount();3.if (resultCounts = 0 | !cursor.moveToFirst()4. return null;5.6.People peoples = new PeopleresultCounts;7.for (int i = 0 ; iresultCounts; i+)8. peoplesi = new People();9. peoplesi.ID = cursor.getInt

106、(0);10. peoplesi.Name = cursor.getString(cursor.getColumnIndex(KEY_NAME);11. peoplesi.Age = cursor.getInt(cursor.getColumnIndex(KEY_AGE);12. peoplesi.Height = cursor.getFloat(cursor.getColumnIndex(KEY_HEIGHT);13. cursor.moveToNext();14.15.return peoples; 16.沂樱直岸魂诧扇赃舀龋怂汹谍烫推漆卒饮灾游各汝闰层酱夕危壳苫育抡敏移动编程课件 第8章

107、 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作q要进行数据查询就需要调用SQLiteDatabase类的query()函数,query()函数的语法如下qquery()函数的参数说明位置位置类型类型+名称名称说明说明1String table表名称2String columns返回的属性列名称3String selection查询条件4String selectionArgs如果在查询条件中使用的问号,则需要定义替换符的具体内容5String groupBy分组方式6String having定义组的过滤器7String orderBy排序方式Cu

108、rsor android.database.sqlite.SQLiteDatabase.query(String table, String columns, String selection, String selectionArgs, String groupBy, String having, String orderBy)该阳弃徒脯虚眩坠浴从裳整舅捷唆斑伶歉安蹬峦臆港琴悔程龙横留莫醛删移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作q根据id查询数据的代码q根据id查询全部数据的代码1.public People getO

109、neData(long id) 2.Cursor results = db.query(DB_TABLE, new String KEY_ID, KEY_NAME, KEY_AGE, KEY_HEIGHT, KEY_ID + = + id, null, null, null, null);3.return ConvertToPeople(results);4.1.public People getAllData() 2.Cursor results = db.query(DB_TABLE, new String KEY_ID, KEY_NAME, KEY_AGE, KEY_HEIGHT, nu

110、ll, null, null, null, null);3.return ConvertToPeople(results);4.喘僵骆哄义帛始玩溢晶性刮悯协圣厦延抹幌翟玖茹营隘店跪驼弥择日宅察移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作qSQLiteDemo是对数据库操作的一个示例帚辑无屡庆烫找让愚罪婿苫柄渡迂榷混伪恤肯金葫窑膳悍嘶挡驻并愁芒摹移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.3 数据库存储n8.3.4 数据操作n用户可以在界面的上方输入数据信息,通过“添加数据”按钮将数据写入数据库n

111、“全部显示”相当于查询数据库中的所有数据,并将数据显示显示在界面下方n“清除显示”仅是清除界面下面显示的数据,而不对数据库进行任何操作n“全部删除”是数据库操作,将删除数据库中的所有数据n在界面中部,以“ID+功能”命名的按钮,分别是根据ID删除数据,根据ID进行数据查询,根据ID更新数据,而这个ID值就取自本行的EditText控件吠番稳掐盒泣赦痢缄奋钥畅秀搓险敖焦湍研阮梳败散磕签拟羊绸咯鸡缄蜂移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.1 ContentProviderqContentProvider(数据提供者)是在应用程序间共享数据

112、的一种接口机制qContentProvider提供了更为高级的数据共享方法,应用程序可以指定需要共享的数据,而其他应用程序则可以在不知数据来源、路径的情况下,对共享数据进行查询、添加、删除和更新等操作q许多Android系统的内置数据也通过ContentProvider提供给用户使用,例如通讯录、音视频文件和图像文件等酶膳咋俄堵值继蚂间搞簿峦遏拌刚聂眉蹬傀烈这盼泽碰尚唾俏时习攻财荣移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.1 ContentProviderq在创建ContentProvider时,需要首先使用数据库、文件系统或网络实现底层

113、存储功能,然后在继承ContentProvider的类中实现基本数据操作的接口函数,包括添加、删除、查找和更新等功能q调用者不能够直接调用ContentProvider的接口函数,而需要使用ContentResolver对象,通过URI间接调用ContentProvider。下图是ContentProvider调用关系穴停姬揽秽下淆苹僵粹仰肌甥榷闻乱厨深堆钦城荐叹离躯厅祸矽箱棵鲁契移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.1 ContentProviderq程序开发人员使用ContentResolver对象与ContentProvider

114、进行交互,而ContentResolver则通过URI确定需要访问的ContentProvider的数据集q在发起一个请求的过程中,Android首先根据URI确定处理这个查询的ContentResolver,然后初始化ContentResolver所有需要的资源,这个初始化的工作是Android系统完成的,无需程序开发人员参与q一般情况下只有一个ContentResolver对象,但却可以同时与多个ContentResolver进行交互父吼芥搭闹热瞧豢祈伸讼罕躲笔档初讶颂闭吗洋裸宦侥困休畦镐专溯酸嘶移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.

115、4.1 ContentProviderqContentProvider完全屏蔽了数据提供组件的数据存储方法q在使用者看来,数据提供者通过ContentProvider提供了一组标准的数据操作接口,却无法得知数据提供者的数据存储方q数据提供者可以使用SQLite数据库存储数据,也可以通过文件系统或SharedPreferences存储数据,甚至是使用网络存储的方法,这些内容对数据使用者都是不可见q同时也正是因为屏蔽数据的存储方法,很大程度上简化的ContentProvider的使用难度,使用者只要调用ContentProvider提供的接口函数,就可完成所有的数据操作落票田箕娟朱痹屿具唉浪建庚满

116、翼诞凡棺习守响魂先怂阁护瘦遥肯皱究翟移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.1 ContentProviderqContentProvider的数据模式似于数据库的数据表,每行是一条记录,每列具有相同的数据类型q每条记录都包含一个长型的字段_ID,用来唯一标识每条记录qContentProvider可以提供多个数据集,调用者使用URI对不同的数据集的数据进行操作qContentProvider数据模型_ID_IDNAMENAMEAGEAGEHEIGHTHEIGHT1Tom211.812Jim221.78身锐冀俺浊黑对魂迹威奴糜即坊氟雇隋

117、洱项钓药狈抗茵覆览黔把建弄存驻移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.1 ContentProviderqURI是通用资源标志符(Uniform Resource Identifier),用来定位任何远程或本地的可用资源qContentProvider使用的URI语法结构如下ncontent:/是通用前缀,表示该URI用于ContentProvider定位资源,无需修改n是授权者名称,用来确定具体由哪一个ContentProvider提供资源n因此,一般都由类的小写全称组成,以保证唯一性。是数据路径,用来确定请求的是哪个数据集conte

118、nt:/鸽丈拷姿语邓卜鼎韭病聂佑梯射互鞋楚辟缴瞒跟伶爸联瘴顽数木优嚏屎佛移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.1 ContentProviderq如果ContentProvider仅提供一个数据集,数据路径则是可以省略的q如果ContentProvider仅提供多个数据集,数据路径则必须指明具体是哪一个数据集n数据集的数据路径可以写成多段格式,例如/people/girl和/people/boy。是数据编号,用来唯一确定数据集中的一条记录,用来匹配数据集中_ID字段的值q如果请求的数据并不只限于一条数据,则可以省略n 请求整个peop

119、le数据集的URI应写为n请求people数据集中第3条数据的URI则应写为content:/edu.hrbeu.peopleprovider/peoplecontent:/edu.hrbeu.peopleprovider/people/3薄晶刚眺辕兄怜女赣响沪联缅贴蹄壶乌烃该用晤蜒幅益易奴门琵乒峭谊赋移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.2 创建数据提供者q程序开发人员通过继承ContentProvider类可以创建一个新的数据提供者,过程可以分为三步n继承ContentProvider,并重载六个函数n声明CONTENT_URI,

120、实现UriMatchern注册ContentProvider芋酗掠诊扇蓖给杂饮超懂撩蹭龙稳狞容山担豢射搂晶诬溅若泰辩潦襄除驳移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.2 创建数据提供者q继承ContentProvider,并重载六个函数n新建立的类继承ContentProvider后,供有六个函数需要重载qdelete():删除数据集qinsert():添加数据集qqurey():查询数据集qupdate():更新数据集qonCreate():初始化底层数据集和建立数据连接等工作qgetType():返回指定URI的MIME数据类型,如果

121、URI是单条数据,则返回的MIME数据类型应以vnd.android.cursor.item开头如果URI是多条数据,则返回的MIME数据类型应以vnd.android.cursor.dir/开头应艺稼里髓檬誓剥侦蠕熊恍若裔涸皋矢督反藉赎根荣拨陵霞苛拦厦秩弯黔移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.2 创建数据提供者q继承ContentProvider,并重载六个函数n新建立的类继承ContentProvider后,Eclipse会提示程序开发人员需要重载部分代码,并自动生成需要重载的代码框架n下面的代码是Eclipse自动生成的代码框

122、架1.import android.content.*;2.import android.database.Cursor;3.import .Uri;4. 5.public class PeopleProvider extends ContentProvider6.Override7. 8.public int delete(Uri uri, String selection, String selectionArgs) 9./ TODO Auto-generated method stub10.return 0;11.蓬先搞湘皿玻晾印许和硒痪氧念滚左阀侩休唁驻行慌咽蔓萨芦沮磐墙伏谜移动编程课

123、件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.2 创建数据提供者12.13. Override14.public String getType(Uri uri) 15./ TODO Auto-generated method stub16.return null;17.18. 19.Override20.public Uri insert(Uri uri, ContentValues values) 21./ TODO Auto-generated method stub22.return null;23.24. 25.Override26.publi

124、c boolean onCreate() 27./ TODO Auto-generated method stub28.return false;29.迎崖摘钒忠缅搓笔钵炯讥篓屉估灿泞鸥犬仆拿问柱绍描廉宫却吼淑莎荫词移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.2 创建数据提供者30.31. Override32.public Cursor query(Uri uri, String projection, String selection,33.String selectionArgs, String sortOrder) 34./ TOD

125、O Auto-generated method stub35.return null;36.37. 38.Override39.public int update(Uri uri, ContentValues values, String selection,40.String selectionArgs) 41./ TODO Auto-generated method stub42.return 0;43.44.巴否孵迂讫尿骋篓晃遇磺懒拌马崖啮窖寨萝窃狠欺伺萎恢颐殖蒂诧胰困未移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.2 创建数据提供者q

126、声明CONTENT_URI,实现UriMatchern在新构造的ContentProvider类中,通过构造一个UriMatcher,判断URI是单条数据还是多条数据n为了便于判断和使用URI,一般将URI的授权者名称和数据路径等内容声明为静态常量,并声明CONTENT_URI纶抛羌绒粤赊谊售翱母茂债坷驰习闯永锭冶毗执论盼图斗扩蒲炭逝饭浮渔移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.2 创建数据提供者q声明CONTENT_URI和构造UriMatcher的代码如下1.public static final String AUTHORITY

127、= edu.hrbeu.peopleprovider;2.public static final String PATH_SINGLE = people/#;3.public static final String PATH_MULTIPLE = people;4.public static final String CONTENT_URI_STRING = content:/ + AUTHORITY + / + PATH_MULTIPLE;5.public static final Uri CONTENT_URI = Uri.parse(CONTENT_URI_STRING);6.priva

128、te static final int MULTIPLE_PEOPLE = 1;7.private static final int SINGLE_PEOPLE = 2;8. 9.private static final UriMatcher uriMatcher;10.static 11.uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);12.uriMatcher.addURI(AUTHORITY, PATH_SINGLE, MULTIPLE_PEOPLE);13.uriMatcher.addURI(AUTHORITY, PATH_MULTIP

129、LE, SINGLE_PEOPLE);14.顾涎韶物弦技丝酋请劣停擅阮捞谆嚣戒咯潭首秘迹溉闪辖嗜屏撞星屿方椅移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.2 创建数据提供者n第1行代码声明了URI的授权者名称n第2行代码声明了单条数据的数据路径n第3行代码声明了多条数据的数据路径n第4行代码声明了CONTENT_URI的字符串形式n第5行代码则正式声明了CONTENT_URIn第6行代码声明了多条数据的返回代码n第7行代码声明了单条数据的返回代码n第9行代码声明了UriMatchern第10行到第13行的静态构造函数中,声明了UriMatch

130、er的匹配方式和返回代码吐贮障纺瘩舶腾洞乏枢擅魁坛患津堪皖获逻澜椿汇伙么横拳杀颐铸规隔备移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.2 创建数据提供者n其中第11行UriMatcher的构造函数中,UriMatcher.NO_MATCH表示URI无匹配时的返回代码n第12行的addURI()函数用来添加新的匹配项,语法如下qauthority表示匹配的授权者名称qpath表示数据路径q#可以代表任何数字qcode表示返回代码public void addURI (String authority, String path, int code

131、)卖留冀我陕屏册唆抬陛汗脑左犹类扯工古蕾愈炸没刃患宦悲移壮倔阅阑贷移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.2 创建数据提供者q声明CONTENT_URI,实现UriMatchern使用UriMatcher时,则可以直接调用match()函数,对指定的URI进行判断,示例代码如下1.switch(uriMatcher.match(uri)2.case MULTIPLE_PEOPLE:3./多条数据的处理过程4.break;5.case SINGLE_PEOPLE:6./单条数据的处理过程7.break;8.default:9.throw

132、new IllegalArgumentException(不支持的URI: + uri);10.焕搐两锚定滩畏胀少阀渗攫保耙搜呸钟盎抗妖淫族遂颅丈晚触悸指灼机擂移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.2 创建数据提供者q注册ContentProvidern在完成ContentProvider类的代码实现后,需要在AndroidManifest.xml文件中进行注册n注册ContentProvider使用标签,示例代码如下n在上面的代码中,注册了一个授权者名称为edu.hrbeu.peopleprovider的ContentProvide

133、r,其实现类是PeopleProvider1.2.4.纽傅馆撑尾枫仲斗囚枪襄坯篙籍喝眺啪管嵌越韭谗亿缆虫哑经禹慕白践蠢移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.3 使用数据提供者q使用ContentProvider是通过Android组件都具有的ContentResolver对象,通过URI进行数据操作q程序开发人员只需要知道URI和数据集的数据格式,则可以进行数据操作,解决不同应用程序之间的数据共享问题q每个Android组件都具有一个ContentResolver对象,获取ContentResolver对象的方法是调用getConte

134、ntResolver()函数ContentResolver resolver = getContentResolver();煤盾恳柿缀匀售操果币蔷破燎椿箍灼逛霖灵子诚括柑掉蛊铰迂伪涕伏琅催移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.3 使用数据提供者q查询操作n在获取到ContentResolver对象后,程序开发人员则可以使用query()函数查询目标数据n下面的代码是查询ID为2的数据q在URI中定义了需要查询数据的ID,在query()函数并没有额外声明查询条件1.String KEY_ID = _id;2.String KEY_NA

135、ME = name;3.String KEY_AGE = age;4.String KEY_HEIGHT = height;5. 6.Uri uri = Uri.parse(CONTENT_URI_STRING + / + 2;7.Cursor cursor = resolver.query(uri,8. new String KEY_ID, KEY_NAME, KEY_AGE, KEY_HEIGHT, null, null, null);枷幅吠锻滋哩油饵悍憋鬃泡止舆啤垛跨五怀髓跪酒多欢堑贪郊蒜钟佐窍渣移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8

136、.4.3 使用数据提供者q查询操作n如果需要获取数据集中的全部数据,则可直接使用CONTENT_URI,此时ContentProvider在分析URI时将认为需要返回全部数据nContentResolver的query()函数与SQLite数据库的query()函数非常相似,语法结构如下quri定义了查询的数据集qprojection定义了从数据集返回哪些数据项qselection定义了返回数据的查询条件Cursor query(Uri uri, String projection, String selection, String selectionArgs, String sortOrde

137、r)肩坍趟抬藕乾宫没宗猜件僵波捂哥舵制称篆暖能颧苏吗便助猎士磊槽他译移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.3 使用数据提供者q添加操作n向ContentProvider中添加数据有两种方法q一种是使用insert()函数,向ContentProvider中添加一条数据q另一种是使用bultInsert()函数,批量的添加数据n下面的代码说明了如何使用insert()函数添加单条数据n下面代码说明了如何使用bultInsert()函数添加多条数据1.ContentValues values = new ContentValues();2

138、.values.put(KEY_NAME, Tom);3.values.put(KEY_AGE, 21);4.values.put(KEY_HEIGHT, );5.Uri newUri = resolver.insert(CONTENT_URI, values);1.ContentValues arrayValues = new ContentValues10;2./实例化每一个ContentValues3.int count = resolver.bultInsert(CONTENT_URI, arrayValues);打娥暴拣戴堰亢姥洒搜系记顽琢蝉略项诸磊销揩研獭窄刚伴涣罪喷唇躇洗移动编程

139、课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.3 使用数据提供者q删除操作n删除操作需要使用delete()函数n如果需要删除单条数据,则可以在URI中指定需要删除数据的IDn如果需要删除多条数据,则可以在selection中声明删除条件n下面代码说明了如何删除ID为2的数据n也可以在selection将删除条件定义为ID大于4的数据1.Uri uri = Uri.parse(CONTENT_URI_STRING + / + 2);2.int result = resolver.delete(uri, null, null);1.String sel

140、ection = KEY_ID + 4;2.int result = resolver.delete(CONTENT_URI, selection, null);录诱贾储靛脆快体向敌逾菏楔晦孟宜桔踩磁休漫稍咕苗逼亩虾艰笆投凰能移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.3 使用数据提供者q更新操作n更新操作需要使用update()函数,参数定义与delete()函数相同,同样可以在URI中指定需要更新数据的ID,也可以在selection中声明更新条件n下面代码说明了如何更新ID为7的数据1.ContentValues values = n

141、ew ContentValues();2.values.put(KEY_NAME, Tom);3.values.put(KEY_AGE, 21);4.values.put(KEY_HEIGHT, );5.Uri uri = Uri.parse(CONTENT_URI_STRING + / + 7);6.int result = resolver.update(uri, values, null, null);疫介突惹毙馋蹭感且泉棕失冀苦守健谩手租卒烯芳盖探付书讶筛昂滤峪嗡移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例qContentP

142、roviderDemo是一个无界面的示例,仅提供一个ContentProvider组件,供其他应用程序进行数据交换n底层使用SQLite数据库,支持数据的添加、删除、更新和查询等基本操作nContentResolverDemo是使用ContentProvider的示例,自身不具有任何数据存储功能,仅是通过URI访问ContentProviderDemo示例提供的ContentProvider鼎隶鞭硼篷减谅阴签氯兆鼎旧柒涸域藉蛋综褐天过存休勒译吕呢幽粟愁讫移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例q ContentProviderD

143、emo文件结构qContentResolverDemo文件结构兹沏光赠阳汰讲折撒汇栓傀冈嘿州麦垢斑珐厘慎肿扰光璃妆乞货敝尼谰植移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例q以上两个示例都包含一个相同的文件People.java,两个示例中的这个文件的内容也完全相同,定义了数据提供者和数据调用者都必须知道的信息q这些信息包括授权者名称、数据路径、MIME数据类型、CONTENT_URI和数据项名称等q下面分别给出People.java、PeopleProvider.java和ContentResolverDemo.java的完整代码,

144、最后分别给出ContentProviderDemo示例和ContentResolverDemo示例的AndroidManifest.xml文件内容里萤泛烈迷碴搭款恢饿苫矫知荣清伎珠蛾茂寞忍獭闲隙丰筐单女囊川曙甄移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例qPeople.java文件的完整代码1.package edu.hrbeu.ContentResolverDemo;2.import .Uri;3. 4.public class People5. 6.public static final String MIME_DIR_PREF

145、IX = vnd.android.cursor.dir;7.public static final String MIME_ITEM_PREFIX = vnd.android.cursor.item;8.public static final String MINE_ITEM = vnd.hrbeu.people;9. 10.public static final String MINE_TYPE_SINGLE = MIME_ITEM_PREFIX + / + MINE_ITEM;11.public static final String MINE_TYPE_MULTIPLE = MIME_D

146、IR_PREFIX + / + MINE_ITEM;规蚜守疆并徊强翘狡丽教孵耿蝴鄙碾霹违噬瀑靖檄温瞥洲喂粒篱气崔矫窜移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例12.13. public static final String AUTHORITY = edu.hrbeu.peopleprovider;14.public static final String PATH_SINGLE = people/#;15.public static final String PATH_MULTIPLE = people;16.public st

147、atic final String CONTENT_URI_STRING = content:/ + AUTHORITY + / + PATH_MULTIPLE;17.public static final Uri CONTENT_URI = Uri.parse(CONTENT_URI_STRING); 18. 19.public static final String KEY_ID = _id;20.public static final String KEY_NAME = name;21.public static final String KEY_AGE = age;22.public

148、static final String KEY_HEIGHT = height;23.南受埔硝鸯篇衰刁搂芭烁拘毗苗荐糊弹群眺缮茵鳞戮承戏饭俱止弹痴饱趋移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例qPeopleProvider.java文件的完整代码1.package edu.hrbeu.ContentProviderDemo;2. 3.import android.content.ContentProvider;4.import android.content.ContentUris;5.import android.content

149、.ContentValues;6.import android.content.Context;7.import android.content.UriMatcher;8.import android.database.Cursor;9.import android.database.SQLException;10.import android.database.sqlite.SQLiteDatabase;11.import android.database.sqlite.SQLiteOpenHelper;12.import android.database.sqlite.SQLiteQuer

150、yBuilder;13.import android.database.sqlite.SQLiteDatabase.CursorFactory;14.import .Uri;胖忠硫队磷蓬墟倍札支挞壬该嫡雪宽盒初局厨尺嘘番僚打丧骋秆盅姬挖塘移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例15.16.public class PeopleProvider extends ContentProvider17. 18.private static final String DB_NAME = people.db;19.private stati

151、c final String DB_TABLE = peopleinfo;20.private static final int DB_VERSION = 1;21. 22.private SQLiteDatabase db;23.private DBOpenHelper dbOpenHelper;24. 25.private static final int MULTIPLE_PEOPLE = 1;26.private static final int SINGLE_PEOPLE = 2;27.private static final UriMatcher uriMatcher;28. 蜂凭

152、虱伊寓抓佛酣真龙晾体恢震耿柑滞翘片妄凹胆暖吉憾谍剁择梆皑罚初移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例29. static 30. uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);31. uriMatcher.addURI(People.AUTHORITY, People.PATH_MULTIPLE, MULTIPLE_PEOPLE);32. uriMatcher.addURI(People.AUTHORITY, People.PATH_SINGLE, SINGLE_PEOPLE)

153、;33.34. 35.Override36.public String getType(Uri uri) 37. switch(uriMatcher.match(uri)38. case MULTIPLE_PEOPLE:39.return People.MINE_TYPE_MULTIPLE;40. case SINGLE_PEOPLE:41.return People.MINE_TYPE_SINGLE;42. default:43. throw new IllegalArgumentException(Unkown uri:+uri);44.幸充弘澎笆之奋樊吼洽拥淮棋零侈悬犯孩操烟丝揍翔誓鼠蚜

154、哩柏刽狄筋搪移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例45. 46. 47.Override48.public int delete(Uri uri, String selection, String selectionArgs) 49. int count = 0;50. switch(uriMatcher.match(uri)51. case MULTIPLE_PEOPLE:52. count = db.delete(DB_TABLE, selection, selectionArgs);53. break;54. case

155、SINGLE_PEOPLE:55. String segment = uri.getPathSegments().get(1);56. count = db.delete(DB_TABLE, People.KEY_ID + = + segment, selectionArgs);57. break;58. default:59. throw new IllegalArgumentException(Unsupported URI: + uri);60.牲怔颈侈撰荚怪理厂驳刑努灌习驴打熔愁秀巴喜娇翁竭美粱舷疟令题亏膏移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4

156、数据分享n8.4.4 示例61. getContext().getContentResolver().notifyChange(uri, null); 62.return count;63.64. 65.Override66.public Uri insert(Uri uri, ContentValues values) 67.long id = db.insert(DB_TABLE, null, values);68.if ( id 0 )69.Uri newUri ContentUris.withAppendedId(People.CONTENT_URI, id);70.getContex

157、t().getContentResolver().notifyChange(newUri, null);71.return newUri;72.73.throw new SQLException(Failed to insert row into + uri);74.75. 八哲米懊沧儡闯捐将爽绎超出君捉丑纵浇配扶建钩蝉哺满净龚习卷胖福垮移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例76. Override77.public boolean onCreate() 78.Context context = getContext();79

158、.dbOpenHelper = new DBOpenHelper(context, DB_NAME, null, DB_VERSION);80.db = dbOpenHelper.getWritableDatabase();81. 82.if (db = null)83.return false;84.else 85.return true;86.87. 88.Override迷适姚冠蚤响囚脖循膜蛛甚盈斟钝私讼桃管厩惕就箕仆蚊通睦香澡其葱两移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例89. public Cursor query(U

159、ri uri, String projection, String selection,90.String selectionArgs, String sortOrder) 91.SQLiteQueryBuilder qb = new SQLiteQueryBuilder();92.qb.setTables(DB_TABLE);93.switch(uriMatcher.match(uri)94.case SINGLE_PEOPLE:95.qb.appendWhere(People.KEY_ID + = + uri.getPathSegments().get(1);96.break;97.def

160、ault:98.break;99.100.Cursor cursor = qb.query(db, 101.projection, 102.selection, 103.selectionArgs, 104.null, 105.null, 蚕椽芬沾潍汲怜润峭朱盂下獭任策淮鸡漓油欢烈狡白荤夺窜跑浪绥坎运旦移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例106. sortOrder);107.cursor.setNotificationUri(getContext().getContentResolver(), uri);108.retur

161、n cursor;109.110. 111.Override112.public int update(Uri uri, ContentValues values, String selection,113.String selectionArgs) 114.int count;115.switch(uriMatcher.match(uri)116. case MULTIPLE_PEOPLE:117. count = db.update(DB_TABLE, values, selection, selectionArgs);118. break;119. case SINGLE_PEOPLE:

162、120. String segment = uri.getPathSegments().get(1);121. count = db.update(DB_TABLE, values, People.KEY_ID+=+segment, selectionArgs);蝎用戊撰锋韭黄疆婉脚呸枢声串唱箭慷酋琐桌獭领骇督婪楼寸瓢链添孙暴移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例122. break;123. default:124.throw new IllegalArgumentException(Unknow URI: + uri);

163、125.126.getContext().getContentResolver().notifyChange(uri, null);127.return count;128.129. 130. 131. private static class DBOpenHelper extends SQLiteOpenHelper 132. 133. public DBOpenHelper(Context context, String name, CursorFactory factory, int version) 134. super(context, name, factory, version)

164、;135. 136. 榔枝惺另引擞蛤雷响婉晒逸饲孪凡黍桌框椽名宪樊玻肿袭濒嘲怜啪壳柞舌移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例137. private static final String DB_CREATE = create table + 138. DB_TABLE + ( + People.KEY_ID + integer primary key autoincrement, +139. People.KEY_NAME+ text not null, + People.KEY_AGE+ integer, + People

165、.KEY_HEIGHT + float);140. 141. Override142. public void onCreate(SQLiteDatabase _db) 143. _db.execSQL(DB_CREATE);144. 145. 146.Override147. public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion) 148. _db.execSQL(DROP TABLE IF EXISTS + DB_TABLE);149. onCreate(_db);150. 151. 152.筋

166、岂迷锣疥并蹭寝麦胎惰雾缘诫抬诛把蟹漏撤事凭成稠湾宅棺闹茬趾羔止移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例qContentResolverDemo.java文件的完整代码如下1.package edu.hrbeu.ContentResolverDemo;2. 3. 4.import android.app.Activity;5.import android.content.ContentResolver;6.import android.content.ContentValues;7.import android.database.

167、Cursor;8.import .Uri;9.import android.os.Bundle;10.import android.view.View;11.import android.view.View.OnClickListener;12.import android.widget.Button;13.import android.widget.EditText;14.import android.widget.TextView;15. 蟹罢粤纺贤快诽涛笛猖叼巧锥蜂殿褒拷抿烈耘胖介枫矩蓖碘生迭芍凄锻果移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享

168、n8.4.4 示例16. public class ContentResolverDemo extends Activity 17. 18.private EditText nameText;19.private EditText ageText;20.private EditText heightText;21.private EditText idEntry;22. 23.private TextView labelView;24.private TextView displayView;25. 26.private ContentResolver resolver;27. 屡吏逐糙冗抡念

169、辜邑诉丝臼费格侄功侥柬嘉刹酪雏弥马胶兄现涵丙淌刹膳移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例28. Override29. public void onCreate(Bundle savedInstanceState) 30. super.onCreate(savedInstanceState);31. setContentView(R.layout.main);32. 33. nameText = (EditText)findViewById(R.id.name);34. ageText = (EditText)findView

170、ById(R.id.age);35. heightText = (EditText)findViewById(R.id.height);36. idEntry = (EditText)findViewById(R.id.id_entry);37. 38. labelView = (TextView)findViewById(R.id.label);39. displayView = (TextView)findViewById(R.id.display);40. 41. 42. 疗腑娜茁窒拱蛊遮财赔拎洪幢侠喜贫逾农嚼荐蝗冉吉榆蔼慷竖昼邓袄赊乳移动编程课件 第8章 数据存储与访问移动编程课件 第

171、8章 数据存储与访问8.4 数据分享n8.4.4 示例43. Button addButton = (Button)findViewById(R.id.add);44. Button queryAllButton = (Button)findViewById(R.id.query_all); 45. Button clearButton = (Button)findViewById(R.id.clear);46. Button deleteAllButton = (Button)findViewById(R.id.delete_all);47. 48. Button queryButton =

172、 (Button)findViewById(R.id.query);49. Button deleteButton = (Button)findViewById(R.id.delete);50. Button updateButton = (Button)findViewById(R.id.update);51. 52. 53. addButton.setOnClickListener(addButtonListener); 54. queryAllButton.setOnClickListener(queryAllButtonListener); 55. clearButton.setOnC

173、lickListener(clearButtonListener);56. deleteAllButton.setOnClickListener(deleteAllButtonListener); 57. 58. queryButton.setOnClickListener(queryButtonListener);59. deleteButton.setOnClickListener(deleteButtonListener);60. updateButton.setOnClickListener(updateButtonListener); 闸辉荫恒驰馈阐隆化监侠气完拄见很酗考欣习燕单批吮

174、阿毕进仲铝效用凯移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例61.62. resolver = this.getContentResolver();63. 64. 65. 66. 67. OnClickListener addButtonListener = new OnClickListener() 68.Override69.public void onClick(View v) 70. ContentValues values = new ContentValues();71. 72. values.put(People.KE

175、Y_NAME, nameText.getText().toString();73. values.put(People.KEY_AGE, Integer.parseInt(ageText.getText().toString();74. values.put(People.KEY_HEIGHT, Float.parseFloat(heightText.getText().toString();75. 76. Uri newUri = resolver.insert(People.CONTENT_URI, values);疥贩钳氟井熏秆筷酬咏躁霍谊烟匿和箕髓嗡丘血闯瘩岿证肢猫钢眉快间赁移动编程课

176、件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例77.78. labelView.setText(添加成功,URI: + newUri);79. 80. 81. ;82. 83. OnClickListener queryAllButtonListener = new OnClickListener() 84.Override85.public void onClick(View v) 86.Cursor cursor = resolver.query(People.CONTENT_URI,87.new String People.KEY_ID,

177、 People.KEY_NAME, People.KEY_AGE, People.KEY_HEIGHT,88.null, null, null);89.if (cursor = null)90.labelView.setText(数据库中没有数据);91.return;92.衣训熊稗伐庙湿稀旷奈童壮苇和搽莫释肩氨淳本丈绕耘哪廊根凿拒菱居瞧移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例93. labelView.setText(数据库: + String.valueOf(cursor.getCount() + 条记录);94.95. S

178、tring msg = ;96. if (cursor.moveToFirst()97. do98. msg += ID: + cursor.getInt(cursor.getColumnIndex(People.KEY_ID) + ,;99. msg += 姓名: + cursor.getString(cursor.getColumnIndex(People.KEY_NAME)+ ,;100. msg += 年龄: + cursor.getInt(cursor.getColumnIndex(People.KEY_AGE) + , ;101. msg += 身高: + cursor.getFl

179、oat(cursor.getColumnIndex(People.KEY_HEIGHT) + n;102. while(cursor.moveToNext();103. 104. 105. displayView.setText(msg);106. 哪挡悉状铣律怪让隔轴揩渝瀑科腿窒陀远哄韧莱散猛秒抱猛启扒萌杀勺妹移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例107. ;108. 109. OnClickListener clearButtonListener = new OnClickListener() 110 111.Overri

180、de111.public void onClick(View v) 112.displayView.setText();113.114. ;115. 116. OnClickListener deleteAllButtonListener = new OnClickListener() 117.Override118.public void onClick(View v) 119.resolver.delete(People.CONTENT_URI, null, null);120.String msg = 数据全部删除 ;121.labelView.setText(msg);122.123.

181、 ;果蒜誓次晃徊敏龚促具瘴责南惋瓷杨坦我想缔筑珐秋肇酚播疙凌别钒苫狂移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例124. ;125. 126. OnClickListener queryButtonListener = new OnClickListener() 127.Override 128.public void onClick(View v) 129.Uri uri = Uri.parse(People.CONTENT_URI_STRING + / + idEntry.getText().toString();130.Cur

182、sor cursor = resolver.query(uri,131.new String People.KEY_ID, People.KEY_NAME, People.KEY_AGE, People.KEY_HEIGHT,132.null, null, null);133.if (cursor = null)134.labelView.setText(数据库中没有数据);135.return;136.137.138. String msg = ;释碌淬伎裸塌伙贯漂烧鹃弱癣鸣塞贬攘拉俱猛规切赐麓窍韧深敏艺开孤萄移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数

183、据分享n8.4.4 示例139. if (cursor.moveToFirst()140.msg += ID: + cursor.getInt(cursor.getColumnIndex(People.KEY_ID) + ,;141.msg += 姓名: + cursor.getString(cursor.getColumnIndex(People.KEY_NAME)+ ,;142.msg += 年龄: + cursor.getInt(cursor.getColumnIndex(People.KEY_AGE) + , ;143.msg += 身高: + cursor.getFloat(curs

184、or.getColumnIndex(People.KEY_HEIGHT) + n;144. 145. 146.labelView.setText(数据库:);147.displayView.setText(msg);148.149. ;150. 刷靳垃拣拾架藩下藕将秸碴矣红寄贵哀歇狄贤疯咸鸟碎悉弃摆冬种丑倚偶移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例151. OnClickListener deleteButtonListener = new OnClickListener() 152.Override153.public voi

185、d onClick(View v) 154. 155.Uri uri = Uri.parse(People.CONTENT_URI_STRING + / + idEntry.getText().toString();156.int result = resolver.delete(uri, null, null);157.String msg = 删除ID为+idEntry.getText().toString()+的数据 + (result0?成功:失败);158.labelView.setText(msg);159.160. ;161. 162. OnClickListener updat

186、eButtonListener = new OnClickListener() 163.Override164.public void onClick(View v) 165.ContentValues values = new ContentValues();允痊秽涪抿宰呜骸严被薪移遭嫡流揉剐脓怪锚性庐俗久哗甭酶蜜频缸呸钦移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例166. 167. values.put(People.KEY_NAME, nameText.getText().toString();168.values.put(P

187、eople.KEY_AGE, Integer.parseInt(ageText.getText().toString();169.values.put(People.KEY_HEIGHT, Float.parseFloat(heightText.getText().toString();170. 171.Uri uri = Uri.parse(People.CONTENT_URI_STRING + / + idEntry.getText().toString();172.int result = resolver.update(uri, values, null, null);173.174.

188、String msg = 更新ID为+idEntry.getText().toString()+的数据 + (result0?成功:失败);175.labelView.setText(msg);176.177. ;178.焊焦背位镑禄彦炭介毫庸服镑芒仅钳嘱邮躬姜界秸铣橡聂圭糠漱甭宫嚏诈移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例qContentProviderDemo示例的AndroidManifest.xml文件内容1.2.6. 7. 9. 10. 11.浇槛压撤掳爱暂割缔盟祟五辊矿掖孔泄竿域肮晓级赣称登抓和酪咆所业糠移动编程课件

189、 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问8.4 数据分享n8.4.4 示例qContentResolverDemo示例的AndroidManifest.xml文件内容1.2.6. 7. 9. 10. 11. 12. 13. 14. 15. 16.问嫁伶展煞梳挠你玄退噶剂厌占阀孔圈玛干制落愧墟啊滁凋螟吧贷戌休匙移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问习题:n1.应用程序一般允许用户自己定义配置信息,如界面背景颜色、字体大小和字体颜色等,尝试使用SharedPreferences保存用户的自定义配置信息,并在程序启动时自动加载这些自定义的配置信息

190、。n2.尝试把第1题的用户自己定义配置信息,以INI文件的形式保存在内部存储器上。n3.简述在嵌入式系统中使用SQLite数据库的优势。n4.分别使用手动建库和代码建库的方式,创建名为test.db的数据库,并建立staff数据表,表内的属性值如下表所示:属性属性数据类型数据类型说明说明_idinteger主键nametext姓名sextext性别departmenttext所在部门salaryfloat工资穴蔡冲门崩淄站弄树复找瘁保矢却穷娠跺试章面旬忠渺零臭硫煽茁隶卜雾移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问习题:n5.利用第4题所建立的数据库和staff表,为程序提供添加、删除和更新等功能,并尝试将下表中的数据添加到staff表中。n6.建立一个ContentProvider,用来共享第4题所建立的数据库。_id_idnamenamesexsexdepartmedepartmentntsalarsalary y1Tommalecomputer54002Einsteinmalecomputer48003Lilyfemale1.6850004Warnermale5Napoleonmale童要鹅镰醉坛他托篷婿点筷凤渭呆环郑快势售胡灾凳散慎牡硫摔围跃伯蔼移动编程课件 第8章 数据存储与访问移动编程课件 第8章 数据存储与访问

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号