在android开发中,有时需要在一个应用中调用操作系统中的另一个应用,而这个操作需要用到contentprovider,今天学习自定义的contentprovider,在android中contentprovider实际上是操作sqlite数据库来增删查改数据的,所以我们需要先写一个继承自SqliteOpenhelper的类,来创建数据库
MysqliteOpenhelper类
public class MySqliteOpenhelper extends SQLiteOpenHelper { private String dbName = "people.db"; public MySqliteOpenhelper(Context context, String name, CursorFactory factory, int version) { super(context, name, null,1); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub //创建userinfo表的sql语句 String sql = "create table userinfo(id int auto_increate,name varchar(30),age int,phone varchar(50))"; db.execSQL(sql);//创建表 } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { // TODO Auto-generated method stub } }
接下来创建需要操作的UserInfo实体类
public class UserInfo { private int id; private String name; private String phone; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public UserInfo(int id, String name, String phone, int age) { super(); this.id = id; this.name = name; this.phone = phone; this.age = age; } public UserInfo(String name, String phone, int age) { super(); this.name = name; this.phone = phone; this.age = age; } @Override public String toString() { return "UserInfo [id=" + id + ", name=" + name + ", phone=" + phone + ", age=" + age + "]"; } <span style="color:#ff0000;"> }</span>创建需要向其他应用提供数据操作的contentprovider,MyContentProvider类
public class MyContentProvider extends ContentProvider { private UriMatcher uriMatcher;//声明需要封装uri的urimatcher private MySqliteOpenhelper helper;//声明创建数据库的helper private static final int USERINFO = 1; private static final int USERINFOS = 2; @Override public boolean onCreate() { // TODO Auto-generated method stub uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //添加uri uriMatcher.addURI("com.test.self.provider","userinfo/#",USERINFO);//#是一个通配符 uriMatcher.addURI("com.test.self.provider","userinfos",USERINFOS);//整张表 helper = new MySqliteOpenhelper(getContext()); return true; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub SQLiteDatabase db = helper.getWritableDatabase(); int deleteNumber; switch (uriMatcher.match(uri)) { case USERINFOS://删除全部数据 deleteNumber = db.delete("userinfo",selection,selectionArgs); return deleteNumber; case USERINFO: long id = ContentUris.parseId(uri);//解析得到需要删除的行的id String where = "id="+id; if (selection != null && !"".equals(selection)) {//如果有其他条件 where = selection +" and "+where; } deleteNumber = db.delete("userinfo",where,selectionArgs); return deleteNumber; default: throw new IllegalArgumentException("unknow uri:"+uri); } } @Override public String getType(Uri arg0) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub SQLiteDatabase db = helper.getWritableDatabase(); long insertId; switch (uriMatcher.match(uri)) { case USERINFOS: insertId = db.insert("userinfo",null,values);//null表示每一列都插入 return ContentUris.withAppendedId(uri, insertId);//更新uri default: throw new IllegalArgumentException("unknow uri:"+uri); } } @Override public Cursor query(Uri uri, String[] projection, String where, String[] whereArgs, String sortOrder) { // TODO Auto-generated method stub Cursor cursor; SQLiteDatabase db = helper.getWritableDatabase();//得到创建好的db数据库 switch (uriMatcher.match(uri)) { case USERINFO://content://com.test.self.provider/userinfo/4,,,,对id为4的userinfo查询操作 long id = ContentUris.parseId(uri);//解析得到id,即id=4 String wheres = "id="+id; if (null != where && !"".equals(where)) { wheres = where +" and "+wheres; } cursor = db.query("userinfo",projection,wheres,whereArgs,null,null,sortOrder); return cursor; case USERINFOS://查询所有 cursor = db.query("userinfo",projection,where,whereArgs,null,null,sortOrder); return cursor; default: throw new IllegalArgumentException("unknow uri:"+uri); } } @Override public int update(Uri uri, ContentValues values, String where, String[] whereArgs) { // TODO Auto-generated method stub SQLiteDatabase db = helper.getWritableDatabase(); int updateNumber; switch (uriMatcher.match(uri)) { case USERINFOS://更改所有数据 updateNumber = db.update("userinfo",values,where, whereArgs); return updateNumber; case USERINFO://更改一条数据 long id = ContentUris.parseId(uri); String whereClause = "id="+id; if (where != null && !"".equals(where)) { whereClause = where + " and "+whereClause; } updateNumber= db.update("userinfo", values, whereClause, whereArgs); return updateNumber; default: throw new IllegalArgumentException("unknow uri:"+uri); } } }
<provider android:name="com.example.mycontentprovider.MyContentProvider" android:authorities="com.test.self.provider" android:exported="true" >新建一个应用,调用contentprovider操作数据
public class MainActivity extends Activity { private Button addone; private Button addall; private Button deleteone; private Button deleteall; private Button queryone; private Button queryall; private Button updateone; private Button updateall; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addone = (Button) findViewById(R.id.addone); addall = (Button) findViewById(R.id.addAll); deleteone = (Button) findViewById(R.id.deleteone); deleteall = (Button) findViewById(R.id.deleteall); queryone = (Button) findViewById(R.id.queryone); queryall = (Button) findViewById(R.id.queryall); updateone = (Button) findViewById(R.id.updateone); updateall = (Button) findViewById(R.id.updateall); addone.setOnClickListener(new MyClickListener()); addall.setOnClickListener(new MyClickListener()); deleteone.setOnClickListener(new MyClickListener()); deleteall.setOnClickListener(new MyClickListener()); queryone.setOnClickListener(new MyClickListener()); queryall.setOnClickListener(new MyClickListener()); updateone.setOnClickListener(new MyClickListener()); updateall.setOnClickListener(new MyClickListener()); } public class MyClickListener implements OnClickListener { Uri uri = null; Cursor cursor; @Override public void onClick(View view) { // TODO Auto-generated method stub switch (view.getId()) { case R.id.addone: uri = Uri.parse("content://com.test.self.provider/userinfos"); ContentValues values = new ContentValues(); values.put("name","wangwu"); values.put("phone","264546"); values.put("age", 20); getContentResolver().insert(uri, values); break; case R.id.addAll: uri = Uri.parse("conent://com.test.self.provider/userinfos"); for (int i = 0; i < 5; i++) { ContentValues values2 = new ContentValues(); values2.put("name","zhangsan"); values2.put("phone","264546"); values2.put("age", 20); getContentResolver().insert(uri, values2); } case R.id.deleteone: uri = Uri.parse("conent://com.test.self.provider/userinfo/3");//删除第三条数据 getContentResolver().delete(uri, null, null); case R.id.deleteall: uri = uri.parse("conent://com.test.self.provider/userinfos"); getContentResolver().delete(uri, null, null); case R.id.queryone: uri = Uri.parse("conent://com.test.self.provider/userinfo/6");//查询第六条数据 cursor = getContentResolver().query(uri, null, null, null, null); if (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); String phone = cursor.getString(cursor.getColumnIndex("phone")); System.out.println("id---"+id+"--name--"+name+"--age--"+age+"--phone--"+phone); } cursor.close(); case R.id.queryall: uri = Uri.parse("conent://com.test.self.provider/userinfos"); cursor = getContentResolver().query(uri, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); String phone = cursor.getString(cursor.getColumnIndex("phone")); System.out.println("id---"+id+"--name--"+name+"--age--"+age+"--phone--"+phone); } cursor.close(); case R.id.updateone: uri = Uri.parse("conent://com.test.self.provider/userinfo/6"); ContentValues values3 = new ContentValues(); values3.put("age",50); getContentResolver().update(uri, values3, null, null); case R.id.updateall: uri = Uri.parse("conent://com.test.self.provider/userinfos"); ContentValues values4 = new ContentValues(); values4.put("name","lisi"); getContentResolver().update(uri, values4, null,null); default: break; } } } }该mainactivity的布局代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <Button android:id="@+id/addone" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="addone" /> <Button android:id="@+id/addAll" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="addall" /> <Button android:id="@+id/deleteone" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="deleteone" /> <Button android:id="@+id/deleteall" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="deleteall" /> <Button android:id="@+id/queryone" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="queryone" /> <Button android:id="@+id/queryall" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="queryall" /> <Button android:id="@+id/updateone" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="updateone" /> <Button android:id="@+id/updateall" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="updateall" /> </LinearLayout>