Android开发学习之使用ContentProvider实现数据共享
Android开发学习之使用ContentProvider实现数据共享
ContentProvider是我学习安卓这几个月以来碰到最难理解的一块,感觉很难掌握,不知道如何使用这一块内容,有些方法的参数使用起来真的是令人发指,我也不打算一下子把全部内容都运用自如,那是不可能的事情,下面是学习ContentProvider所实现的一个实例:
实例:使用ContentProvider共享生词本数据
这个实例可以简单实现添加生词和查询生词的功能,我原本想扩展一下这个应用程序的功能,但却不知道从何做起,只是简简单单换了了界面背景就是了。
创建项目:DictProvider
项目运行效果:
下面只给出主要代码布局文件和string资源文件均不给出
运行以上项目需要在Menifest文件注册相关信息,和设置相关权限
- <activity Android:name=".ResultActivity"
- android:theme="@android:style/Theme.Dialog"
- android:label="找到的单词">
- </activity>
- <provider android:name=".DictProvider"
- android:authorities="org.crazyit.providers.dictprovider"/>
定义的工具类:Words.java
- package wwj.dictprovider;
- import android.net.Uri;
- import android.provider.BaseColumns;
- public final class Words
- {
- // 定义该ContentProvider的Authority
- public static final String AUTHORITY
- = "org.crazyit.providers.dictprovider";
- //定义一个静态内部类
- public static final class Word implements BaseColumns
- {
- // 定义Content所允许操作的3个数据列
- public final static String _ID = "_id";
- public final static String WORD = "word";
- public final static String DETAIL = "detail";
- // 定义该Content提供服务的两个Uri
- public final static Uri DICT_CONTENT_URI =
- Uri.parse("content://" + AUTHORITY + "/words");
- public final static Uri WORD_CONTENT_URI =
- Uri.parse("content://" + AUTHORITY + "/word");
- }
- }
因为要用到SQLite数据库,所以需要继承SQLiteOpenHelper类
==>MyDatabaseHelper.java
- package wwj.dictprovider;
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteOpenHelper;
- public class MyDatabaseHelper extends SQLiteOpenHelper
- {
- final String CREATE_TABLE_SQL =
- "create table dict(_id integer primary key autoincrement , word , detail)";
- /**
- * @param context
- * @param name
- * @param version
- */
- public MyDatabaseHelper(Context context, String name, int version)
- {
- super(context, name, null, version);
- }
- @Override
- public void onCreate(SQLiteDatabase db)
- {
- // 第一个使用数据库时自动建表
- db.execSQL(CREATE_TABLE_SQL);
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
- {
- System.out.println("--------onUpdate Called--------"
- + oldVersion + "--->" + newVersion);
- }
- }
实现ContentProvider类:DictProvider.java
- package wwj.dictprovider;
- import android.content.ContentProvider;
- import android.content.ContentUris;
- import android.content.ContentValues;
- import android.content.UriMatcher;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- import android.net.Uri;
- public class DictProvider extends ContentProvider
- {
- private static UriMatcher matcher
- = new UriMatcher(UriMatcher.NO_MATCH);
- private static final int WORDS = 1;
- private static final int WORD = 2;
- private MyDatabaseHelper dbOpenHelper;
- static
- {
- // 为UriMatcher注册两个Uri
- matcher.addURI(Words.AUTHORITY, "words", WORDS);
- matcher.addURI(Words.AUTHORITY, "word/#", WORD);
- }
- // 第一次调用该DictProvider时,系统先创建DictProvider对象,并回调该方法
- @Override
- public boolean onCreate()
- {
- dbOpenHelper = new MyDatabaseHelper(this.getContext(), "myDict.db3", 1);
- return true;
- }
- // 插入数据方法
- @Override
- public Uri insert(Uri uri, ContentValues values)
- {
- // 获得数据库实例
- SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
- // 插入数据,返回行ID
- long rowId = db.insert("dict", Words.Word._ID, values);
- // 如果插入成功返回uri
- if (rowId > 0)
- {
- // 在已有的 Uri的后面追加ID数据
- Uri wordUri = ContentUris.withAppendedId(uri, rowId);
- // 通知数据已经改变
- getContext().getContentResolver().notifyChange(wordUri, null);
- return wordUri;
- }
- return null;
- }
- // 删除数据的方法
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs)
- {
- SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
- // 记录所删除的记录数
- int num = 0;
- // 对于uri进行匹配。
- switch (matcher.match(uri))
- {
- case WORDS:
- num = db.delete("dict", selection, selectionArgs);
- break;
- case WORD:
- // 解析出所需要删除的记录ID
- long id = ContentUris.parseId(uri);
- String where = Words.Word._ID + "=" + id;
- // 如果原来的where子句存在,拼接where子句
- if (selection != null && !selection.equals(""))
- {
- where = where + " and " + selection;
- }
- num = db.delete("dict", where, selectionArgs);
- break;
- default:
- throw new IllegalArgumentException("未知Uri:" + uri);
- }
- // 通知数据已经改变
- getContext().getContentResolver().notifyChange(uri, null);
- return num;
- }
- // 修改数据的方法
- @Override
- public int update(Uri uri, ContentValues values, String selection,
- String[] selectionArgs)
- {
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- // 记录所修改的记录数
- int num = 0;
- switch (matcher.match(uri))
- {
- case WORDS:
- num = db.update("dict", values, selection, selectionArgs);
- break;
- case WORD:
- // 解析出想修改的记录ID
- long id = ContentUris.parseId(uri);
- String where = Words.Word._ID + "=" + id;
- // 如果原来的where子句存在,拼接where子句
- if (selection != null && !selection.equals(""))
- {
- where = where + " and " + selection;
- }
- num = db.update("dict", values, where, selectionArgs);
- break;
- default:
- throw new IllegalArgumentException("未知Uri:" + uri);
- }
- // 通知数据已经改变
- getContext().getContentResolver().notifyChange(uri, null);
- return num;
- }
- // 查询数据的方法
- @Override
- public Cursor query(Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder)
- {
- SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
- switch (matcher.match(uri))
- {
- case WORDS:
- // 执行查询
- return db.query("dict", projection, selection, selectionArgs,
- null, null, sortOrder);
- case WORD:
- // 解析出想查询的记录ID
- long id = ContentUris.parseId(uri);
- String where = Words.Word._ID + "=" + id;
- // 如果原来的where子句存在,拼接where子句
- if (selection != null && !"".equals(selection))
- {
- where = where + " and " + selection;
- }
- return db.query("dict", projection, where, selectionArgs, null,
- null, sortOrder);
- default:
- throw new IllegalArgumentException("未知Uri:" + uri);
- }
- }
- // 返回指定uri参数对应的数据的MIME类型
- @Override
- public String getType(Uri uri)
- {
- switch(matcher.match(uri))
- {
- // 如果操作的数据是多项记录
- case WORDS:
- return "vnd.android.cursor.dir/org.crazyit.dict";
- // 如果操作的数据是单项记录
- case WORD:
- return "vnd.android.cursor.item/org.crazyit.dict";
- default:
- throw new IllegalArgumentException("未知Uri:" + uri);
- }
- }
- }
主Activity文件:DictResolver.java
- package wwj.dictprovider;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Map;
- import android.app.Activity;
- import android.content.ContentResolver;
- import android.content.ContentValues;
- import android.content.Intent;
- import android.database.Cursor;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.Toast;
- public class DictResolver extends Activity
- {
- ContentResolver contentResolver;
- Button insert = null;
- Button search = null;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // 获取系统的ContentResolver对象
- contentResolver = getContentResolver();
- insert = (Button)findViewById(R.id.insert);
- search = (Button)findViewById(R.id.search);
- // 为insert按钮的单击事件绑定事件监听器
- insert.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View source)
- {
- //获取用户输入
- String word = ((EditText)findViewById(R.id.word))
- .getText().toString();
- String detail = ((EditText)findViewById(R.id.detail))
- .getText().toString();
- //插入生词记录
- ContentValues values = new ContentValues();
- values.put(Words.Word.WORD , word);
- values.put(Words.Word.DETAIL , detail);
- contentResolver.insert(Words.Word.DICT_CONTENT_URI, values);
- //显示提示信息
- Toast.makeText(DictResolver.this, "添加生词成功!" , 8000)
- .show();
- }
- });
- // 为search按钮的单击事件绑定事件监听器
- search.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View source)
- {
- // 获取用户输入
- String key = ((EditText) findViewById(R.id.key)).getText()
- .toString();
- // 执行查询
- Cursor cursor = contentResolver.query(
- Words.Word.DICT_CONTENT_URI, null
- , "word like ? or detail like ?"
- , new String[]{"%" + key + "%" , "%" + key + "%"}
- , null);
- //创建一个Bundle对象
- Bundle data = new Bundle();
- data.putSerializable("data", converCursorToList(cursor));
- //创建一个Intent
- Intent intent = new Intent(DictResolver.this
- , ResultActivity.class);
- intent.putExtras(data);
- //启动Activity
- startActivity(intent);
- }
- });
- }
- private ArrayList<Map<String, String>> converCursorToList(
- Cursor cursor)
- {
- ArrayList<Map<String, String>> result
- = new ArrayList<Map<String, String>>();
- // 遍历Cursor结果集
- while (cursor.moveToNext())
- {
- // 将结果集中的数据存入ArrayList中
- Map<String, String> map = new HashMap<String, String>();
- // 取出查询记录中第2列、第3列的值
- map.put(Words.Word.WORD, cursor.getString(1));
- map.put(Words.Word.DETAIL, cursor.getString(2));
- result.add(map);
- }
- return result;
- }
- }
ResultActivity.java
- package wwj.dictprovider;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.widget.ListView;
- import android.widget.SimpleAdapter;
- public class ResultActivity extends Activity{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.popup);
- ListView listView = (ListView)findViewById(R.id.show);
- Intent intent = getIntent();
- //获取该intent所携带的数据
- Bundle data = intent.getExtras();
- //从Bundle数据包中取出数据
- @SuppressWarnings("unchecked")
- List<Map<String, String>> list =
- (List<Map<String, String>>)data.getSerializable("data");
- //将List封装成SimpleAdapter
- SimpleAdapter adapter = new SimpleAdapter(ResultActivity.this, list, R.layout.line
- , new String[]{"word", "detail"}
- , new int[]{R.id.word, R.id.detail});
- //填充ListView
- listView.setAdapter(adapter);
- }
- }
评论暂时关闭