加入收藏 | 设为首页 | 会员中心 | 我要投稿 江门站长网 (https://www.0750zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Android开发学习之使用ContentProvider达成数据共享

发布时间:2021-11-22 14:45:27 所属栏目:教程 来源:互联网
导读:ContentProvider是我学习安卓这几个月以来碰到最难理解的一块,感觉很难掌握,不知道如何使用这一块内容,有些方法的参数使用起来真的是令人发指,我也不打算一下子把全部内容都运用自如,那是不可能的事情,下面是学习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);  
    }  
}  

(编辑:江门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读