contentProvider的应用

1、MyProvider.java是自定义的provider类

---------------------

package com.test.liu.provider;
import java.util.concurrent.CountDownLatch;
import java.util.regex.Matcher;


import com.test.liu.db.NoticeBoardHelper;

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;


public class MyProvider extends ContentProvider{

 //定义uri是否匹配变量,不匹配返回-1
 private NoticeBoardHelper dBoardHelper;
 private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
 private static final int RECORD =1;
 private static final int RECORDS = 2;
 public static final Uri RECORD_URI = Uri.parse("content://" + "com.example.providers.recordprovider");
 static {
  //添加匹配内容定义,第一个参数是authority,第二个参数是:路径(表名),第三个参数是:两者相匹配时返回的匹配码
  MATCHER.addURI("com.example.providers.recordprovider", "record", RECORDS);
  //*号代表所有字符,#号代表数字
  MATCHER.addURI("com.example.providers.recordprovider", "record/*", RECORD);
 }
 
 //返回删除条目数
 //第一个参数uri,第二个是where语句条件用占位符表示,第三个参数值是个数组合第二个参数的占位符是一一对应的
 @Override
 public int delete(Uri uri, String selection, String[] selectionArgs) {
  //取得数据库操作类实例
  SQLiteDatabase sqldb = dBoardHelper.getWritableDatabase();
  int num = 0;
  Uri _uri= null;
  //匹配传过来的URI
  switch(MATCHER.match(uri)){
     case 1://item
      num = sqldb.delete("proclamation_record", selection, selectionArgs);
      break;
     case 2:
//      long rowid = ContentUris.parseId(uri);
//      String where = "user_id=" + rowid;
//      if(selection !=null && !"".equals(selection.trim())){
//       where += " and " + selection;
//      }
//      num = sqldb.delete("proclamation_record", where, selectionArgs);
      String userid = uri.getPathSegments().get(1);
      num = sqldb.delete("proclamation_record", "user_id='"+userid+"'", null);

      if (num > 0) {
       _uri = ContentUris.withAppendedId(RECORD_URI, num);
       getContext().getContentResolver().notifyChange(_uri, null);
      }
      break;
     default:
      throw new IllegalArgumentException("this is Unknow Uri:" + uri);
    }
    return num;
 }

 @Override
 public String getType(Uri uri) {
   //匹配传过来的Uri
    switch(MATCHER.match(uri)){
     case 1://如果得到的结果集是集合类型,则返回此结果
      return "vnd.android.cursor.dir/record";
     case 2://如果得到的结果集是非集合类型,则返回此结果
      return "vnd.android.cursor.item/record";
     default:
      throw new IllegalArgumentException("this is Unknow Uri:" + uri);
    }
 
 }

 @Override
 public Uri insert(Uri uri, ContentValues values) {
  //取得数据库操作类实例
    SQLiteDatabase sqldb = dBoardHelper.getWritableDatabase();
   
    switch(MATCHER.match(uri)){
       case 2:
        long rowid = sqldb.insert("proclamation_record", "", values);//如果主键值自增长,那么返回的是主键值
        Uri insertUri = ContentUris.withAppendedId(RECORD_URI, rowid);
        getContext().getContentResolver().notifyChange(insertUri, null);
           //insertUri也可以用下面的方法进行组合:
//        Uri inserUri = Uri.parse("content://com.example.provides.personprovider/person/");
//        ContentUris.withAppendedId(insertUri, rowid);
       
        return insertUri;      
           
    default:
           throw new IllegalArgumentException("this is Unknow Uri:" + uri);
   
    }
 }

 //初始化操作
 @Override
 public boolean onCreate() {
  dBoardHelper = new NoticeBoardHelper(this.getContext());
  return false;
 }

 @Override
 public Cursor query(Uri uri, String[] projection, String selection,
   String[] selectionArgs, String sortOrder) {
   //取得数据库操作类实例
    SQLiteDatabase sqldb = dBoardHelper.getWritableDatabase();
    Cursor cursor = null;
    int num = 0;
    //匹配传过来的Uri
    switch(MATCHER.match(uri)){
     case 1:
      String sql = "select * from proclamation_record";
      cursor = sqldb.rawQuery(sql, null);
      break;
      //return sqldb.query("record", null, selection, selectionArgs, null, null, sortOrder);

     case 2:
      sql = "select * from proclamation_record where user_id = "+"'"+uri.getPathSegments().get(1)+"'";
      cursor = sqldb.rawQuery(sql, null);
      break;
     default:
      throw new IllegalArgumentException("this is Unknow Uri:" + uri);
    
    }
    return cursor;
 }

 @Override
 public int update(Uri uri, ContentValues values, String selection,
   String[] selectionArgs) {
  //取得数据库操作类实例
    SQLiteDatabase sqldb = dBoardHelper.getWritableDatabase();
    int count = 0;
   Uri _uri = null;

    //匹配传过来的Uri
    switch(MATCHER.match(uri)){
     case 1:
      count = sqldb.update("record", values, selection, selectionArgs);
      if (count > 0) {
    _uri = ContentUris.withAppendedId(RECORD_URI, count);
    getContext().getContentResolver().notifyChange(_uri, null);
   }
      break;
     case 2:
     
     count = sqldb.update("proclamation_record", values, "user_id=?", new String[] { uri.getPathSegments().get(1) });

    if (count > 0) {
     _uri = ContentUris.withAppendedId(RECORD_URI, count);
     getContext().getContentResolver().notifyChange(_uri, null);
    }

    break;
    
     default:
      throw new IllegalArgumentException("this is Unknow Uri:" + uri);
    }
    return count;
 }

}

 

------------------------------------------------------------------------------------------------------------------------------------------------

2、NoticeBoardHelper.java:对数据库的操作类

package com.test.liu.db;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * add by sky.liu for notice board
 * 这个类的作用是继承数据库的帮助类
 * */
public class NoticeBoardHelper extends SQLiteOpenHelper{


    public NoticeBoardHelper(Context context) {
     super(context, "proclamation_record.db", null, 1); 
 }

  //数据库第一次创建时候调用,  
     public void onCreate(SQLiteDatabase db) { 
      //db.execSQL("create table user(uid integer primary key autoincrement, uname varchar(20), uaddress varchar(20))"); 
    
      String sqlStr="create table proclamation_record(" +
        "id integer primary key autoincrement," +
        "[user_id] varchar(32) default null," +
        "[user_name] varchar(32) default null,"+
        "[area_code] varchar(18) default null,"+
        "[user_level] varchar(2) default null,"+
        "[info_type] varchar(2) default null,"+
        "[insert_time] datetime default null,"+
        "[subject] varchar(128) default null,"+
        "[content] varchar(255) default null,"+
        "[expire_time] datetime default null,"+
        "[version] integer default null,[status] integer default null);";
      Log.v("sky.liu", "开始创建数据库表proclamation_record");
      db.execSQL(sqlStr);
      Log.v("sky.liu", "数据库表proclamation_record创建完毕");
      //CREATE TABLE time([ID] INTEGER PRIMARY KEY,[IDCardNo] VARCHAR (50),[CreatedTime] TimeStamp NOT NULL DEFAULT CURRENT_TIMESTAMP);
     } 

     //数据库文件版本号发生变化时调用  
     public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { 
  
     }
    
     // for content provider
     public void add(String userid,String username,String areacode,String userlevel,String infotype,String inserttime,String subject,String content,String expiretime,String version){
            SQLiteDatabase db = getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put("user_id", userid);
            values.put("user_name", username);
            values.put("area_code", areacode);
            values.put("user_level", userlevel);
            values.put("info_type", infotype);
            values.put("insert_time", inserttime);
            values.put("subject", subject);
            values.put("content", content);
            values.put("expire_time", expiretime);
            values.put("version", version);
            db.insert("proclamation_record","",values);
            db.close();
    }
}
----------------------------------------------------------------------------------------------------------------------

3、在AndroidManifest.xml中的配置:

       <provider android:name="com.test.liu.provider.MyProvider" android:authorities="com.example.providers.recordprovider" />
  
         </application>

-----------------------------------------------------------------------------------------------------------------------

4、调用方式:

ContentResolver contentResolver = getContentResolver();

Cursor cursor =contentResolver.query(Uri.parse("content://com.channelsoft.count.sms/record/1"), null, null, null, null);

Toast.makeText(context, cursor.getString(cursor.getColumnIndex("user_name")), 5000).show();
    
   

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值