您的位置:首页 > 移动开发 > Android开发

android-----(Content Provider 内容提供者组件)

2015-10-26 23:01 621 查看




/**
* 实体对象
*/
public class Person {

private int id;
private String name;
private int age;

public Person() {
}

public Person(int age, String name) {
this.age = age;
this.name = name;
}

public Person(int age, int id, String name) {
this.age = age;
this.id = id;
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "Person{" +
"age=" + age +
", id=" + id +
", name='" + name + '\'' +
'}';
}
}


/**
* 定义元数据
*/
public final class PersonMetaData {

public static abstract class Person implements BaseColumns {
public static final String NAME = "name";
public static final String AGE = "age";
public static final String TABLE_NAME = "person";
}

}


/**
*  数据库操作
*/
public class DatabaseAdapter {
private DatabaseHelper dbHelper;

public DatabaseAdapter(Context context) {
this.dbHelper = new DatabaseHelper(context);
}

public void save(Person person) {
SQLiteDatabase db = dbHelper.getWritableDatabase();

ContentValues values = new ContentValues();
values.put(PersonMetaData.Person.NAME, person.getName());
values.put(PersonMetaData.Person.AGE, person.getAge());
db.insert(PersonMetaData.Person.TABLE_NAME, null, values);
}

public void delete(int id) {
SQLiteDatabase db = dbHelper.getWritableDatabase();

String whereClause = PersonMetaData.Person._ID + "=?";
String[] whereArgs = {String.valueOf(id)};

db.delete(PersonMetaData.Person.TABLE_NAME, whereClause, whereArgs);

}

public void update(Person person) {
SQLiteDatabase db = dbHelper.getWritableDatabase();

ContentValues values = new ContentValues();
values.put(PersonMetaData.Person.NAME, person.getName());
values.put(PersonMetaData.Person.AGE, person.getAge());
String whereClause = PersonMetaData.Person._ID + "=?";
String[] whereArgs = {String.valueOf(person.getId())};

db.update(PersonMetaData.Person.TABLE_NAME, values, whereClause, whereArgs);
}

public ArrayList<Person> findAll() {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c = db.query(true, PersonMetaData.Person.TABLE_NAME, null, null, null, null, null, null, null);

ArrayList<Person> list = new ArrayList<>();
Person p = null;
while (c.moveToNext()) {
p = new Person();
p.setName(c.getString(c.getColumnIndexOrThrow(PersonMetaData.Person.NAME)));
p.setAge(c.getInt(c.getColumnIndexOrThrow(PersonMetaData.Person.AGE)));
p.setId(c.getInt(c.getColumnIndexOrThrow(PersonMetaData.Person._ID)));

list.add(p);
}

db.close();
return list;
}

public Person findById(int id) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c = db.query(PersonMetaData.Person.TABLE_NAME, null, PersonMetaData.Person._ID + "=?", new String[]{String.valueOf(id)}, null, null, null, null);

Person p = new Person();
if (c.moveToNext()) {
p.setId(c.getInt(c.getColumnIndexOrThrow(PersonMetaData.Person._ID)));
p.setName(c.getString(c.getColumnIndexOrThrow(PersonMetaData.Person.NAME)));
p.setAge(c.getInt(c.getColumnIndexOrThrow(PersonMetaData.Person.AGE)));
}
db.close();
return p;

}

private static class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "cp.db";
private static final int VERSION = 1;

private static final String CREATE_TABLE = "create table person(_id integer primary key autoincrement,name text,age int)";

private static final String DROP_TABLE = "drop table if exists person";

public DatabaseHelper(Context context) {
super(context, DB_NAME, null, VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE);
db.close();

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL(DROP_TABLE);
db.execSQL(CREATE_TABLE);
db.close();
}
}
}








/**
* 自定义 ContentProvider
*/
public class HellowContentProvider extends ContentProvider {
//匹配码
private static final int MUTIPLE_CODE = 1;//返回多个记录的匹配码
private static final int SINGLE_CODE = 2; //返回单个记录的匹配码

//远程要访问的地址 主机号,别人访问时的路径
private static final String AUTHORITIES = "com.example.zhangjianbin.contentp.hellowContentprovider";

//创建一个uri 的匹配器(定义传入的uri正确的格式)   UriMatcher.NO_MATCH:编码号,uri匹配对时,就返回一个编码号
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);

/**
* 数据类型
* text/plain image/jpg
*
* 1.单个的数据类型
*
*
* 2.多个的数据类型
*/
private static final String SINGLE_TYPE = "vnd.android.cursor.item/person";
private static final String MUTIPLE_TYPE = "vnd.android.cursor.dir/person";

static {
/**
* 当传入的数径是:
* content://com.example.zhangjianbin.contentp.hellowContentprovider/person   后面没有编号,则查询所有,
* 就进行匹配
*
*content://com.example.zhangjianbin.contentp.hellowContentprovider/person/1    1表示person表的id号,也可以传其它条件
*
* 路径,表,返回的编号
*/
URI_MATCHER.addURI(AUTHORITIES, "person", 1);//路么匹配对,则返回1
URI_MATCHER.addURI(AUTHORITIES, "person/#", 2);// *:匹配所有的字符, #:匹配所有的数字 匹配上,则返回2
}

//数据库帮助类
private DatabaseAdapter.DatabaseHelper dbAdapter;

/**
* 创建
*
* @return
*/
@Override
public boolean onCreate() {
//数据库帮助类对象
dbAdapter = new DatabaseAdapter.DatabaseHelper(getContext());
return true;
}

/**
* 返回该URi 表示的数据类型
*
* @param uri
* @return
*/
@Override
public String getType(Uri uri) {
switch (URI_MATCHER.match(uri)) {
case SINGLE_CODE:
return SINGLE_TYPE;
case MUTIPLE_CODE:
return MUTIPLE_TYPE;
}

return null;
}

/**
* 插入一个新的记录
* <p/>
* 传入的 uri
* content://com.example.zhangjianbin.contentp.hellowContentprovider/person/4
*
* @param uri
* @param values
* @return
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
switch (URI_MATCHER.match(uri)) {
case MUTIPLE_CODE:
//数据库操作对象,进行保存操作
SQLiteDatabase db = dbAdapter.getWritableDatabase();

//当前插入的id值
long id = db.insert(PersonMetaData.Person.TABLE_NAME, null, values);
db.close();
//将id 添加到 uri后面
ContentUris.withAppendedId(uri, id);
break;
}

return uri;
}

/**
* 查询符合指定条件的记录
*
* @param uri
* @param projection    //列
* @param selection
* @param selectionArgs
* @param sortOrder
* @return
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
switch (URI_MATCHER.match(uri)) {
case SINGLE_CODE:
SQLiteDatabase db = dbAdapter.getWritableDatabase();

//从 uri 中获取id
long id = ContentUris.parseId(uri);
//条件
selection = PersonMetaData.Person._ID + "=?";
//条件值
selectionArgs = new String[]{String.valueOf(id)};
return db.query(PersonMetaData.Person.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
case MUTIPLE_CODE:
db = dbAdapter.getWritableDatabase();
return db.query(PersonMetaData.Person.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
}

return null;
}

/**
* 删除符合指定条件的记录
* <p/>
* <p/>
* content://com.example.zhangjianbin.contentp.hellowContentprovider/person/4
*
* @param uri
* @param selection
* @param selectionArgs
* @return
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
switch (URI_MATCHER.match(uri)) {
case SINGLE_CODE://单个删除
SQLiteDatabase db = dbAdapter.getWritableDatabase();

//从 uri 中获取id
long id = ContentUris.parseId(uri);
//条件
selection = PersonMetaData.Person._ID + "=?";
//条件值
selectionArgs = new String[]{String.valueOf(id)};

//需要得到传入的id号即可
int row = db.delete(PersonMetaData.Person.TABLE_NAME, selection, selectionArgs);
db.close();
return row;//返回删除的行数
case MUTIPLE_CODE://多个删除
db = dbAdapter.getWritableDatabase();

//需要得到传入的id号即可
row = db.delete(PersonMetaData.Person.TABLE_NAME, selection, selectionArgs);
db.close();
return row;
}
return 0;
}

/**
* 更新指定条件的记录
*
* @param uri
* @param values
* @param selection
* @param selectionArgs
* @return
*/
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {

switch (URI_MATCHER.match(uri)) {
case SINGLE_CODE://单个更新
SQLiteDatabase db = dbAdapter.getWritableDatabase();

//从 uri 中获取id
long id = ContentUris.parseId(uri);
//条件
selection = PersonMetaData.Person._ID + "=?";
//条件值
selectionArgs = new String[]{String.valueOf(id)};

//需要得到传入的id号即可
int row = db.update(PersonMetaData.Person.TABLE_NAME, values, selection, selectionArgs);
db.close();
return row;//返回更新的行数
case MUTIPLE_CODE://多个更新
db = dbAdapter.getWritableDatabase();

//需要得到传入的id号即可
row = db.update(PersonMetaData.Person.TABLE_NAME, values, selection, selectionArgs);
db.close();
return row;
}
return 0;
}
}


//activity类
public class MainActivity extends AppCompatActivity {

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

}

public void addClick(View view) {
//获取 内容提供者的接口
ContentResolver cr = this.getContentResolver();

//调用CP的添加方法
Uri uri = Uri.parse("content://com.example.zhangjianbin.contentp.hellowContentprovider/person"); //要去访问ContentProvider

ContentValues values = new ContentValues();
values.put(PersonMetaData.Person.NAME, "zhang"); //如果在其它工程中写成字符串,其它一样
values.put(PersonMetaData.Person.AGE, 18);
//调用ContentProvider的方法进行添加
cr.insert(uri, values);
}

public void queryClick(View view) {
ContentResolver cr = this.getContentResolver();

Uri uri = Uri.parse("content://com.example.zhangjianbin.contentp.hellowContentprovider/person"); //要去访问ContentProvider,带ID号

Cursor cursor = cr.query(uri, null, null, null, null);

while (cursor.moveToNext()) {
System.out.print(cursor.getInt(cursor.getColumnIndexOrThrow(PersonMetaData.Person._ID)));
System.out.print(cursor.getString(cursor.getColumnIndexOrThrow(PersonMetaData.Person.NAME)));
System.out.print(cursor.getInt(cursor.getColumnIndexOrThrow(PersonMetaData.Person.AGE)));
}
cursor.close();

}

public void delClick(View view) {

ContentResolver cr = this.getContentResolver();

Uri uri = Uri.parse("content://com.example.zhangjianbin.contentp.hellowContentprovider/person/1"); //要去访问ContentProvider,带ID号

cr.delete(uri, null, null);

}

public void updateClick(View view) {

ContentResolver cr = this.getContentResolver();

Uri uri = Uri.parse("content://com.example.zhangjianbin.contentp.hellowContentprovider/person/1"); //要去访问ContentProvider,带ID号

ContentValues values = new ContentValues();
values.put(PersonMetaData.Person.NAME, "zhang");
values.put(PersonMetaData.Person.AGE, 20);

cr.update(uri, values, null, null);
}
}


//配置清单
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<provider
android:authorities="com.example.zhangjianbin.contentp.hellowContentprovider"
android:name=".HellowContentProvider"

/>
</application>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: