[android] 内容提供者实现

by admin on 2018年12月14日

 

 

content://主机名/update 修改操作

此地清单文件被假诺读写短信的权限

content://主机名/query 查询操作

调用resolver对象的insert(uri,values)方法,参数:Uri对象,ContentValues对象

 

 

[android] 内容提供者实现

动线程来实现了几秒后又运行就段先后,直接new Thread的匿名内部类,类里再写run()方法,拿到的目的调用start()方法,开启新线程,调用Thread类的sleep()方法睡一段时间再为生运作。

每当ddms面板上左侧的过程列表,点击上边工具栏的stop按钮,关闭进程,当自己调用ContentProvider的时,进程会重复拉开。

调用ContentValues对象的put(key,value)方法,key就是达同样节约之字段,val值,date是时间戳,调用系统的工夫System.current提姆(Tim)e米尔(Mill)ies()方法

 

 

 

获取ContentResolver对象,通过getContentResolver()方法

哲学原理,大多数时,我们且并未机会去形容是ContentProvider,精晓这一个原理之后,就设进来重点了,当大家只要取出联系人之数码,短信的数额,浏览器书签的数额等之早晚,我们就得用到其了,通过翻阅源代码搞懂他们之Uri和内需传入的参数,更好的使用她

谷歌市场高达出这多少个用,模拟短信,原理就是是把数量插入到短信应用之数据库里

获取Uri对象,通过Uri类的parse(uriString)方法,参数:content://主机名/操作名

activity:

2.query(uri,projection,selection,selectArgs,sortOrder) (参数:Uri对象别人传过来的uri,字段,条件,条件对应的参数,排序)

package com.tsh.makesms;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.net.Uri;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //开启线程,延迟20秒
        new Thread(){
            public void run(){
                try {
                    Thread.sleep(20000);
                    ContentResolver resolver=getContentResolver();
                    Uri url=Uri.parse("content://sms/");
                    ContentValues values=new ContentValues();
                    values.put("address", "10086");
                    values.put("type", 1);
                    values.put("date", System.currentTimeMillis());
                    values.put("body", "我是10086的,快开门");
                    resolver.insert(url, values);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }.start();

    }

}

测试报错权限问题 清单文件加是 android:exported=”true”

再次回到一组数return “vnd.android.cursor.dir”

测试是ContentProvider,新建一个拔取,得到手机的中,通过getContentResolver()方法得到ContentResolver对象

3.getType(uri),再次回到这么些uri的mime类型

UriMatcher类,new出来目的new UriMatcher(code) code是个int,表示未匹配到的回值,一般采取常量UriMatcher.NO_MATCH是-1,把他定义成静态成员属性。

及一致节省之主机名类似网络上的域名,协议是content://,能够定义一下条条框框

 

package com.tsh.database;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class PersonDbProvider extends ContentProvider {
    private static final int INSERT = 1;
    private static final int SELECT = 2;
    private static final int DELETE = 3;
    private static final int UPDATE = 4;
    private static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
    private PersonSQLiteOpenHelper helper;
    static{
        //增加一组规则
        matcher.addURI("com.tsh.database.personprovider", "insert", INSERT);
        matcher.addURI("com.tsh.database.personprovider", "select", SELECT);
        matcher.addURI("com.tsh.database.personprovider", "delete", DELETE);
        matcher.addURI("com.tsh.database.personprovider", "update", UPDATE);
    }
    //初始化helper
    @Override
    public boolean onCreate() {
        helper=new PersonSQLiteOpenHelper(getContext());
        return false;
    }
    //查询
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        //验证
        if(matcher.match(uri)==SELECT){
            SQLiteDatabase db=helper.getReadableDatabase();
            Cursor cursor=db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
            return cursor;
        }
        return null;
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

}

 

content://主机名/delete 删除操作

概念一个静态代码块来测试一下之matcher,static{},调用UriMatcher对象的addURI(authorities,path,code)方法,参数authorities是String主机名,path是String操作名,code是int匹配成功的重临值一般定义成常量private static final int增删查改七只常量。这么些尽管是补充加相同组匹配规则

实现的首要性方法

 

测试:

        ContentResolver resolver=getContentResolver();
        Uri uri=Uri.parse("content://com.tsh.database.personprovider/select");
        Cursor cursor=resolver.query(uri, null, null, null, null);
        while(cursor.moveToNext()){
            String name=cursor.getString(cursor.getColumnIndex("name"));
            System.out.println("name"+name);
        }
        cursor.close();

艺术中调用matcher对象的match(uri)方法,对所传的uri举行匹配,假诺成功就回去点定义之匹配码,匹配成功调用helper对象的getReadableDatabase()方法获取数据库对象,调用db对象的query(table,columns,selection,selectionArgs,groupby,having,orderBy)方法得到Cursor结果集对象,细节db不使close了,框架会自动关闭

调用ContentResolver对象的query(uri,projection,selection,selectArgs,sortOrder)方法,(参数:Uri对象别人传过来的uri,字段,条件,条件对应的参数,排序),重返Cursor对象。

content://主机名/insert 添加操作

 

 

1.onCreate()方法

规则定义好下,我们得分析一下那么些字符串,系统提供了一个api来配合这一个字符串

再次回到一修数据return “vnd.android.cursor.item”

Uri也堪加个#表示的凡数字,使用ContentUris类的parseId()方法取出#的值

情提供者:

当内容提供者那些看似开启之时光回调此方法,初步化数据库协助对象要PersonSQLiteHelper

 

While循环Cursor对象。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图