歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android開發學習之使用ContentProvider實現數據共享

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

日期:2017/3/1 10:14:09   编辑:Linux編程

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

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

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

創建項目:DictProvider

項目運行效果:

下面只給出主要代碼布局文件和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. import android.net.Uri;
  3. import android.provider.BaseColumns;
  4. public final class Words
  5. {
  6. // 定義該ContentProvider的Authority
  7. public static final String AUTHORITY
  8. = "org.crazyit.providers.dictprovider";
  9. //定義一個靜態內部類
  10. public static final class Word implements BaseColumns
  11. {
  12. // 定義Content所允許操作的3個數據列
  13. public final static String _ID = "_id";
  14. public final static String WORD = "word";
  15. public final static String DETAIL = "detail";
  16. // 定義該Content提供服務的兩個Uri
  17. public final static Uri DICT_CONTENT_URI =
  18. Uri.parse("content://" + AUTHORITY + "/words");
  19. public final static Uri WORD_CONTENT_URI =
  20. Uri.parse("content://" + AUTHORITY + "/word");
  21. }
  22. }

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

==>MyDatabaseHelper.java

  1. package wwj.dictprovider;
  2. import android.content.Context;
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.database.sqlite.SQLiteOpenHelper;
  5. public class MyDatabaseHelper extends SQLiteOpenHelper
  6. {
  7. final String CREATE_TABLE_SQL =
  8. "create table dict(_id integer primary key autoincrement , word , detail)";
  9. /**
  10. * @param context
  11. * @param name
  12. * @param version
  13. */
  14. public MyDatabaseHelper(Context context, String name, int version)
  15. {
  16. super(context, name, null, version);
  17. }
  18. @Override
  19. public void onCreate(SQLiteDatabase db)
  20. {
  21. // 第一個使用數據庫時自動建表
  22. db.execSQL(CREATE_TABLE_SQL);
  23. }
  24. @Override
  25. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
  26. {
  27. System.out.println("--------onUpdate Called--------"
  28. + oldVersion + "--->" + newVersion);
  29. }
  30. }

實現ContentProvider類:DictProvider.java

  1. package wwj.dictprovider;
  2. import android.content.ContentProvider;
  3. import android.content.ContentUris;
  4. import android.content.ContentValues;
  5. import android.content.UriMatcher;
  6. import android.database.Cursor;
  7. import android.database.sqlite.SQLiteDatabase;
  8. import android.net.Uri;
  9. public class DictProvider extends ContentProvider
  10. {
  11. private static UriMatcher matcher
  12. = new UriMatcher(UriMatcher.NO_MATCH);
  13. private static final int WORDS = 1;
  14. private static final int WORD = 2;
  15. private MyDatabaseHelper dbOpenHelper;
  16. static
  17. {
  18. // 為UriMatcher注冊兩個Uri
  19. matcher.addURI(Words.AUTHORITY, "words", WORDS);
  20. matcher.addURI(Words.AUTHORITY, "word/#", WORD);
  21. }
  22. // 第一次調用該DictProvider時,系統先創建DictProvider對象,並回調該方法
  23. @Override
  24. public boolean onCreate()
  25. {
  26. dbOpenHelper = new MyDatabaseHelper(this.getContext(), "myDict.db3", 1);
  27. return true;
  28. }
  29. // 插入數據方法
  30. @Override
  31. public Uri insert(Uri uri, ContentValues values)
  32. {
  33. // 獲得數據庫實例
  34. SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
  35. // 插入數據,返回行ID
  36. long rowId = db.insert("dict", Words.Word._ID, values);
  37. // 如果插入成功返回uri
  38. if (rowId > 0)
  39. {
  40. // 在已有的 Uri的後面追加ID數據
  41. Uri wordUri = ContentUris.withAppendedId(uri, rowId);
  42. // 通知數據已經改變
  43. getContext().getContentResolver().notifyChange(wordUri, null);
  44. return wordUri;
  45. }
  46. return null;
  47. }
  48. // 刪除數據的方法
  49. @Override
  50. public int delete(Uri uri, String selection, String[] selectionArgs)
  51. {
  52. SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
  53. // 記錄所刪除的記錄數
  54. int num = 0;
  55. // 對於uri進行匹配。
  56. switch (matcher.match(uri))
  57. {
  58. case WORDS:
  59. num = db.delete("dict", selection, selectionArgs);
  60. break;
  61. case WORD:
  62. // 解析出所需要刪除的記錄ID
  63. long id = ContentUris.parseId(uri);
  64. String where = Words.Word._ID + "=" + id;
  65. // 如果原來的where子句存在,拼接where子句
  66. if (selection != null && !selection.equals(""))
  67. {
  68. where = where + " and " + selection;
  69. }
  70. num = db.delete("dict", where, selectionArgs);
  71. break;
  72. default:
  73. throw new IllegalArgumentException("未知Uri:" + uri);
  74. }
  75. // 通知數據已經改變
  76. getContext().getContentResolver().notifyChange(uri, null);
  77. return num;
  78. }
  79. // 修改數據的方法
  80. @Override
  81. public int update(Uri uri, ContentValues values, String selection,
  82. String[] selectionArgs)
  83. {
  84. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  85. // 記錄所修改的記錄數
  86. int num = 0;
  87. switch (matcher.match(uri))
  88. {
  89. case WORDS:
  90. num = db.update("dict", values, selection, selectionArgs);
  91. break;
  92. case WORD:
  93. // 解析出想修改的記錄ID
  94. long id = ContentUris.parseId(uri);
  95. String where = Words.Word._ID + "=" + id;
  96. // 如果原來的where子句存在,拼接where子句
  97. if (selection != null && !selection.equals(""))
  98. {
  99. where = where + " and " + selection;
  100. }
  101. num = db.update("dict", values, where, selectionArgs);
  102. break;
  103. default:
  104. throw new IllegalArgumentException("未知Uri:" + uri);
  105. }
  106. // 通知數據已經改變
  107. getContext().getContentResolver().notifyChange(uri, null);
  108. return num;
  109. }
  110. // 查詢數據的方法
  111. @Override
  112. public Cursor query(Uri uri, String[] projection, String selection,
  113. String[] selectionArgs, String sortOrder)
  114. {
  115. SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
  116. switch (matcher.match(uri))
  117. {
  118. case WORDS:
  119. // 執行查詢
  120. return db.query("dict", projection, selection, selectionArgs,
  121. null, null, sortOrder);
  122. case WORD:
  123. // 解析出想查詢的記錄ID
  124. long id = ContentUris.parseId(uri);
  125. String where = Words.Word._ID + "=" + id;
  126. // 如果原來的where子句存在,拼接where子句
  127. if (selection != null && !"".equals(selection))
  128. {
  129. where = where + " and " + selection;
  130. }
  131. return db.query("dict", projection, where, selectionArgs, null,
  132. null, sortOrder);
  133. default:
  134. throw new IllegalArgumentException("未知Uri:" + uri);
  135. }
  136. }
  137. // 返回指定uri參數對應的數據的MIME類型
  138. @Override
  139. public String getType(Uri uri)
  140. {
  141. switch(matcher.match(uri))
  142. {
  143. // 如果操作的數據是多項記錄
  144. case WORDS:
  145. return "vnd.android.cursor.dir/org.crazyit.dict";
  146. // 如果操作的數據是單項記錄
  147. case WORD:
  148. return "vnd.android.cursor.item/org.crazyit.dict";
  149. default:
  150. throw new IllegalArgumentException("未知Uri:" + uri);
  151. }
  152. }
  153. }

主Activity文件:DictResolver.java

  1. package wwj.dictprovider;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import android.app.Activity;
  6. import android.content.ContentResolver;
  7. import android.content.ContentValues;
  8. import android.content.Intent;
  9. import android.database.Cursor;
  10. import android.os.Bundle;
  11. import android.view.View;
  12. import android.view.View.OnClickListener;
  13. import android.widget.Button;
  14. import android.widget.EditText;
  15. import android.widget.Toast;
  16. public class DictResolver extends Activity
  17. {
  18. ContentResolver contentResolver;
  19. Button insert = null;
  20. Button search = null;
  21. @Override
  22. public void onCreate(Bundle savedInstanceState)
  23. {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.main);
  26. // 獲取系統的ContentResolver對象
  27. contentResolver = getContentResolver();
  28. insert = (Button)findViewById(R.id.insert);
  29. search = (Button)findViewById(R.id.search);
  30. // 為insert按鈕的單擊事件綁定事件監聽器
  31. insert.setOnClickListener(new OnClickListener()
  32. {
  33. @Override
  34. public void onClick(View source)
  35. {
  36. //獲取用戶輸入
  37. String word = ((EditText)findViewById(R.id.word))
  38. .getText().toString();
  39. String detail = ((EditText)findViewById(R.id.detail))
  40. .getText().toString();
  41. //插入生詞記錄
  42. ContentValues values = new ContentValues();
  43. values.put(Words.Word.WORD , word);
  44. values.put(Words.Word.DETAIL , detail);
  45. contentResolver.insert(Words.Word.DICT_CONTENT_URI, values);
  46. //顯示提示信息
  47. Toast.makeText(DictResolver.this, "添加生詞成功!" , 8000)
  48. .show();
  49. }
  50. });
  51. // 為search按鈕的單擊事件綁定事件監聽器
  52. search.setOnClickListener(new OnClickListener()
  53. {
  54. @Override
  55. public void onClick(View source)
  56. {
  57. // 獲取用戶輸入
  58. String key = ((EditText) findViewById(R.id.key)).getText()
  59. .toString();
  60. // 執行查詢
  61. Cursor cursor = contentResolver.query(
  62. Words.Word.DICT_CONTENT_URI, null
  63. , "word like ? or detail like ?"
  64. , new String[]{"%" + key + "%" , "%" + key + "%"}
  65. , null);
  66. //創建一個Bundle對象
  67. Bundle data = new Bundle();
  68. data.putSerializable("data", converCursorToList(cursor));
  69. //創建一個Intent
  70. Intent intent = new Intent(DictResolver.this
  71. , ResultActivity.class);
  72. intent.putExtras(data);
  73. //啟動Activity
  74. startActivity(intent);
  75. }
  76. });
  77. }
  78. private ArrayList<Map<String, String>> converCursorToList(
  79. Cursor cursor)
  80. {
  81. ArrayList<Map<String, String>> result
  82. = new ArrayList<Map<String, String>>();
  83. // 遍歷Cursor結果集
  84. while (cursor.moveToNext())
  85. {
  86. // 將結果集中的數據存入ArrayList中
  87. Map<String, String> map = new HashMap<String, String>();
  88. // 取出查詢記錄中第2列、第3列的值
  89. map.put(Words.Word.WORD, cursor.getString(1));
  90. map.put(Words.Word.DETAIL, cursor.getString(2));
  91. result.add(map);
  92. }
  93. return result;
  94. }
  95. }

ResultActivity.java

  1. package wwj.dictprovider;
  2. import java.util.List;
  3. import java.util.Map;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.os.Bundle;
  7. import android.widget.ListView;
  8. import android.widget.SimpleAdapter;
  9. public class ResultActivity extends Activity{
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. // TODO Auto-generated method stub
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.popup);
  15. ListView listView = (ListView)findViewById(R.id.show);
  16. Intent intent = getIntent();
  17. //獲取該intent所攜帶的數據
  18. Bundle data = intent.getExtras();
  19. //從Bundle數據包中取出數據
  20. @SuppressWarnings("unchecked")
  21. List<Map<String, String>> list =
  22. (List<Map<String, String>>)data.getSerializable("data");
  23. //將List封裝成SimpleAdapter
  24. SimpleAdapter adapter = new SimpleAdapter(ResultActivity.this, list, R.layout.line
  25. , new String[]{"word", "detail"}
  26. , new int[]{R.id.word, R.id.detail});
  27. //填充ListView
  28. listView.setAdapter(adapter);
  29. }
  30. }
Copyright © Linux教程網 All Rights Reserved