android-contentProvide基础例子

来源:互联网 发布:黑马程序员 达内 编辑:程序博客网 时间:2024/06/06 12:33
 

----------------------------------------------------------------------------UserProvider ---------------------------------------------------------------------------------------------

package com.newer.cp.demo;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;

import com.newer.cp.entity.User;

//BaseDAO
public class UserProvider extends ContentProvider {
 private static final UriMatcher uriMatcher;
 private SQLiteDatabase sd = null;
 
 private static final int MULTIPLE_USER = 1;
 private static final int SINGLE_USER = 2;
 //一、完成另一个应用程序传入Uri的解析
 //用户当前需要操作数据的方式
 static{
  
   uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
       
        //查找一条记录 //CONTENT:// AUTHORITY/多条记录操作方式
        uriMatcher.addURI(User.AUTHORITY, User.PATH_MULTIPLE, MULTIPLE_USER);//1
       
        //查找多条记录
        uriMatcher.addURI(User.AUTHORITY, User.PATH_SINGLE, SINGLE_USER);//2  
  
 } 
 
 //获取用户操作数据的类型Uri uri
 //单条记录
 //多条记录
 //由UriMatcher(Uri匹配)
 //对用户传入的Uri进行解析
 //获取用户操作数据的类型
 @Override
 public String getType(Uri uri) {
  //match(uri)
  //对传入的Uri进行解析
  //获取操作的类型
  switch(uriMatcher.match(uri)){
  case MULTIPLE_USER://1
   //操作数据的类型
   return User.MINE_TYPE_MULTIPLE;
  case SINGLE_USER:
   return User.MINE_TYPE_SINGLE;
  default:
   throw new IllegalArgumentException("Unkown uri:"+uri);
  }
 }
 
 //二、同样通过SqliteOpenHelpe完成数据库建立操作
 //重写的onCreate方法中完成数据库的建立
 class MyDataHelper extends SQLiteOpenHelper{
  
  String sql = "create table user (_id integer primary key autoincrement, " +
    "name text not null, age integer, height float);";

  public MyDataHelper(Context context, String name,
    CursorFactory factory, int version) {
   super(context, name, factory, version);
   // TODO Auto-generated constructor stub
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
   // TODO Auto-generated method stub
   db.execSQL(sql);
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   db.execSQL("drop table if exists user");
   onCreate(db);
  }  
  
 }
 
 //等同于UserDAO-->createDataBase()//提供SqliteOpenHelper的实例化
 @Override
 public boolean onCreate() {
  
  Context ctxt = UserProvider.this.getContext();
  
  MyDataHelper  mdh = new MyDataHelper(ctxt, "usernewer.db", null, 1);//如果修改了数字1,onUpgrade
  
  //创建数据库
  //SqliteDataBase sd-->usernewer数据库
  sd = mdh.getWritableDatabase();  
  
  if (sd == null) {
   return false;
  }else
  {
   return true;
  }
 }


 //添加数据
 //三、重写四大方法,完成表的添/删/改/查
 @Override
 public Uri insert
 (Uri uri, ContentValues values) {
  long id = sd.insert("user", null, values);
  
  //如何加入新增记录的编号
  //id > 0:新增记录成功
  if (id > 0) {
   //将编号附加到Uri中
   //content://com.newer.userprovider/user/2
   Uri newUserUri =ContentUris.withAppendedId(User.CONTENT_URI, id);
   
   //ContentResolver-->ContentProvider
   //notifyChange:通知改变
   //通知另一个使用ContentProvider的应用
   //程序,当前表中的记录发生了改变
   UserProvider.this.getContext().getContentResolver().notifyChange(newUserUri, null);   
   return newUserUri;
  } else {
   throw new SQLException
  ("Failed to insert row into " + uri);
  }
  
 }
 
  //修改
  //PrepareStatement
  // int update:返回的int类型值指修改记录总数
  //update user set name="一般用户" where _id < 25
  @Override
  public int update(Uri uri, //传入的是由用户应用程序发出的ContentResolver.update(Uri, ContentValues)
  ContentValues values, String selection, //where id < ?
  String[] selectionArgs) {//new String[]{""}
   int count = 0;
   
   //一、判断当前用户请求数据的操作类型
   //二、完成修改数据的操作
   switch (uriMatcher.match(uri)) {
   //content://com.newer.userprovider/user/1(EditText)
   case MULTIPLE_USER:
    
      /**
       * select
       * from
       * where _id=?
       * having
       * group by
       * order by
       */
     //ContentResolver.update(Uri,ContentValues, "where _id < ?", new String[]{"25"})
     //ContentProvider.update(Uri,ContentValues, "where _id < ?", new String[]{"25"})
     //sd(SqliteDataBase).update(Uri,ContentValues, "where _id < ?", new String[]{"25"})
      sd.update("user", values, selection, selectionArgs);    
    break;

   case SINGLE_USER:
    
    //content://com.newer.userprovider/user/1
    //content://com.newer.userprovider/user-->get(0)
    //仅仅获取编号-->get(1)
    //String.subString(index,index)
    String segment = uri.getPathSegments().get(1);
    
    count = sd.update("user", values, User.KEY_ID+"=" + segment, //SqliteDatabase.update("user", updateValues, "_id" + "=" + id, null)
      selectionArgs);    
    break;
   }
   
   //三、刷新ContentResolver数据发生了变化
   UserProvider.this.getContext().getContentResolver().notifyChange(uri, null);   
   return count;
  }
 
 
  //删除
  @Override
  public int delete(Uri uri, String selection, String[] selectionArgs) {
   //一、判断当前用户请求数据的操作类型
   //二、完成修改数据的操作
   //三、刷新ContentResolver数据发生了变化
   //删除记录的总数
   int count = 0;
   
   switch(uriMatcher.match(uri)){
    case MULTIPLE_USER:
     count = sd.delete("user", selection, selectionArgs);
     break;
    case SINGLE_USER:
     String segment = uri.getPathSegments().get(1);     
     count = sd.delete("user", User.KEY_ID + "=" + segment, selectionArgs);
     break;
     
    default:
     throw new IllegalArgumentException("Unsupported URI:" + uri);
   }
   
   getContext().getContentResolver().notifyChange(uri, null);   
   return count;
  }
  

     //查询数据
  //findUserById()
  @Override
  public Cursor query(Uri uri,
    String[] projection, //字段
    String selection,//where _id = ?
    String[] selectionArgs, //?的值
    String sortOrder) {//ASC/DESC: 排序
     
    //一、构建SqliteQueryBuilder完成     //Sql查询的建立    //select * from user
    SQLiteQueryBuilder sqb = new SQLiteQueryBuilder();
    //from user
    sqb.setTables("user");
    
    //二、根据用户Uri进行查询类型选择查询指定编号记录
    switch(uriMatcher.match(uri)){
    //查询指定编号记录
    case SINGLE_USER:
      //content://com.newer.userprovider
      ///user/3
      String segment = uri.getPathSegments().get(1);//3
      
      //where _id = 3
      sqb.appendWhere(User.KEY_ID + "=" + segment);   
     
      break;
      
     default:
      break;
    }
    
    //查询单条/多条
    //SqliteDataBase.query()
    Cursor cursor = sqb.query(sd,projection, selection, selectionArgs, null, null, sortOrder);
    
    //三、通知ContentResovler数据,查询得到的游标集合
    cursor.setNotificationUri(this.getContext().getContentResolver(), uri);
  
   return cursor;
  }
 
 

}

 

----------------------------------------------------------------------------User ---------------------------------------------------------------------------------------------

package com.newer.cp.entity;

import android.net.Uri;

//实体类
public class User {
 //常量
 //一、指定ContentProvider操作数据类型
 //查找ContentProvider数据源的固定路径
  //多条记录
  public static final String MIME_DIR_PREFIX = "vnd.android.cursor.dir";
  //单条记录
  public static final String MIME_ITEM_PREFIX =  "vnd.android.cursor.item";
  
  
  public static final String MINE_ITEM = "vnd.newer.user";
 
 
 //二、提供用户(另一个应用程序)使用的URI必须在主配置文件AndroidManifest.xml中注册
  //www.sohu.com/index.html
  //vnd.android.cursor.item/vnd.newer.user
  public static final String MINE_TYPE_SINGLE = MIME_ITEM_PREFIX + "/" + MINE_ITEM;
    
    public static final String MINE_TYPE_MULTIPLE = MIME_DIR_PREFIX + "/" + MINE_ITEM;
    
    public static final String AUTHORITY = "com.ws.userprovider111";
    public static final String PATH_SINGLE = "user/#";//user/#-->user/1-->第一条记录 //单条
    public static final String PATH_MULTIPLE = "user";//user-->select * from user //多条
    
    //Uri
    //协议://路径
    //newer:// AUTHORITY/多条记录操作方式
    public static final String CONTENT_URI_STRING = "content://" + AUTHORITY + "/" + PATH_MULTIPLE;
    
    public static final Uri  CONTENT_URI = Uri.parse(CONTENT_URI_STRING);
  
  
 //三、字段名称(String)
    //字段
    public static final String KEY_ID = "_id";
    public static final String KEY_NAME = "name";
    public static final String KEY_AGE = "age";
    public static final String KEY_HEIGHT = "height";

}


 

----------------------------------------------------------------------------MainActivity ---------------------------------------------------------------------------------------------

 

package com.newer.cp.ui;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.newer.cp.entity.User;

public class MainActivity extends Activity {
 
 private EditText nameText;
 private EditText ageText;
 private EditText heightText;
 private EditText idEntry;
 
 private TextView labelView;
 private TextView displayView; 

 //清除显示
 private Button clearButton = null;

 //添加一条记录
 private  Button addButton = null;
 
 //修改指定编号的记录
 private Button updateButton = null;  
  
 //删除指定编号的记录
 private Button deleteButton = null;
 
 //删除所有记录
 private Button deleteAllButton = null;
 
 //查询指定编号记录
 private Button  queryButton = null;

 //查询全部记录
 private Button queryAllButton = null;
 
 //共享ContentProvider提供的数据
 //一、通过Activity获取ContentResolver
 ContentResolver contentResolver = null;
 
    /** *******************************************************/
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        nameText = (EditText)findViewById(R.id.name);
        ageText = (EditText)findViewById(R.id.age);
        heightText = (EditText)findViewById(R.id.height);
        idEntry = (EditText)findViewById(R.id.id_entry);
       
        labelView = (TextView)findViewById(R.id.label);
        displayView = (TextView)findViewById(R.id.display);
       
        contentResolver = this.getContentResolver();
        clearButton = (Button)findViewById(R.id.clear);
       
        //清除显示
        clearButton.setOnClickListener(new OnClickListener() {   
   @Override
   public void onClick(View v) {    
    //清除TextView(@+id/display)中的字符
    displayView.setText("");
   }
  });
       
        //添加一条记录
        addButton =
        (Button)findViewById(R.id.add);
        addButton.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    //二、添加数据--〉ContentValues
    ContentValues values = new ContentValues();
     
    values.put(User.KEY_NAME, nameText.getText().toString());
    values.put(User.KEY_AGE, Integer.parseInt(ageText.getText().toString()));
    values.put(User.KEY_HEIGHT, Float.parseFloat(heightText.getText().toString()));
    
    /**
     * ContentProvider
     * public Uri insert(Uri uri, ContentValues values)
     */
    //content://com.newer.userprovider
    Uri newUri = contentResolver.insert(User.CONTENT_URI, values);    
    labelView.setText("添加成功,URI:" + newUri);
    
   }
  });
       
       //修改指定编号的记录
         updateButton = (Button)findViewById(R.id.update);
         updateButton.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    //一、接收用户输入的数据封装成ContentValues
    ContentValues values = new ContentValues();
     
    values.put(User.KEY_NAME, nameText.getText().toString());    
    values.put(User.KEY_AGE, Integer.parseInt(ageText.getText().toString()));    
    values.put(User.KEY_HEIGHT, Float.parseFloat(heightText.getText().toString()));
    
    //二、解析Uri
    //content://com.newer.userprovider/user
    /**
     * "content://" + AUTHORITY + "/" + PATH_MULTIPLE;
     */
    //content://com.newer.userprovider/user/1(EditText)
    Uri uri = Uri.parse(User.CONTENT_URI_STRING + "/" + idEntry.getText().toString());    
    int recordCount = contentResolver.update(uri, values, null, null);
       
    String msg = "更新ID为"+idEntry.getText().toString()+"的数据" + (recordCount>0?"成功":"失败");       
    labelView.setText(msg);    
   }
  });
       
      //删除指定编号记录
        deleteButton  = (Button)findViewById(R.id.delete);
        deleteButton.setOnClickListener(new OnClickListener() {      
      @Override
      public void onClick(View v) {
       //二、解析Uri
       //content://com.newer.userprovider/user/1
       //ContentResolver-->ContentProvider
       Uri uri = Uri.parse(User.CONTENT_URI_STRING + "/" +idEntry.getText().toString());       
       int result = contentResolver.delete(uri, null, null);
       
       String msg = "删除ID为"+ idEntry.getText().toString()+"的数据" + (result>0?"成功":"失败");       
       labelView.setText(msg);
      }
     });
       
      //4)、删除所有记录,不需要修改ContentProvier
        deleteAllButton = (Button)findViewById(R.id.delete_all);
        deleteAllButton.setOnClickListener(new OnClickListener() {   
   @Override
   public void onClick(View v) {
    //删除多条
    //content://com.newer.userprovider/user
    //一、ContentResovler删除全部记录
    contentResolver.delete(User.CONTENT_URI, null, null);    
    String msg = "数据全部删除" ;
    labelView.setText(msg);
   }
       
    });
       
        //查询指定编号的记录
        queryButton = (Button)findViewById(R.id.query);
        queryButton.setOnClickListener(new OnClickListener() {      
      @Override
      public void onClick(View v) {
       
       Uri uri = Uri.parse(User.CONTENT_URI_STRING + "/" + idEntry.getText().toString());
       
       //query()-->ContentProvider SqliteQueryBuilder.query
       Cursor cursor =contentResolver.query(uri,new String[] { User.KEY_ID, User.KEY_NAME, User.KEY_AGE, User.KEY_HEIGHT},null, null, null);       
       
       if (cursor == null){
        labelView.setText("数据库中没有数据");
        return;
       }
       
       String msg = "";
       if (cursor.moveToFirst()){
        msg += "ID:" +
        cursor.getInt(cursor.getColumnIndex(User.KEY_ID)) + ",";
        msg += "姓名:" +
        cursor.getString(cursor.getColumnIndex(User.KEY_NAME))+ ",";
        
        msg += "年龄:" +
        cursor.getInt(cursor.getColumnIndex(User.KEY_AGE)) + ", ";
        msg += "身高:" +
        cursor.getFloat(cursor.getColumnIndex(User.KEY_HEIGHT)) + "\n";
         }

       labelView.setText("数据库:");
       displayView.setText(msg);
      }
     });
       
 //6)、查询全部记录
   queryButton  = (Button)findViewById(R.id.query_all);
   queryButton.setOnClickListener(new OnClickListener() { 
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Cursor cursor =
     //全部查询
     contentResolver.query(
     User.CONTENT_URI,
     new String[] { User.KEY_ID, User.KEY_NAME,
       User.KEY_AGE, User.KEY_HEIGHT},
     
     null, null, null);
     
     if (cursor == null){
      labelView.setText("数据库中没有数据");
      return;
     }
     labelView
    .setText("数据库:" + String.valueOf(cursor.getCount()) + "条记录");
     
     String msg = "";
     if (cursor.moveToFirst()){
      do{
       msg += "ID:" +
      cursor.getInt(cursor.getColumnIndex(User.KEY_ID)) + ",";
       msg += "姓名:" +
      cursor.getString(cursor.getColumnIndex(User.KEY_NAME))+ ",";
       msg += "年龄:" +
      cursor.getInt(cursor.getColumnIndex(User.KEY_AGE)) + ", ";
       msg += "身高:" +
      cursor.getFloat(cursor.getColumnIndex(User.KEY_HEIGHT)) + "\n";
      }while(cursor.moveToNext());
       }
  
     displayView.setText(msg);
   }
   });
  
  
 
    }
}

 

 

 


 

 

原创粉丝点击