您的位置:首页 > 移动开发 > Android开发

Android 四大组件学习之ContentProvider二

2015-07-23 17:07 666 查看
上节学习了什么是ContentProvider,以及ContentProvider的作用。以及什么是URL。本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider

好,实践是检验真理的唯一标准。 那我们就开始行动吧

第一步: 创建一个自己的ContentProvider,我取名为MyContentProvider

public class MyContentProvider extends ContentProvider {

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

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

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

@Override
public boolean onCreate() {
// TODO Auto-generated method stub
return false;
}

@Override
public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
String arg4) {
// TODO Auto-generated method stub
return null;
}

@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
// TODO Auto-generated method stub
return 0;
}
}这些方法很熟悉吧。 这不是数据库常见的增删改查吗? 原来ContentProvider为我们提供了所以的数据库的操作。我们只需调用实现即可。
第二步: 创建一个SQLiteOpenHelper类,我取名为MyDbOpenHelper

public class MyDbOpenHelper extends SQLiteOpenHelper {

public String TABLE_NAME="user";
public MyDbOpenHelper(Context context) {
super(context, "user.db", null, 1);
// TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table user(_id integer primary key autoincrement, name char(10), age integer(2), salary integer(10))");
}

@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub

}
}在create方法中创建table为user的数据表
第三步: 在配置文件中注册ContentProvider

<provider android:name="com.ui.contentprovider.MyContentProvider"
android:authorities="com.ui.contentprovider" url路径
android:exported="true"> 暴露自己需要打开
</provider>

第四步:再创建一个Activity,用于插入数据。布局文件为四个按钮

既然一切都准备好了。 我们就插入一组数据:

Activity的OnCreate方法

public class MainActivity extends Activity {

    ContentResolver cResolver;
    //得到自己定义的ContentProvider的url
    Uri uri=Uri.parse("content://com.ui.contentprovider/");
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*得到ContentResolver*/
        cResolver = getContentResolver();   
    }

当点击insert按钮后需要插入的数据
public void insert(View v)
{
Log.i("MainActivity", "---------insert");
ContentValues values = new ContentValues();

values.put("name", "张三");
values.put("age", 20);
values.put("salary", 13000);
cResolver.insert(uri, values);

values.put("name", "李四");
values.put("age", 19);
values.put("salary", 10000);
cResolver.insert(uri, values);

values.put("name", "王五");
values.put("age", 40);
values.put("salary", 200000);
cResolver.insert(uri, values);

values.put("name", "朱八");
values.put("age", 10);
values.put("salary", 2000);
cResolver.insert(uri, values);
}
此时ContentProvider中给第三方提供的insert方法需要实现:

public class MyContentProvider extends ContentProvider {

private MyDbOpenHelper dhHelper;
private SQLiteDatabase db;

@Override
public boolean onCreate() {
Log.i("MyContentProvider", "onCreate");

//调用MyDbOpenHelper的onCreate方法创建数据库
dhHelper = new MyDbOpenHelper(getContext());
db = dhHelper.getWritableDatabase();
return false;
}

//插入第三方应用的数据
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.i("MyContentProvider", "insert");
db.insert(dhHelper.TABLE_NAME, null, values);
return uri;
}
测试如下: 先运行ContentProvider所在的Activity, 在运行第三方应用,得到结果为:



接下来,看一下删除的操作, 我们删除名字为王五的同学:

Activity中当点击delete按钮后:

public void delete(View v)
{
Log.i("MainActivity", "---------delete");
cResolver.delete(uri, "name = ?", new String[]{"王五"});
}

ContentProvider中的delete需要改为:
@Override
public int delete(Uri arg0, String whereClause, String[] whereArgs) {
Log.i("MyContentProvider", "delete");
db.delete(dhHelper.TABLE_NAME, whereClause, whereArgs);
return 0;
}

运行结果为:



接下来学习修改操作, 由于朱八同学最近表现比较好,老板给加薪了。 加了500

activity当点击update按钮执行的操作:
public void update(View v)
{
Log.i("MainActivity", "---------update");
ContentValues values = new ContentValues();
values.put("salary", 2500);
cResolver.update(uri, values, "name = ?", new String[]{"朱八"});
}

ContentProvider中修改为:
@Override
public int update(Uri arg0, ContentValues values, String whereClause, String[] whereArgs) {
Log.i("MyContentProvider", "update");
int id = db.update(dhHelper.TABLE_NAME, values, whereClause, whereArgs);
return id;
}

运行效果为:



接下来最后一个操作,查询操作,查询工资大于等于10000的:

Activity的代码:

public void query(View v)
{
Cursor cursor = cResolver.query(uri, null, "salary >= ?", new String[]{"10000"}, null);
Log.i("MainActivity", "---------query");
while(cursor.moveToNext())
{
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
int salary = cursor.getInt(cursor.getColumnIndex("salary"));
System.out.println(name + ";" + age + ";" + salary);
}
}

ContentProvider中的需要修改的代码:
@Override
public Cursor query(Uri arg0, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
Log.i("MyContentProvider", "query");
Cursor cursor = db.query(dhHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}


串口的打印:



好, 关于自己定义自己的ContentProvider就到这里,我们实现了所以的增删改查操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息