Android ContentProvider 实现应用间SQL

2017-10-07  本文已影响0人  CrazyBoomer

1.创建自定义类MyDatabaseHelper继承自SQLiteDatabaseHelper

public class MyDataBaseHelper extends SQLiteOpenHelper{
    //建表的常量SQL语句,表名dict,主键_id随加入数据自动+1,两列项word,detail
    final String CREATE_TABLE_SQL=
            "create table dict(_id integer primary key autoincrement,word,detail)";
    //重写父类构造函数
    public MyDataBaseHelper(Context context,String name,int verson){
        super(context, name, null, verson);
    }
    //数据库第一次创建时生成,对自带的SQLiteDatebase进行建表
    @Override
    public void onCreate(SQLiteDatabase arg0) {
        // TODO Auto-generated method stub
        arg0.execSQL(CREATE_TABLE_SQL);
    }
    //重写数据库的升级方法
    @Override
    public void onUpgrade(SQLiteDatabase db, int Oldversion, int newVersion) {
        // TODO Auto-generated method stub
        Log.i("onUpgrade", "void onUpgrade");
    }
}

其中需要注意的OnCreate方法官方文档如下


image.png

2.在MainActivity中实现数据库的增加,查找操作

public class MainActivity extends Activity {
    MyDataBaseHelper dbHelper;
    Button insert=null,search=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化数据库建表,参数上下文,数据库文件名,版本号
        dbHelper=new MyDataBaseHelper(this, "myDict.db3", 1);
        insert=(Button)findViewById(R.id.insert);
        search=(Button)findViewById(R.id.search);
        insert.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                String word=((EditText)findViewById(R.id.word)).getText().toString();
                String detial=((EditText)findViewById(R.id.detail)).getText().toString();
                //将word,detail写入数据库,getReadableDatabase()方法获得可读写数据库
                insertData(dbHelper.getReadableDatabase(), word, detial);
                Toast.makeText(MainActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
            }
        });
        search.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                String key=((EditText)findViewById(R.id.key)).getText().toString();
                //查找数据库中word或detail中带有key字样的数据行,将其保存到cursor
                Cursor cursor=
                        dbHelper.getReadableDatabase().rawQuery
                        ("select * from dict where word like ? or detail like ?",new String[]{"%"+key+"%","%"+key+"%"});
                Bundle data=new Bundle();
                data.putSerializable("data", converCursorToList(cursor));
                Intent intent=new Intent(MainActivity.this,ResultActivity.class);
                intent.putExtras(data);
                startActivity(intent);
            }
        });
    }
    
    protected ArrayList<Map<String,String>> converCursorToList(Cursor cursor){
        ArrayList<Map<String, String>>result=new ArrayList<Map<String,String>>();
        //当cursor的移动到的下一行不为空
        while(cursor.moveToNext()){
            Map<String, String>map=new HashMap<>();
            //分别将第二列,第三列中的数据写入map
            map.put("word", cursor.getString(1));
            map.put("detail", cursor.getString(2));
            result.add(map);
        }
        return result;
    }
    private void insertData(SQLiteDatabase db,String word,String detial){
        //将word,detail写入数据库,主键设置为null实现自+1
        db.execSQL("insert into dict values(null,?,?)",new String[]{word,detial});
    }
    @Override
    protected void onDestroy() {
        // 关闭数据库
        super.onDestroy();
        if(dbHelper!=null){
            dbHelper.close();
        }
    }
}

3.为ContentProvider写工具类Words便于维护

public final class Words {
    //ContentProvider的Authority
    public static final String AUTHORITY="com.example.mydict";
    public static final class Word implements BaseColumns{
        //允许操作的数据列
        public final  static String _ID="_id";
        public final  static String WORD="word";
        public final  static String DETAIL="detail";
        //提供服务的URI
        public final static Uri DIC_CONTENT=Uri.parse("content://"+AUTHORITY+"/words");
        public final static Uri WORD_CONTENT=Uri.parse("content://"+AUTHORITY+"/word");
        }
}

4.开发ContentProvider子类,重写其中的方法

public class DictProvider extends ContentProvider{
    //初始化静态比较对象matcher用于uri的比较
    private static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
    private static final int WORDS=1;
    private static final int WORD=2;
    private MyDataBaseHelper dbOpenHelper;
    //静态块初始化matcher所比较的URI
    //如果uri匹配com.example.mydict/words,返回1
    //如果uri匹配com.example.mydict/word/任意字符串,返回2
    static{
        matcher.addURI(Words.AUTHORITY, "words", WORDS);
        matcher.addURI(Words.AUTHORITY, "word/#", WORD);
    }
    @Override
    public int delete(Uri uri, String where, String[] whereArgs) {
        SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
        int num=0;
        switch(matcher.match(uri)){
        case WORDS:
            num=db.delete("dict", where, whereArgs);
            break;
        case WORD:
            long id=ContentUris.parseId(uri);
            String whereClause=Words.Word._ID+"="+id;
            if(where!=null&&!where.equals("")){
                whereClause=whereClause+" and "+where;
            }
            num=db.delete("dict", whereClause, whereArgs);
            break;
        default:
            throw new IllegalArgumentException("未知UrI"+uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);
        return num;
    }
    @Override
    public String getType(Uri arg0) {
        switch (matcher.match(arg0)) {
        case WORDS:
            return "vnd.android.cursor.dir/com.example.mydict";
        case WORD:
            return "vnd.android.cursor.item/com.example.mydict";
        default:
            throw new IllegalArgumentException("未知uri"+arg0);
        }
        
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
        switch(matcher.match(uri)){
            case WORDS:
                long rowId=db.insert("dict", Words.Word._ID, values);
                if(rowId>0){
                    //在已有uri后增加rowId
                    Uri wordUri=ContentUris.withAppendedId(uri, rowId);
                    //通知数据已经改变
                    getContext().getContentResolver().notifyChange(wordUri, null);
                    return wordUri;
                }
                break;
            default:
                throw new IllegalArgumentException("未知URI"+uri);
        }
        return null;
    }

    @Override
    public boolean onCreate() {
        // TODO Auto-generated method stub
        dbOpenHelper=new MyDataBaseHelper(this.getContext(), "myDict.db3", 1);
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String where, String[] whereArgs,
            String sortOrder) {
        SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
        switch (matcher.match(uri)) {
        case WORDS:
            return db.query("dict",  projection, where, whereArgs, null, null, sortOrder);
        case WORD:
            long id=ContentUris.parseId(uri);
            String whereClause=Words.Word._ID+"="+id;
            if(where!=null&&!"".equals(where)){
                whereClause=whereClause+" and "+where;
            }
            return db.query("dict",  projection, whereClause, whereArgs, null, null, sortOrder);
        default:
            throw new IllegalArgumentException("未知URI"+uri);
        }
    }

    @Override
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
        SQLiteDatabase db=dbOpenHelper.getWritableDatabase();
        int num=0;
        switch (matcher.match(uri)) {
        case WORDS:
            num=db.update("dict", values, where, whereArgs);
            break;
        case WORD:
            long id=ContentUris.parseId(uri);
            String whereClause=Words.Word._ID+"="+id;
            if(where!=null&&!where.equals("")){
                whereClause=whereClause+" and "+id;
            }
            db.update("dict", values, whereClause, whereArgs);
            break;
        default:throw new IllegalArgumentException("未知URI"+uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);
        return num;
    }
}

5.在新的应用中编写工具类(同原应用)

public final class Words
{
    // 定义该ContentProvider的Authority
    public static final String AUTHORITY 
        = "com.example.mydict";
    //定义一个静态内部类
    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");     
    }
}

6.在新的应用的MainActivity中通过ContentReceiver调用ContentProvider中的查找,插入方法,使得两个应用共享数据库

public class MainActivity extends Activity {
    ContentResolver contentResolver;
    Button insert,search;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        contentResolver=getContentResolver();
        insert=(Button)findViewById(R.id.insert);
        search=(Button)findViewById(R.id.search);
        insert.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                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(MainActivity.this, "添加成功",Toast.LENGTH_SHORT).show();
            }
        });
        search.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                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 data=new Bundle();
                data.putSerializable("data", converCursorToList(cursor));
                Intent intent=new Intent(MainActivity.this,ResultActivity.class);
                intent.putExtras(data);
                startActivity(intent);
            }
        });
    }
    protected ArrayList<Map<String,String>> converCursorToList(Cursor cursor){
        ArrayList<Map<String, String>>result=new ArrayList<Map<String,String>>();
        while(cursor.moveToNext()){
            Map<String, String>map=new HashMap<String, String>();
            map.put("word", cursor.getString(1));
            map.put("detail", cursor.getString(2));
            result.add(map);
        }
        return result;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读