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就到这里,我们实现了所以的增删改查操作。
好,实践是检验真理的唯一标准。 那我们就开始行动吧
第一步: 创建一个自己的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就到这里,我们实现了所以的增删改查操作。
相关文章推荐
- 自定义ContentProvider
- 【Android基础知识】ContentProvider(二)自定义ContentProvider和URI
- android developer tiny share-201704014
- android developer tiny share-201704017
- android developer tiny share-201704017
- android developer tiny share-201704014
- Android5.1显示YUV格式图片 Demo
- android gen错误:/albume/gen already exists but is not a source folder.
- anroid ListView描述
- Android平移动画
- Android平移动画
- Android基础_活动_启动模式
- Android Studio快捷键大全
- android双卡发短信,基于5.1.1实现
- Android4.4 WifiP2pSettings 中调用流程
- 在64位ubuntu15.04中安装android studio 开发环境
- Android碎片第二期
- Android 抽屉效果的导航菜单实现
- 浅谈android应用性能之内存(转)
- BaseActivity框架搭建