Android-ContentProvider内容提供者

来源:互联网 发布:matlab求解最优化问题 编辑:程序博客网 时间:2024/06/05 06:01

一、ContentProvider的概念

 ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider

1、ContentProvider使用表的形式来组织数据
   无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格
2、ContentProvider提供的方法
   query:查询
   insert:插入
   update:更新
   delete:删除
   getType:得到数据类型
   onCreate:创建数据时调用的回调函数
3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中

二、ContentProvider的内部原理

自定义一个ContentProvider,来实现内部原理
  步骤:
  1、定义一个CONTENT_URI常量(里面的字符串必须是唯一)
  Public static final Uri CONTENT_URI = Uri.parse(“content://com.example.sj_provider.data”);
  如果有子表,URI为:
  Public static final Uri CONTENT_URI = Uri.parse(“content://com.example.sj_provider.data/users”);
  2、定义一个类,继承ContentProvider
  Public class MyContentProvider extends ContentProvider
  3、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)

二、ContentProvider的三要素

1.内容(数据)

2.名字(唯一的)

3.开放

下面小编实现了个查询的简单小列子

这里写图片描述
activity_main.xml

 <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="ID:"        android:id="@+id/et_main_id"        />    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="pname:"        android:id="@+id/et_main_pname"        />    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="page:"        android:id="@+id/et_main_page"        />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal"        >        <Button            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="保存"            android:onClick="save"            />        <Button            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="查询"            android:onClick="query"            />    </LinearLayout>    <ListView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@android:id/list"        ></ListView>

item_listview.xml

 <TextView        android:layout_width="0dp"        android:layout_height="wrap_content"        android:id="@+id/tv_item_listview_id"        android:layout_weight="1"        />    <TextView        android:layout_width="0dp"        android:layout_height="wrap_content"        android:id="@+id/tv_item_listview_pnane"        android:layout_weight="1"        />    <TextView        android:layout_width="0dp"        android:layout_height="wrap_content"        android:id="@+id/tv_item_listview_page"        android:layout_weight="1"        />

DbHelper.java

public class DbHelper extends SQLiteOpenHelper {    public DbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);        Log.i("test","DbHelper构造");    }    /**     * 创建表的操作     * @param sqLiteDatabase     */    @Override    public void onCreate(SQLiteDatabase sqLiteDatabase) {        Log.i("test","创建表");        sqLiteDatabase.execSQL("create table person(_id integer primary key autoincrement,pname,page)");    }    @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {        Log.i("test","onUpgrade");    }}

Mainactivity.java

public class MainActivity extends ListActivity {    private EditText et_main_id;    private EditText et_main_pname;    private EditText et_main_page;    private SQLiteDatabase db;    private ListView listView;    private Cursor cursor;    private SimpleCursorAdapter simpleCursorAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //打乱集合中的数据//        Collections.shuffle();        DbHelper dbHelper=new DbHelper(this,"questions.db",null,2);        db = dbHelper.getReadableDatabase();        initViews();        cursor=getPersons(null);//查询到所有数据        //适配器        //ArrayAdapter SimpleAdapter(List<Map>)  BaseAdapter        //SimpleCursorAdapter        simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.item_listview,cursor,new String[]{"_id","pname","page"},new int[]{R.id.tv_item_listview_id,R.id.tv_item_listview_pnane,R.id.tv_item_listview_page});        //设置适配器        listView.setAdapter(simpleCursorAdapter);    }    private void initViews() {        et_main_id = (EditText) findViewById(R.id.et_main_id);        et_main_pname = (EditText) findViewById(R.id.et_main_pname);        et_main_page = (EditText) findViewById(R.id.et_main_page);        listView = getListView();    }    public void save(View view){        //获取名字和年龄        String pname=et_main_pname.getText().toString();        String page=et_main_page.getText().toString();        ContentValues values=new ContentValues();//Map        values.put("pname",pname);        values.put("page",page);        values.putNull("_id");        db.insert("person","pname",values);        cursor=getPersons(null);        //通知适配器数据发生改变        simpleCursorAdapter.changeCursor(cursor);    }    public void query(View view){        //判断ID是否为空        if(TextUtils.isEmpty(et_main_id.getText())){            //查询所有            cursor=getPersons(null);        }else{            //查询单个            String id=et_main_id.getText().toString();            cursor=getPersons(id);        }        //通知适配器数据发生改变        simpleCursorAdapter.changeCursor(cursor);    }    /**     * 从数据库中查询     * 1.查询所有     * 2.查询单个     */    public Cursor getPersons(String id){        if(TextUtils.isEmpty(id)){            //查询所有            //游标            cursor = db.query(false,"person",null,null,null,null,null,null,null);        }else{            //查询单个            cursor = db.query(false,"person",null,"_id=?",new String[]{id},null,null,null,null);        }//        db.rawQuery()        return cursor;    }}

MyProvider.java

public class MyProvider extends ContentProvider {    private DbHelper dbHelper;    private SQLiteDatabase db;    private UriMatcher uriMatcher;    private Cursor c;    @Override    public boolean onCreate() {        Log.i("test","onCreate");        dbHelper = new DbHelper(getContext(),"questions.db",null,2);        db = dbHelper.getReadableDatabase();        //实例化URI匹配器        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);        //给匹配器中添加匹配规则        //查询所有        uriMatcher.addURI("com.example.sj_provider.data","persons",0);        //查询单个        uriMatcher.addURI("com.example.sj_provider.data","persons/#",1);        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 0:                //查询所有                c = db.query(false,"person",strings,s,strings1,null,null,s1,null);                return c;            case 1:                //得到#的值                long id=ContentUris.parseId(uri);                //查询单个:                c= db.query(false,"person",strings,"_id=?",new String[]{id+""},null,null,s1,null);                return c;        }        return null;    }    @Nullable    @Override    public String getType(Uri uri) {        return null;    }    @Nullable    @Override    public Uri insert(Uri uri, ContentValues contentValues) {        Log.i("test","insert");        return null;    }    @Override    public int delete(Uri uri, String s, String[] strings) {        Log.i("test","delete");        return 0;    }    @Override    public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {        Log.i("test","update");        return 0;    }}

AndroidManifest.xml

 <provider            android:authorities="com.example.sj_provider.data"            android:name="com.example.sj_provider.MyProvider"            android:exported="true"            >        </provider>
0 0
原创粉丝点击