2016-05-11安卓四大组件 内容提供者contentprovider +数据库+解析者

Posted 暴走灬青春

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2016-05-11安卓四大组件 内容提供者contentprovider +数据库+解析者相关的知识,希望对你有一定的参考价值。

MainActivity:

package com.guyulei.contentprovider;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    



MyContentProvider:

package com.guyulei.contentprovider;

import com.guyulei.sqlite.mysqliteOpenHelper;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;

public class MyContentProvider extends ContentProvider 
    /*
     * 创建自己的类MyContentProvider 继承ContentProvider
     * ContentProvider封装自己的数据库 并提供给外部  作为中介
     * 比如 :手机应用中心 xx宝    读取系统短信  通讯录等等
     */
    /*内容提供者的注册
     * android:authorities   主机
     * android:exported="true"  对外可以访问
     * <provider 
            android:name="com.guyulei.contentprovider.MyContentProvider"
            android:authorities="com.guyulei.user.provider"
            android:exported="true">
        </provider>
     */
    private static final String TAG = "guyulei";
    private MySqliteOpenHelper mySqliteOpenHelper;
    private SQLiteDatabase database;

    /*
     * 生命uri地址解析器   UriMatcher (匹配器)将表名  解析出来
     * 默认 不匹配
     * 解析过程  是个匹配的过程    思想很重要   将我们所有需要解析的表放到静态代码块内
     */
    private static final UriMatcher urimatcher = new UriMatcher(UriMatcher.NO_MATCH);
    private static final String AUTHORITY = "com.guyulei.user.provider";
    private static final String G_USER = "g_user";
    private static final int G_CODE = 1;
    private static final String Z_USER = "z_user";
    private static final int Z_CODE = 2;
    //静态代码块
    //g_user......G_CODE.....匹配成功返回1
    //z_user......Z_CODE.....匹配成功返回2
    static
        //给urimatcher  增加我们需要的匹配  其自己识别到底是哪个表
        urimatcher.addURI(AUTHORITY, G_USER, G_CODE);
        urimatcher.addURI(AUTHORITY, Z_USER, Z_CODE);
    

    @Override
    //第一次创建组件时调用   主线程中调用  四大组件 必须注册
    public boolean onCreate() 
        //数据库类的对象
        mySqliteOpenHelper = new MySqliteOpenHelper(getContext());
        database = mySqliteOpenHelper.getWritableDatabase();

        /*
         * 对于返回值true 和 false 目前没有影响都可以
         * 建议使用true
         */
        return true;
    
    /*
     * 插入数据
     * Uri uri:内容提供者要访问的地址 
     * values:要插入的数据
     */
    @Override
    public Uri insert(Uri uri, ContentValues values) 
        Log.d(TAG, "uri="+uri+".....ThreamName="+Thread.currentThread().getName());
        /*
         * uri是提供者和解析者之间的桥梁
         * 作为两者的返回值
         * 问题解决:解析者向提供者  提供uri 里面包含  表名
         * 需要解析出来
         */

        //插入成功返回id
        /*
         * 到底插哪个表 uri匹配器进行匹配解析
         */
        String tableName = getTableName(uri);
        if(TextUtils.isEmpty(tableName))
            return null;
        
        long i = database.insert(tableName, null, values);
        Log.d(TAG, "插入"+tableName+"成功后的id为:"+i);

        //安卓自带工具类      追加id 到uri后面的函数
        Uri withAppendedId = ContentUris.withAppendedId(uri, i);
        //将新的组合的  Uri返回
        return withAppendedId;
    
    public String getTableName(Uri uri) 
        int match = urimatcher.match(uri);
        //对match进行分析  思想啊思想 
        String tableName = "";
        switch(match)
        case G_CODE:
            tableName = G_USER;
            break;
        case Z_CODE:
            tableName = Z_USER;
            break;
        case UriMatcher.NO_MATCH:
            Log.d(TAG, "您的uri传错啦 "+uri);
            break;

        default:
            break;
        
        return tableName;
    
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) 
        String tableName = getTableName(uri);
        //返回游标    接收解析者 传来的参数    进行查询
        Cursor cursor = database.query(tableName, projection, selection, selectionArgs, null, null, sortOrder);


        //注意返回值
        return cursor;
    

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



    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) 
        // TODO Auto-generated method stub
        return 0;
    

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) 
        // TODO Auto-generated method stub
        return 0;
    


数据库:
MySqliteOpenHelper:

package com.guyulei.sqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class MySqliteOpenHelper extends SQLiteOpenHelper 

    private static final String TAG = "guyulei";

    //自带构造函数参数太多   将其私有  自己再创建一个
    private MySqliteOpenHelper(Context context, String name,
            CursorFactory factory, int version) 
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    
    //重写构造方法需要注意:形参的个数可以少  下面传的时候 不能少 可以固定
    //如:this(context,"user.db",null,1);
    //如果一个类  不能和其他类联系  需要用时  可以 通过自定义的构造函数
    public MySqliteOpenHelper(Context context)
        this(context,"user.db",null,1);
    

    @Override
    public void onCreate(SQLiteDatabase db) 
        String g_sql = "create table g_user(c_id integer primary key,c_name varchar(20),c_age integer);";
        String z_sql = "create table z_user(c_id integer primary key,c_name varchar(20),c_age integer);";
        db.execSQL(g_sql);
        db.execSQL(z_sql);
        Log.d(TAG, "数据库表创建成功了!");
    

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
        // TODO Auto-generated method stub

    


内容解析者:
MainActivity:

package com.guyulei.contentresolver;

import java.util.ArrayList;
import java.util.List;

import com.guyulei.user.User;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity 

    private ListView lv_query;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv_query = (ListView) findViewById(R.id.lv_query);
    
    /*
     * 解析者 向 提供者的g_user 表中插入数据
     * 先拿到解析者对象
     * 
     * 内容提供者的书写规范
     * content://com.guyulei.provider/user/01
     * schema        主机名authority    path  ID
     * content://   双斜杠 不能错
     * content://com.guyulei.contentprovider.MyContentProvider  错误
     * content://com.guyulei.user.provider  正确     是主机authority  不是上面的name  注意
     */
    public void insertuser(View view) 
        //拿到解析者对象   系统提供的函数
        ContentResolver contentResolver = getContentResolver();
        //插入数据
        Uri url = Uri.parse("content://com.guyulei.user.provider/g_user");
        ContentValues values = new ContentValues();
        values.put("c_name", "guyulei");
        values.put("c_age", 22);
        /*
         * 解析者向提供者插入数据   提供者给解析者 返回一个Uri insert
         * 提供者本身自己也返回 Uri 类型
         * public Uri insert(Uri uri, ContentValues values)
         * 插入成功之后返回一个int
         * long i = database.insert("g_user", null, values);
         * 整个过程是:解析者向提供者  传递一个数据插入到表里   提供者拿到这个数据后  由提供者自己去进行数据库插入
         * 插入返回的int  i  是返回给了提供者   
         * 现在将int  i 整合在 提供者的自身的返回值URI里     再将这个新的URI  回传给解析者
         */
        Uri insert = contentResolver.insert(url, values);
        //同样使用工具类  将id解析出来
        long id = ContentUris.parseId(insert);

        Toast.makeText(this, "插入完毕后的id为:"+id, Toast.LENGTH_LONG).show();
    
    /*
     * 向z_user表中插入数据
     */
    public void insertz_user(View view) 
        //拿到解析者
        ContentResolver contentResolver = getContentResolver();
        //解析者向提供者  提交需要插入 数据
        /*
         * 新的问题:
         * 当表很多的时候, 因为解析者不直接指定插哪个表   那么 提供者将不知道 往哪个表里插入
         * 此时需要path  指定往哪个表里插入
         * content://com.guyulei.provider/user/01
         * schema        主机名authority    path  ID
         */
        Uri url = Uri.parse("content://com.guyulei.user.provider/z_user");
        ContentValues values = new ContentValues();
        values.put("c_name", "zhouhongwei");
        values.put("c_age", 25);
        Uri insert = contentResolver.insert(url, values );
        long id = ContentUris.parseId(insert);
        Toast.makeText(this, "插入完毕后的id为:"+id, Toast.LENGTH_LONG).show();
    

    public void queryz_user(View view) 
        List<User> users = new ArrayList<User>();
        //拿到解析者
        ContentResolver contentResolver = getContentResolver();
        //解析者设置查询数据条件  查询出来的数据在listview 内显示
        Uri uri = Uri.parse("content://com.guyulei.user.provider/z_user");

        String[] projection = new String[]"c_name","c_age";
        Cursor cursor = contentResolver.query(uri, projection , null, null, "c_age desc");

        while(cursor.moveToNext())
            User user = new User();
            user.name = cursor.getString(0);
            user.age = Integer.parseInt(cursor.getString(1));
            users.add(user);
        
        cursor.close();
        lv_query.setAdapter(new ArrayAdapter<User>(this, android.R.layout.simple_list_item_1,users));

    

User:

package com.guyulei.user;

public class User 
    public String name;
    public int age;
    public User() 
        super();
        // TODO Auto-generated constructor stub
    
    public User(String name, int age) 
        super();
        this.name = name;
        this.age = age;
    
    public String getName() 
        return name;
    
    public void setName(String name) 
        this.name = name;
    
    public int getAge() 
        return age;
    
    public void setAge(int age) 
        this.age = age;
    
    @Override
    public String toString() 
        return "User [name=" + name + ", age=" + age + "]";
    




以上是关于2016-05-11安卓四大组件 内容提供者contentprovider +数据库+解析者的主要内容,如果未能解决你的问题,请参考以下文章

Android安卓四大组件之内容提供者

安卓基础之 四大基本组件介绍与生命周期

Android安卓四大组件之Activity

Android安卓四大组件之Activity

入门篇:9.组件4:ContentProvider(内容提供者)

安卓四大组件的作用安卓Service的作用