• Android 四大组件学习之ContentProvider二


    上节学习了什么是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。用于插入数据。布局文件为四个button


    既然一切都准备好了。

    我们就插入一组数据:

    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();   
        }

    当点击insertbutton后须要插入的数据

        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中当点击deletebutton后:

        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当点击updatebutton运行的操作:

        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就到这里,我们实现了所以的增删改查操作。






  • 相关阅读:
    css技巧和经验列表
    CSS3嵌入字体@font-face调用字体
    新闻列表单行滚动(多行显示)简洁向上滚动js效果
    打破构图的平衡!增强设计感染力
    何以双十(补昨天)
    MySQL5.7 基于二进制包的安装
    Nginx Log日志统计分析常用命令
    MySQL错误代码大全
    MVC4中的Display Mode简介
    ReadOnly关键字修饰的变量可以修改,只是不能重新分配
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7097694.html
Copyright © 2020-2023  润新知