Android開發學習之使用ContentProvider實現數據共享

ContentProvider是我學習安卓這幾個月以來碰到最難理解的一塊,感覺很難掌握,不知道如何使用這一塊內容,有些方法的參數使用起來真的是令人髮指,我也不打算一下子把全部內容都運用自如,那是不可能的事情,下面是學習ContentProvider所實現的一個實例:


實例:使用ContentProvider共享生詞本數據


這個實例可以簡單實現添加生詞和查詢生詞的功能,我原本想擴展一下這個應用程序的功能,但卻不知道從何做起,只是簡簡單單換了了界面背景就是了。


創建項目:DictProvider


項目運行效果:



193229503.png193227189.png


下面只給出主要代碼佈局文件和string資源文件均不給出


運行以上項目需要在Menifest文件註冊相關信息,和設置相關權限


1. <activity Android:name=".ResultActivity" 2.android:theme="@android:style/Theme.Dialog" 3.android:label="找到的單詞"> 4. </activity> 5. <provider android:name=".DictProvider" 6. android:authorities="org.crazyit.providers.dictprovider"/> 定義的工具類:Words.java


1.package wwj.dictprovider;

2.

3.import android.net.Uri; 4.

5.import android.provider.BaseColumns; 6.public final class Words 7.{

8. // 定義該ContentProvider的Authority 9. public static final String AUTHORITY 10. = "org.crazyit.providers.dictprovider"; 11. //定義一個靜態內部類 12. public static final class Word implements BaseColumns 13. {

14. // 定義Content所允許操作的3個數據列 15. public final static String _ID = "_id"; 16. public final static String WORD = "word"; 17. public final static String DETAIL = "detail"; 18. // 定義該Content提供服務的兩個Uri 19. public final static Uri DICT_CONTENT_URI = 20. Uri.parse("content://" + AUTHORITY + "/words"); 21. public final static Uri WORD_CONTENT_URI = 22. Uri.parse("content://" + AUTHORITY + "/word"); 23. }

24.}

因爲要用到SQLite數據庫,所以需要繼承SQLiteOpenHelper類


==>MyDatabaseHelper.java


1.package wwj.dictprovider;

2.

3.import android.content.Context; 4.import android.database.sqlite.SQLiteDatabase; 5.import android.database.sqlite.SQLiteOpenHelper; 6.

7.public class MyDatabaseHelper extends SQLiteOpenHelper 8.{

9. final String CREATE_TABLE_SQL = 10. "create table dict(_id integer primary key autoincrement , word , detail)"; 11. /** 12. * @param context

13. * @param name

14. * @param version

15. */

16. public MyDatabaseHelper(Context context, String name, int version) 17. {

18. super(context, name, null, version); 19. }

20.

21. @Override 22. public void onCreate(SQLiteDatabase db) 23. {

24. // 第一個使用數據庫時自動建表 25. db.execSQL(CREATE_TABLE_SQL);

26. }

27.

28. @Override 29. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 30. {

31. System.out.println("--------onUpdate Called--------" 32. + oldVersion + "--->" + newVersion); 33. }

34.}

實現ContentProvider類:DictProvider.java


1.package wwj.dictprovider;

2.

3.import android.content.ContentProvider; 4.import android.content.ContentUris; 5.import android.content.ContentValues; 6.import android.content.UriMatcher; 7.import android.database.Cursor; 8.import android.database.sqlite.SQLiteDatabase; 9.import android.net.Uri; 10.

11.public class DictProvider extends ContentProvider 12.{

13. private static UriMatcher matcher 14. = new UriMatcher(UriMatcher.NO_MATCH); 15. private static final int WORDS = 1; 16. private static final int WORD = 2; 17. private MyDatabaseHelper dbOpenHelper; 18. static 19. {

20. // 爲UriMatcher註冊兩個Uri 21. matcher.addURI(Words.AUTHORITY, "words", WORDS); 22. matcher.addURI(Words.AUTHORITY, "word/#", WORD); 23. }

24. // 第一次調用該DictProvider時,系統先創建DictProvider對象,並回調該方法 25. @Override 26. public boolean onCreate() 27. {

28. dbOpenHelper = new MyDatabaseHelper(this.getContext(), "myDict.db3", 1); 29. return true; 30. }

31. // 插入數據方法 32. @Override 33. public Uri insert(Uri uri, ContentValues values) 34. {

35. // 獲得數據庫實例 36. SQLiteDatabase db = dbOpenHelper.getReadableDatabase();

37. // 插入數據,返回行ID 38. long rowId = db.insert("dict", Words.Word._ID, values); 39. // 如果插入成功返回uri 40. if (rowId > 0) 41. {

42. // 在已有的 Uri的後面追加ID數據 43. Uri wordUri = ContentUris.withAppendedId(uri, rowId);

44. // 通知數據已經改變 45. getContext().getContentResolver().notifyChange(wordUri, null); 46. return wordUri; 47. }

48. return null; 49. }

50. // 刪除數據的方法 51. @Override 52. public int delete(Uri uri, String selection, String[] selectionArgs) 53. {

54. SQLiteDatabase db = dbOpenHelper.getReadableDatabase();

55. // 記錄所刪除的記錄數 56. int num = 0; 57. // 對於uri進行匹配。 58. switch (matcher.match(uri)) 59. {

60. case WORDS: 61. num = db.delete("dict", selection, selectionArgs); 62. break; 63. case WORD: 64. // 解析出所需要刪除的記錄ID 65. long id = ContentUris.parseId(uri); 66. String where = Words.Word._ID + "=" + id; 67. // 如果原來的where子句存在,拼接where子句 68. if (selection != null && !selection.equals("")) 69. {

70. where = where + " and " + selection; 71. }

72. num = db.delete("dict", where, selectionArgs); 73. break; 74. default: 75. throw new IllegalArgumentException("未知Uri:" + uri); 76. }

77. // 通知數據已經改變 78. getContext().getContentResolver().notifyChange(uri, null); 79. return num; 80. }

81. // 修改數據的方法 82. @Override 83. public int update(Uri uri, ContentValues values, String selection, 84. String[] selectionArgs)

85. {

86. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();

87. // 記錄所修改的記錄數 88. int num = 0; 89. switch (matcher.match(uri)) 90. {

91. case WORDS: 92. num = db.update("dict", values, selection, selectionArgs); 93. break; 94. case WORD: 95. // 解析出想修改的記錄ID 96. long id = ContentUris.parseId(uri); 97. String where = Words.Word._ID + "=" + id; 98. // 如果原來的where子句存在,拼接where子句 99. if (selection != null && !selection.equals("")) 100. {

101. where = where + " and " + selection; 102. }

103. num = db.update("dict", values, where, selectionArgs); 104. break; 105. default: 106. throw new IllegalArgumentException("未知Uri:" + uri); 107. }

108. // 通知數據已經改變 109. getContext().getContentResolver().notifyChange(uri, null); 110. return num; 111. }

112. // 查詢數據的方法 113. @Override 114. public Cursor query(Uri uri, String[] projection, String selection, 115. String[] selectionArgs, String sortOrder)

116. {

117. SQLiteDatabase db = dbOpenHelper.getReadableDatabase();

118. switch (matcher.match(uri)) 119. {

120. case WORDS: 121. // 執行查詢 122. return db.query("dict", projection, selection, selectionArgs, 123. null, null, sortOrder); 124. case WORD: 125. // 解析出想查詢的記錄ID 126. long id = ContentUris.parseId(uri); 127. String where = Words.Word._ID + "=" + id; 128. // 如果原來的where子句存在,拼接where子句 129. if (selection != null && !"".equals(selection)) 130. {

131. where = where + " and " + selection; 132. }

133. return db.query("dict", projection, where, selectionArgs, null, 134. null, sortOrder); 135. default: 136. throw new IllegalArgumentException("未知Uri:" + uri); 137. }

138. }

139. // 返回指定uri參數對應的數據的MIME類型 140. @Override 141. public String getType(Uri uri) 142. {

143. switch(matcher.match(uri)) 144. {

145. // 如果操作的數據是多項記錄 146. case WORDS: 147. return "vnd.android.cursor.dir/org.crazyit.dict"; 148. // 如果操作的數據是單項記錄 149. case WORD: 150. return "vnd.android.cursor.item/org.crazyit.dict"; 151. default: 152. throw new IllegalArgumentException("未知Uri:" + uri); 153. }

154. }

155.}

主Activity文件:DictResolver.java


1.package wwj.dictprovider;

2.

3.import java.util.ArrayList; 4.import java.util.HashMap; 5.import java.util.Map; 6.

7.import android.app.Activity; 8.import android.content.ContentResolver; 9.import android.content.ContentValues; 10.import android.content.Intent; 11.import android.database.Cursor; 12.import android.os.Bundle; 13.import android.view.View; 14.import android.view.View.OnClickListener; 15.import android.widget.Button; 16.import android.widget.EditText; 17.import android.widget.Toast; 18.

19.public class DictResolver extends Activity 20.{

21. ContentResolver contentResolver;

22. Button insert = null; 23. Button search = null; 24. @Override 25. public void onCreate(Bundle savedInstanceState) 26. {

27. super.onCreate(savedInstanceState); 28. setContentView(R.layout.main);

29. // 獲取系統的ContentResolver對象 30. contentResolver = getContentResolver();

31. insert = (Button)findViewById(R.id.insert);

32. search = (Button)findViewById(R.id.search);

33. // 爲insert按鈕的單擊事件綁定事件監聽器 34. insert.setOnClickListener(new OnClickListener() 35. {

36. @Override 37. public void onClick(View source) 38. {

39. //獲取用戶輸入 40. String word = ((EditText)findViewById(R.id.word))

41. .getText().toString();

42. String detail = ((EditText)findViewById(R.id.detail))

43. .getText().toString();

44. //插入生詞記錄 45. ContentValues values = new ContentValues(); 46. values.put(Words.Word.WORD , word);

47. values.put(Words.Word.DETAIL , detail);

48. contentResolver.insert(Words.Word.DICT_CONTENT_URI, values);

49. //顯示提示信息 50. Toast.makeText(DictResolver.this, "添加生詞成功!" , 8000) 51. .show();

52. }

53. });

54. // 爲search按鈕的單擊事件綁定事件監聽器 55. search.setOnClickListener(new OnClickListener() 56. {

57. @Override 58. public void onClick(View source) 59. {

60. // 獲取用戶輸入 61. String key = ((EditText) findViewById(R.id.key)).getText()

62. .toString();

63. // 執行查詢 64. Cursor cursor = contentResolver.query(

65. Words.Word.DICT_CONTENT_URI, null 66. , "word like ? or detail like ?" 67. , new String[]{"%" + key + "%" , "%" + key + "%"} 68. , null); 69. //創建一個Bundle對象 70. Bundle data = new Bundle(); 71. data.putSerializable("data", converCursorToList(cursor)); 72. //創建一個Intent 73. Intent intent = new Intent(DictResolver.this 74. , ResultActivity.class); 75. intent.putExtras(data);

76. //啓動Activity 77. startActivity(intent);

78. }

79. });

80. }

81.

82. private ArrayList<Map<String, String>> converCursorToList( 83. Cursor cursor)

84. {

85. ArrayList<Map<String, String>> result

86. = new ArrayList<Map<String, String>>(); 87. // 遍歷Cursor結果集 88. while (cursor.moveToNext()) 89. {

90. // 將結果集中的數據存入ArrayList中 91. Map<String, String> map = new HashMap<String, String>(); 92. // 取出查詢記錄中第2列、第3列的值 93. map.put(Words.Word.WORD, cursor.getString(1)); 94. map.put(Words.Word.DETAIL, cursor.getString(2)); 95. result.add(map);

96. }

97. return result; 98. }

99.}

ResultActivity.java


1.package wwj.dictprovider;

2.

3.import java.util.List; 4.import java.util.Map; 5.

6.import android.app.Activity; 7.import android.content.Intent; 8.import android.os.Bundle; 9.import android.widget.ListView; 10.import android.widget.SimpleAdapter; 11.

12.public class ResultActivity extends Activity{ 13. @Override 14. protected void onCreate(Bundle savedInstanceState) { 15. // TODO Auto-generated method stub 16. super.onCreate(savedInstanceState); 17. setContentView(R.layout.popup);

18. ListView listView = (ListView)findViewById(R.id.show);

19. Intent intent = getIntent();

20. //獲取該intent所攜帶的數據 21. Bundle data = intent.getExtras();

22. //從Bundle數據包中取出數據 23. @SuppressWarnings("unchecked") 24. List<Map<String, String>> list =

25. (List<Map<String, String>>)data.getSerializable("data"); 26. //將List封裝成SimpleAdapter 27. SimpleAdapter adapter = new SimpleAdapter(ResultActivity.this, list, R.layout.line 28. , new String[]{"word", "detail"} 29. , new int[]{R.id.word, R.id.detail}); 30. //填充ListView 31. listView.setAdapter(adapter);

32. }

33.}

本篇文章來源於 Linux公社網站(www.linuxidc.com) 原文鏈接:http://www.linuxidc.com/Linux/2012-08/67203.htm


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章