1. 在Android中使用SQLite,ContentProvider
  2. 数据库支持(SQLite)-Android开发平台提供了操作SQLite数据库的相关API
  3. 内容提供器(ContentProvider)-当数据需要在应用程序之间共享时,可以在某程序中使用ContentProvider定义URI,以使其它应用程序可以通过此URI访问指定的数据
  4. 1、SQLite的Demo
  5. DatabaseHelper.java
  6. Java代码
  7. 代码
  8. packagecom.webabcd.SQLite;
  9. importandroid.content.Context;
  10. importandroid.database.sqlite.SQLiteDatabase;
  11. importandroid.database.sqlite.SQLiteOpenHelper;
  12. importandroid.database.sqlite.SQLiteDatabase.CursorFactory;
  13. //数据库操作的Helper类
  14. publicclassDatabaseHelperextendsSQLiteOpenHelper{
  15. DatabaseHelper(Contextcontext,Stringname,CursorFactorycursorFactory,intversion){
  16. super(context,name,cursorFactory,version);
  17. }
  18. @Override
  19. publicvoidonCreate(SQLiteDatabasedb){
  20. //TODO创建数据库后,对数据库的操作
  21. }
  22. @Override
  23. publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
  24. //TODO更改数据库版本的操作
  25. }
  26. @Override
  27. publicvoidonOpen(SQLiteDatabasedb){
  28. super.onOpen(db);
  29. //TODO每次成功打开数据库后首先被执行
  30. }
  31. }
  32. Main.java
  33. 代码
  34. packagecom.webabcd.SQLite;
  35. importjava.util.Random;
  36. importandroid.app.Activity;
  37. importandroid.content.ContentValues;
  38. importandroid.database.Cursor;
  39. importandroid.database.SQLException;
  40. importandroid.database.sqlite.SQLiteDatabase;
  41. importandroid.os.Bundle;
  42. importandroid.view.View;
  43. importandroid.widget.Button;
  44. importandroid.widget.TextView;
  45. publicclassMainextendsActivity{
  46. privateDatabaseHelperdbHelper;
  47. privatestaticfinalStringDATABASE_NAME="db.db";
  48. privatestaticfinalintDATABASE_VERSION=1;
  49. privatestaticfinalStringTABLE_NAME="employee";
  50. TextViewtxtMsg;
  51. /**Calledwhentheactivityisfirstcreated.*/
  52. @Override
  53. publicvoidonCreate(BundlesavedInstanceState){
  54. super.onCreate(savedInstanceState);
  55. setContentView(R.layout.main);
  56. dbHelper=newDatabaseHelper(this,DATABASE_NAME,null,
  57. DATABASE_VERSION);
  58. txtMsg=(TextView)this.findViewById(R.id.txtMsg);
  59. Buttonbtn1=(Button)this.findViewById(R.id.btn1);
  60. btn1.setText("创建表");
  61. btn1.setOnClickListener(newButton.OnClickListener(){
  62. publicvoidonClick(Viewv){
  63. CreateTable();
  64. }
  65. });
  66. Buttonbtn2=(Button)this.findViewById(R.id.btn2);
  67. btn2.setText("插入3条记录");
  68. btn2.setOnClickListener(newButton.OnClickListener(){
  69. publicvoidonClick(Viewv){
  70. insertItem();
  71. }
  72. });
  73. Buttonbtn3=(Button)this.findViewById(R.id.btn3);
  74. btn3.setText("删除全部记录");
  75. btn3.setOnClickListener(newButton.OnClickListener(){
  76. publicvoidonClick(Viewv){
  77. deleteItem();
  78. }
  79. });
  80. Buttonbtn4=(Button)this.findViewById(R.id.btn4);
  81. btn4.setText("更新指定数据");
  82. btn4.setOnClickListener(newButton.OnClickListener(){
  83. publicvoidonClick(Viewv){
  84. updateItem();
  85. }
  86. });
  87. Buttonbtn5=(Button)this.findViewById(R.id.btn5);
  88. btn5.setText("显示全部数据");
  89. btn5.setOnClickListener(newButton.OnClickListener(){
  90. publicvoidonClick(Viewv){
  91. showItems();
  92. }
  93. });
  94. Buttonbtn6=(Button)this.findViewById(R.id.btn6);
  95. btn6.setText("删除表");
  96. btn6.setOnClickListener(newButton.OnClickListener(){
  97. publicvoidonClick(Viewv){
  98. dropTable();
  99. }
  100. });
  101. }
  102. //创建数据表
  103. privatevoidCreateTable(){
  104. SQLiteDatabasedb=dbHelper.getWritableDatabase();
  105. Stringsql="CREATETABLEIFNOTEXISTS"+TABLE_NAME
  106. +"(IDINTEGERPRIMARYKEY,NameVARCHAR,AgeINTEGER);";
  107. try{
  108. db.execSQL(sql);
  109. txtMsg.append("数据表成功创建/n");
  110. }catch(SQLExceptionex){
  111. txtMsg.append("数据表创建错误/n"+ex.toString()+"/n");
  112. }
  113. }
  114. //插入数据
  115. privatevoidinsertItem(){
  116. SQLiteDatabasedb=dbHelper.getWritableDatabase();
  117. try{
  118. Randomrandom=newRandom();
  119. for(inti=0;i<3;i++){
  120. Stringsql="insertinto"+TABLE_NAME
  121. +"(name,age)values('name"+String.valueOf(i)
  122. +"',"+random.nextInt()+")";
  123. //execSQL()-执行指定的sql
  124. db.execSQL(sql);
  125. }
  126. txtMsg.append("成功插入3条数据/n");
  127. }catch(SQLExceptionex){
  128. txtMsg.append("插入数据失败/n"+ex.toString()+"/n");
  129. }
  130. }
  131. //删除数据
  132. privatevoiddeleteItem(){
  133. try{
  134. SQLiteDatabasedb=dbHelper.getWritableDatabase();
  135. db.delete(TABLE_NAME,"id<999999",null);
  136. txtMsg.append("成功删除数据/n");
  137. }catch(SQLExceptione){
  138. txtMsg.append("删除数据失败/n");
  139. }
  140. }
  141. //更新数据
  142. privatevoidupdateItem(){
  143. SQLiteDatabasedb=dbHelper.getWritableDatabase();
  144. try{
  145. ContentValuesvalues=newContentValues();
  146. values.put("name","批量更新后的名字");
  147. db.update(TABLE_NAME,values,"id<?",newString[]{"3"});
  148. txtMsg.append("成功更新数据/n");
  149. }catch(SQLExceptione){
  150. txtMsg.append("更新数据失败/n");
  151. }
  152. }
  153. //查询数据
  154. privatevoidshowItems(){
  155. SQLiteDatabasedb=dbHelper.getReadableDatabase();
  156. try{
  157. String[]column={"id","name","age"};
  158. Cursorcursor=db.query(TABLE_NAME,column,null,null,null,
  159. null,null);
  160. Integernum=cursor.getCount();
  161. txtMsg.append("共"+Integer.toString(num)+"条记录/n");
  162. cursor.moveToFirst();
  163. while(cursor.getPosition()!=cursor.getCount()){
  164. txtMsg.append(Integer.toString(cursor.getPosition())+","
  165. +String.valueOf(cursor.getString(0))+","
  166. +cursor.getString(1)+","
  167. +String.valueOf(cursor.getString(2))+"/n");
  168. cursor.moveToNext();
  169. }
  170. }catch(SQLExceptionex){
  171. txtMsg.append("读取数据失败/n"+ex.toString()+"/n");
  172. }
  173. }
  174. //删除数据表
  175. privatevoiddropTable(){
  176. SQLiteDatabasedb=dbHelper.getWritableDatabase();
  177. Stringsql="DROPTABLEIFEXISTS"+TABLE_NAME;
  178. try{
  179. db.execSQL(sql);
  180. txtMsg.append("数据表删除成功/n");
  181. }catch(SQLExceptionex){
  182. txtMsg.append("数据表删除错误/n"+ex.toString()+"/n");
  183. }
  184. }
  185. }
  186. 2、ContentProvider的Demo
  187. MyUser.java
  188. 代码
  189. packagecom.webabcd.contentprovider;
  190. importandroid.net.Uri;
  191. importandroid.provider.BaseColumns;
  192. //自定义ContentProvider所需的实体类
  193. publicclassMyUser{
  194. //必须要有_id字段。本例中BaseColumn类中已经包含了_id字段
  195. publicstaticfinalclassUserimplementsBaseColumns{
  196. //定义CONTENT_URI
  197. publicstaticfinalUriCONTENT_URI=Uri.parse("content://com.webabcd.MyContentProvider");
  198. //表数据列
  199. publicstaticfinalStringUSER_NAME="USER_NAME";
  200. }
  201. }
  202. MyContentProvider.java
  203. 代码
  204. packagecom.webabcd.contentprovider;
  205. importjava.io.File;
  206. importjava.io.FileInputStream;
  207. importjava.io.FileOutputStream;
  208. importorg.apache.http.util.EncodingUtils;
  209. importandroid.content.ContentProvider;
  210. importandroid.content.ContentUris;
  211. importandroid.content.ContentValues;
  212. importandroid.database.Cursor;
  213. importandroid.database.MatrixCursor;
  214. importandroid.net.Uri;
  215. //继承ContentProvider以实现自定义的ContentProvider(基于文件的信息存储)
  216. publicclassMyContentProviderextendsContentProvider{
  217. privateFilefile;
  218. privateFileOutputStreamout;
  219. privateFileInputStreamin;
  220. //ContentProvider的删除数据接口
  221. @Override
  222. publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
  223. //TODOAuto-generatedmethodstub
  224. return0;
  225. }
  226. @Override
  227. publicStringgetType(Uriuri){
  228. //TODOAuto-generatedmethodstub
  229. returnnull;
  230. }
  231. //ContentProvider的插入数据接口
  232. @Override
  233. publicUriinsert(Uriuri,ContentValuesvalues){
  234. try{
  235. out=newFileOutputStream(file);
  236. out.write(values.getAsString(MyUser.User.USER_NAME).getBytes());
  237. out.close();
  238. introwId=0;
  239. UrirowUri=ContentUris.appendId(
  240. MyUser.User.CONTENT_URI.buildUpon(),rowId).build();
  241. getContext().getContentResolver().notifyChange(rowUri,null);
  242. returnrowUri;
  243. }catch(Exceptione){
  244. returnnull;
  245. }
  246. }
  247. //创建用于保存信息的文件
  248. @Override
  249. publicbooleanonCreate(){
  250. try{
  251. //每个包中应用程序的私有目录为:/data/data/包名/
  252. //SD卡目录为:/sdcard
  253. file=newFile("/data/data/com.webabcd.contentprovider/",
  254. "demo.txt");
  255. if(!file.exists())
  256. file.createNewFile();
  257. returntrue;
  258. }catch(Exceptionex){
  259. returnfalse;
  260. }
  261. }
  262. //ContentProvider的查询数据接口
  263. @Override
  264. publicCursorquery(Uriuri,String[]projection,Stringselection,
  265. String[]selectionArgs,StringsortOrder){
  266. Stringcontent;
  267. try{
  268. in=newFileInputStream(file);
  269. intlength=(int)file.length();
  270. byte[]buffer=newbyte[length];
  271. in.read(buffer,0,length);
  272. content=EncodingUtils.getString(buffer,"UTF-8");
  273. in.close();
  274. String[]columns=newString[]{MyUser.User._ID,MyUser.User.USER_NAME};
  275. MatrixCursorcur=newMatrixCursor(columns);
  276. String[]values=newString[]{"0",content};
  277. cur.moveToFirst();
  278. cur.addRow(values);
  279. returncur;
  280. }catch(Exceptione){
  281. returnnull;
  282. }
  283. }
  284. //ContentProvider的更新数据接口
  285. @Override
  286. publicintupdate(Uriuri,ContentValuesvalues,Stringselection,
  287. String[]selectionArgs){
  288. //TODOAuto-generatedmethodstub
  289. return0;
  290. }
  291. }
  292. Main.java
  293. 代码
  294. packagecom.webabcd.contentprovider;
  295. importjava.util.Random;
  296. importandroid.app.Activity;
  297. importandroid.content.ContentUris;
  298. importandroid.content.ContentValues;
  299. importandroid.database.Cursor;
  300. importandroid.net.Uri;
  301. importandroid.os.Bundle;
  302. importandroid.provider.Contacts;
  303. importandroid.provider.Contacts.People;
  304. importandroid.util.Log;
  305. importandroid.view.View;
  306. importandroid.widget.Button;
  307. importandroid.widget.Toast;
  308. /*
  309. *几个常用的系统内置的ContentProvider如下:
  310. *content://media/internal/images这个URI将返回设备上存储的所有图片
  311. *content://contacts/people/这个URI将返回设备上的所有联系人信息
  312. *content://contacts/people/45这个URI返回单个结果(联系人信息中ID为45的联系人记录)
  313. */
  314. publicclassMainextendsActivity{
  315. /**Calledwhentheactivityisfirstcreated.*/
  316. @Override
  317. publicvoidonCreate(BundlesavedInstanceState){
  318. super.onCreate(savedInstanceState);
  319. setContentView(R.layout.main);
  320. Buttonbtn1=(Button)this.findViewById(R.id.btn1);
  321. btn1.setText("新增联系人记录");
  322. btn1.setOnClickListener(newButton.OnClickListener(){
  323. publicvoidonClick(Viewv){
  324. Randomrandom=newRandom();
  325. insertRecords("name"+String.valueOf(random.nextInt()),String
  326. .valueOf(random.nextInt()));
  327. }
  328. });
  329. Buttonbtn2=(Button)this.findViewById(R.id.btn2);
  330. btn2.setText("查看联系人记录");
  331. btn2.setOnClickListener(newButton.OnClickListener(){
  332. publicvoidonClick(Viewv){
  333. displayRecords();
  334. }
  335. });
  336. Buttonbtn3=(Button)this.findViewById(R.id.btn3);
  337. btn3.setText("清除联系人记录");
  338. btn3.setOnClickListener(newButton.OnClickListener(){
  339. publicvoidonClick(Viewv){
  340. deleteRecords();
  341. }
  342. });
  343. Buttonbtn4=(Button)this.findViewById(R.id.btn4);
  344. btn4.setText("更新联系人记录");
  345. btn4.setOnClickListener(newButton.OnClickListener(){
  346. publicvoidonClick(Viewv){
  347. //此处只是演示,id来自People._ID,可参见displayRecords()是如何获取id的
  348. intid=0;
  349. updateRecord(id,"修改后的name");
  350. }
  351. });
  352. Buttonbtn5=(Button)this.findViewById(R.id.btn5);
  353. btn5.setText("新增记录到MyContentProvider");
  354. btn5.setOnClickListener(newButton.OnClickListener(){
  355. publicvoidonClick(Viewv){
  356. insertRecord2MyContentProvider("webabcd");
  357. }
  358. });
  359. Buttonbtn6=(Button)this.findViewById(R.id.btn6);
  360. btn6.setText("获取记录从MyContentProvider");
  361. btn6.setOnClickListener(newButton.OnClickListener(){
  362. publicvoidonClick(Viewv){
  363. displayRecord2MyContentProvider();
  364. }
  365. });
  366. }
  367. //调用ContentProvider的插入接口
  368. privatevoidinsertRecords(Stringname,StringphoneNum){
  369. ContentValuesvalues=newContentValues();
  370. values.put(People.NAME,name);
  371. Uriuri=getContentResolver().insert(People.CONTENT_URI,values);
  372. Log.d("MyDebug",uri.toString());
  373. UrinumberUri=Uri.withAppendedPath(uri,
  374. People.Phones.CONTENT_DIRECTORY);
  375. Log.d("MyDebug",numberUri.toString());
  376. values.clear();
  377. values.put(Contacts.Phones.TYPE,People.Phones.TYPE_MOBILE);
  378. values.put(People.NUMBER,phoneNum);
  379. getContentResolver().insert(numberUri,values);
  380. }
  381. //调用ContentProvider的查询接口
  382. privatevoiddisplayRecords(){
  383. String[]columns=newString[]{People._ID,People.NAME,
  384. People.NUMBER};
  385. Uricontacts=People.CONTENT_URI;
  386. Log.d("MyDebug",contacts.toString());
  387. Cursorcur=managedQuery(contacts,columns,//要返回的数据字段
  388. null,//WHERE子句
  389. null,//WHERE子句的参数
  390. null//Order-by子句
  391. );
  392. if(cur.moveToFirst()){
  393. Stringid=null;
  394. Stringname=null;
  395. StringphoneNo=null;
  396. while(cur.getPosition()!=cur.getCount()){
  397. id=cur.getString(cur.getColumnIndex(People._ID));
  398. name=cur.getString(cur.getColumnIndex(People.NAME));
  399. phoneNo=cur.getString(cur.getColumnIndex(People.NUMBER));
  400. Toast.makeText(this,id+"/"+name+"/"+phoneNo,
  401. Toast.LENGTH_SHORT).show();
  402. cur.moveToNext();
  403. }
  404. }
  405. }
  406. //调用ContentProvider的删除接口
  407. privatevoiddeleteRecords(){
  408. Uriuri=People.CONTENT_URI;
  409. Log.d("MyDebug",uri.toString());
  410. getContentResolver().delete(uri,null,null);
  411. //getContentResolver().delete(uri,"NAME="+"'name'",null);
  412. }
  413. //调用ContentProvider的更新接口
  414. privatevoidupdateRecord(intrecordNo,Stringname){
  415. Uriuri=ContentUris.withAppendedId(People.CONTENT_URI,recordNo);
  416. Log.d("MyDebug",uri.toString());
  417. ContentValuesvalues=newContentValues();
  418. values.put(People.NAME,name);
  419. getContentResolver().update(uri,values,null,null);
  420. }
  421. //调用自定义ContentProvider的插入接口
  422. privatevoidinsertRecord2MyContentProvider(Stringname){
  423. ContentValuesvalues=newContentValues();
  424. values.put(MyUser.User.USER_NAME,name);
  425. getContentResolver().insert(MyUser.User.CONTENT_URI,values);
  426. }
  427. //调用自定义ContentProvider的查询接口
  428. privatevoiddisplayRecord2MyContentProvider(){
  429. String[]columns=newString[]{MyUser.User.USER_NAME};
  430. Uriuri=MyUser.User.CONTENT_URI;
  431. Cursorcur=managedQuery(uri,columns,null,null,null);
  432. while(cur.getPosition()!=cur.getCount()){
  433. Stringid=cur.getString(cur.getColumnIndex(People._ID));
  434. Stringname=cur.getString(cur.getColumnIndex(MyUser.User.USER_NAME));
  435. Toast.makeText(this,
  436. id+"/"+name,
  437. Toast.LENGTH_SHORT).show();
  438. cur.moveToNext();
  439. }
  440. }
  441. }
  442. AndroidManifest.xml
  443. 代码
  444. <?xmlversion="1.0"encoding="utf-8"?>
  445. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  446. package="com.webabcd.contentprovider"
  447. android:versionCode="1"
  448. android:versionName="1.0">
  449. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  450. <activityandroid:name=".Main"
  451. android:label="@string/app_name">
  452. <intent-filter>
  453. <actionandroid:name="android.intent.action.MAIN"/>
  454. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  455. </intent-filter>
  456. </activity>
  457. <!--
  458. 配置一个自定义的ContentProvider"
  459. -->
  460. <providerandroid:name="MyContentProvider"android:authorities="com.webabcd.MyContentProvider"/>
  461. </application>
  462. <uses-permissionandroid:name="android.permission.WRITE_CONTACTS"></uses-permission>
  463. <uses-permissionandroid:name="android.permission.READ_CONTACTS"></uses-permission>
  464. <uses-sdkandroid:minSdkVersion="3"/>
  465. </manifest>

更多相关文章

  1. Android处理后台返回数据——Json转实体类
  2. android 中文api (84) ―― TrafficStats
  3. 【Android】数据存储之Network
  4. ListView 列表视图
  5. Android(安卓)图形系统剖析
  6. Android学习笔记-界面和数据存储以及一些零碎知识点
  7. day02 数据存储和界面展现(1)
  8. [Android(安卓)特效] Android(安卓)通过流播放声音(一)
  9. Android中的5种数据存储方式

随机推荐

  1. Android(安卓)UI开发第七篇之Android(安
  2. Android与服务器交互
  3. 谈谈Android的一些UI设计
  4. Android(安卓)Studio导入eclipse项目AAPT
  5. cts测试流程
  6. android 模仿 弹性菜单
  7. 最强 Android Studio 使用小技巧和快捷键
  8. Ubuntu 14.04 配置 Android(安卓)sdk 开
  9. Android 采用PULL来解析XML
  10. Android中的AsyncTask原理