在安卓里面,内容提供者者是作为平台供访问者访问,在此访问时一定需要准确的访问地址的路径,以下是内容提供者的代码,需要以下几个类:
1.数据库链接;
2.一个需要访问的类,此例以person举例;
3.一个继承contentprivder的类;
4.一个主类即Mainactivity
//peson类
package com.xh.tx.bean; public class Person { private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }//数据库链接
package com.xh.tx.utils; 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 MySQLLiteHelper extends SQLiteOpenHelper { /** * 函数的作用:构造方法用来创建工具类 * param1: context 上下文环境 * param2: name 数据库的名称 * param3: factory 游标对象Cursor * parma4: varsion 数据库的版本 数据库的版本不能从0开始 * @param context */ public MySQLLiteHelper(Context context, String name, CursorFactory factory, int version) { super(context, "test.db", null, 1); } /** * 用来创建数据库 */ @Override public void onCreate(SQLiteDatabase db) { String sql = "create table person (id integer primary key, name varchar(20), age integer);"; db.execSQL(sql);// 真正执行数据的创建 } //数据库版本更新 //版本需要发生变化,否则不会执行 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { /*Log.d("============", oldVersion + " : " + newVersion); if(oldVersion == 1) { String sql = "alter table person add balance integer;"; db.execSQL(sql); }*/ } //每次打开数据库的时候调用 @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); } }//继承contentprivder的类
package com.xh.tx.contentprivoder; import com.xh.tx.utils.MySQLLiteHelper; 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; /** * 要完成一个内容提供者你需要遵循以下步骤 * 1. extends ConcentePrivoder * 2. 提供一个数据库的连接工具类MySQLLiteHelper * 3. 定义我们的主号码和分机号 * * @author soft * */ public class PersonContentPrivoder extends ContentProvider { private MySQLLiteHelper helper = null; //uriMatcher 工厂 private static UriMatcher uriMatcher = null; private static final String AURHORITH = "com.xh.tx.contentprivoder.PersonContentPrivoder"; // 这个就是主号码 private static final int PERSON_INSERT_CODE = 0; private static final int PERSON_UPDATE_CODE = 1; private static final int PERSON_DELETE_CODE = 2; private static final int PERSON_QUERY_CODE = 3; static{ uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);//参数就是分机号 //添加插入的分机号 //访问地址:content://com.xh.tx.contentprivoder.PersonContentPrivoder/person/insert uriMatcher.addURI(AURHORITH, "person/insert", PERSON_INSERT_CODE); //更新插入的分机号 //访问地址:content://com.xh.tx.contentprivoder.PersonContentPrivoder/person/update uriMatcher.addURI(AURHORITH, "person/update", PERSON_UPDATE_CODE); //删除的分机号 //访问地址:content://com.xh.tx.contentprivoder.PersonContentPrivoder/person/delete uriMatcher.addURI(AURHORITH, "person/delete", PERSON_DELETE_CODE); //查询的分机号 //访问地址:content://com.xh.tx.contentprivoder.PersonContentPrivoder/person/query uriMatcher.addURI(AURHORITH, "person/query", PERSON_QUERY_CODE); } //在内容提供者创建的时候初始化我们的数据库工具类 @Override public boolean onCreate() { helper = new MySQLLiteHelper(getContext(), null, null, -1); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { switch (uriMatcher.match(uri)) { case PERSON_QUERY_CODE: SQLiteDatabase db = helper.getWritableDatabase(); if(db.isOpen()) { Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder); // db.close(); // 不能关掉数据库否者访问不到数据 return cursor; } break; default: throw new IllegalArgumentException("参数错误 :" + uri); //匹配不上的时候抛出异常提醒uri传递错误 } return null; } //由系统调用,所以我们一般不会重写他 @Override public String getType(Uri uri) { return null; } //inert方法提供真实的服务 @Override public Uri insert(Uri uri, ContentValues values) { //访问地址:content://com.xh.tx.contentprivoder.PersonContentPrivoder/person/query //返回一个uri类型的数据 一般我们就将就访问地址,然后在地址后面追加添加成功以后返回的id switch (uriMatcher.match(uri)) { case PERSON_INSERT_CODE: SQLiteDatabase db = helper.getWritableDatabase(); if(db.isOpen()) { long id = db.insert("person", null, values); db.close(); return ContentUris.withAppendedId(uri, id); } break; default: throw new IllegalArgumentException("参数错误 :" + uri); //匹配不上的时候抛出异常提醒uri传递错误 } return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { switch (uriMatcher.match(uri)) { case PERSON_DELETE_CODE: SQLiteDatabase db = helper.getWritableDatabase(); if(db.isOpen()) { int id = db.delete("person", selection, selectionArgs); db.close(); return id; } break; default: throw new IllegalArgumentException("参数错误 :" + uri); //匹配不上的时候抛出异常提醒uri传递错误 } return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { switch (uriMatcher.match(uri)) { case PERSON_UPDATE_CODE: SQLiteDatabase db = helper.getWritableDatabase(); if(db.isOpen()) { int id = db.update("person", values, selection, selectionArgs); db.close(); return id; } break; default: throw new IllegalArgumentException("参数错误 :" + uri); //匹配不上的时候抛出异常提醒uri传递错误 } return 0; } }//一个MAINactivity
package com.xh.tx.contentprivoder; 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); } }