Android ContentProvider的基本使用1(内容提供者)

来源:互联网 发布:java内容管理系统 编辑:程序博客网 时间:2024/04/29 12:53

一个人做到只剩了回忆的时候,生涯大概总要算是无聊了吧,但有时竟会连回忆也没有。

                                            鲁迅《朝花夕拾》

今天我们来了解一下ContentProvider 底层做法
内容提供者三要素:1 内容(数据)
2 名字(唯一)
3开放

ContentProvider 内容提供者 数据都在系统自带的表里,所以手机要Root 没有Root就看不到表

Db类

public class DbHelper extends SQLiteOpenHelper {    /**     *     * @param context  上下文     * @param name    名字(数据库名),文件名     * @param factory 游标工厂,多数情况:null     * @param version 数据库版本     */    public DbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);        Log.i("test","构造");    }    @Override    public void onCreate(SQLiteDatabase sqLiteDatabase) {        //操作:创建表的操作        Log.i("test","创建表");        sqLiteDatabase.execSQL("create table person(_id integer primary key autoincrement,name,age)");    }    @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {        Log.i("test","数据库版本,低--->高");    }}

MainActivity

public class MainActivity extends ListActivity {    private EditText et_main_id;    private EditText et_main_name;    private EditText et_main_age;    private SQLiteDatabase database;    private ListView listview;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        et_main_id = (EditText) findViewById(R.id.et_main_id);        et_main_name = (EditText) findViewById(R.id.et_main_name);        et_main_age = (EditText) findViewById(R.id.et_main_age);        listview = getListView();        //GO        //Java        //php        DbHelper dbHelper=new DbHelper(this,"G150831.db",null,2);        database = dbHelper.getReadableDatabase();        //Hibernate  session        //查询数据        //cursor  游标       Cursor cursor=database.query(false,"person",null,null,null,null,null,null,"2,2");        //List<Person>        //循环游标,---。List<Map<Styring,?>>        //BaseAdapter  SimpleAdater        SimpleCursorAdapter simpleCursorAdapter=new SimpleCursorAdapter(this,R.layout.item_listview,cursor,new String[]{"_id","name","age"},new int[]{R.id.tv_item_list_id,R.id.tv_item_list_name,R.id.tv_item_list_age});        listview.setAdapter(simpleCursorAdapter);//        database.rawQuery()    }    public void save(View view){        String name=et_main_name.getText().toString();        String age=et_main_age.getText().toString();        //存到数据库//        ContentValues values=new ContentValues();//Map//        values.put("name",name);//        values.put("age",age);//        values.putNull("_id");//        database.insert("person","name",values);        //HQL QBC 纯(原)        for (int i = 0; i <100 ; i++) {            database.execSQL("insert into person values(null,?,?)",new String[]{name+i,age});        }        Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();    }}

MyProvider

public class MyProvider extends ContentProvider {    private SQLiteDatabase sqLiteDatabase;    private UriMatcher uriMatcher;    private static final int PERSONS = 1;    private static final int PERSON = 2;    @Override    public boolean onCreate() {        Log.i("test", "onCreate");        DbHelper dbHelper = new DbHelper(getContext(), "G150831.db", null, 2);        sqLiteDatabase = dbHelper.getReadableDatabase();        //实例化Uri匹配器        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);        //添加匹配规则        //http://locahost:8080/xxx/ooo.action        uriMatcher.addURI("com.zking.g150831_android16_sqlite.person", "persons", MyProvider.PERSONS);        uriMatcher.addURI("com.zking.g150831_android16_sqlite.person", "persons/#", MyProvider.PERSON);        return false;    }    @Nullable    @Override    public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {        Log.i("test", "query");        int code = uriMatcher.match(uri);        switch (code) {            case MyProvider.PERSONS:                Log.i("test", "query所有");                //查询所有数据                return sqLiteDatabase.query(true, "person", strings, s, strings1, null, null, s1, null);            case MyProvider.PERSON:                Log.i("test", "query单个");                //获取#的值                long id = ContentUris.parseId(uri);                return sqLiteDatabase.rawQuery("select * from person where _id=?", new String[]{id + ""});        }        return null;    }    @Nullable    @Override    public String getType(Uri uri) {        Log.i("test", "getType");        return null;    }    @Nullable    @Override    public Uri insert(Uri uri, ContentValues values) {        Log.i("test", "insert");        return null;    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        Log.i("test", "delete");        return 0;    }    @Override    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {        Log.i("test", "update");        return 0;    }}

在清单文件中配置

 <!--配置内容提供者-->        <provider            android:authorities="com.zking.g150831_android16_sqlite.person"            android:name="com.zking.provider.MyProvider"            android:exported="true"            ></provider>

ContentResolver 内容访问者
activity_main

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    android:orientation="vertical"    tools:context="com.zking.risk_android_contentresolver.MainActivity">    <EditText        android:id="@+id/et_main_id"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="getData"        android:text="获取数据" /></LinearLayout>

Main

public class MainActivity extends AppCompatActivity {    private ContentResolver cr;    private EditText et_main_id;    private Uri uri;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //获取内容访问者        cr = getContentResolver();        et_main_id = (EditText) findViewById(R.id.et_main_id);    }    public void getData(View view){        if(TextUtils.isEmpty(et_main_id.getText())){            //查询所有            //            uri = Uri.parse("content://com.zking.g150831_android16_sqlite.person/persons");        }else{            //查询单个            String id=et_main_id.getText().toString();            uri = Uri.parse("content://com.zking.g150831_android16_sqlite.person/persons/"+id);        }        Cursor cursor=cr.query(uri,null,null,null,null);        //查询单个        //01.   条件_id=3        //02.   网页:?id=4        //03.URI匹配器        //SimpleCursorAdapter        while(cursor.moveToNext()){            int id=cursor.getInt(cursor.getColumnIndex("_id"));            String name=cursor.getString(cursor.getColumnIndex("name"));            int age=cursor.getInt(cursor.getColumnIndex("age"));            Log.i("test",id+" "+name+" ");        }    }}
0 0