用到了四个类:
class MainActivity extends Activity;
class DatabaseHelper extends SQLiteOpenHelper;
class MyMetaData;
class MyCP extends ContentProvider;
一、MainActivity:
package com.example.contentprovider;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.example.contentprovider.MyMetaData.UserTableMetaData;
public class MainActivity extends Activity {
Button insert,query;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
insert = (Button) findViewById(R.id.insert);
insert.setOnClickListener(new InsertListener());
query = (Button) findViewById(R.id.query);
query.setOnClickListener(new QueryListener());
}
class InsertListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ContentValues values = new ContentValues();
values.put(UserTableMetaData.USER_NAME, "michal");
Uri uri = getContentResolver().insert(
UserTableMetaData.CONTENT_URI, values);
System.out.println("uri--->" + uri.toString());
}
}
class QueryListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Cursor c = getContentResolver().query(
UserTableMetaData.CONTENT_URI, null,
null, null, null);
while (c.moveToNext()) {
System.out.println(c.getString(c.getColumnIndex(UserTableMetaData.USER_NAME)));
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
二、DatabaseHelper extends SQLiteOpenHelper
package com.example.contentprovider;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper{
public DatabaseHelper(Context context) {
super(context, MyMetaData.DATABASE_NAME, null, MyMetaData.DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql = "CREATE TABLE "+MyMetaData.UserTableMetaData.TABLE_NAME+" (_id INTEGER PRIMARY KEY AUTOINCREMENT, "+MyMetaData.UserTableMetaData.USER_NAME+" VARCHAR)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
三、MyMetaData
package com.example.contentprovider;
import android.net.Uri;
import android.provider.BaseColumns;
public class MyMetaData {
// 继承了contentprovider的类的全名
public static final String AUTHORITY = "com.example.contentprovider.mycp";
// 数据库名称
public static final String DATABASE_NAME = "FirstProvider.db";
// 数据库的版本
public static final int DATABASE_VERSION = 1;
// 静态内部类创建一个表
public static final class UserTableMetaData implements BaseColumns {
// 表名
public static final String TABLE_NAME = "users";
// 访问该ContentProvider的表的URI
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME);
//规定
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.mycp.user";
public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.mycp.user";
// 列名,在users表中添加一个名为name的列
public static final String USER_NAME = "name";
// 默认排序方式
public static final String DEFAULT_SORT_ORDER = "_id desc";
}
}
四、MyCP extends ContentProvider
package com.example.contentprovider;
import java.util.HashMap;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import com.example.contentprovider.MyMetaData.UserTableMetaData;
public class MyCP extends ContentProvider {
public static final UriMatcher uriMatcher;
// 下面定义两个规则
public static final int INCOMING_USER_COLLECTION = 1;
public static final int INCOMING_USER_SINGLE = 2;
private DatabaseHelper dh;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 不匹配根目录
// 多条
uriMatcher.addURI(MyMetaData.AUTHORITY, "users",INCOMING_USER_COLLECTION);
// 单条
uriMatcher.addURI(MyMetaData.AUTHORITY, "users/#", INCOMING_USER_SINGLE);
}
// 有点类似于sql里面表的别名,这个也是给列其别名,必须要用
// 列的别名还是原来的名,没必要修改
public static HashMap<String, String> userProjectionMap;
static {
userProjectionMap = new HashMap<String, String>();
userProjectionMap.put(UserTableMetaData._ID, UserTableMetaData._ID);
userProjectionMap.put(UserTableMetaData.USER_NAME,UserTableMetaData.USER_NAME);
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
//getContext得到当前正在运行着的context
dh = new DatabaseHelper(getContext());
System.out.println("on create --> dh = new DatabaseHelper(getContext())");
return true;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
System.out.println("getType-->");
switch (uriMatcher.match(uri)) {
case INCOMING_USER_COLLECTION:
return UserTableMetaData.CONTENT_TYPE;
case INCOMING_USER_SINGLE:
return UserTableMetaData.CONTENT_TYPE_ITEM;
default:
throw new IllegalArgumentException("Unknown uri" + uri);
}
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
System.out.println("query");
//创建一个查询的语句
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
//设置查询哪张表
qb.setTables(UserTableMetaData.TABLE_NAME);
qb.setProjectionMap(userProjectionMap);
switch(uriMatcher.match(uri)){
case INCOMING_USER_COLLECTION:
break;
case INCOMING_USER_SINGLE:
//添加where条件,getPathSegments:得到uri的path部分content:XXX/user/1,get(1)得到1
qb.appendWhere(UserTableMetaData._ID+"="+uri.getPathSegments().get(1));
break;
}
String orderBy;
if(TextUtils.isEmpty(sortOrder)){
orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
}
else
{
orderBy = sortOrder;
}
SQLiteDatabase db = dh.getWritableDatabase();
//下面的query使用qb这个对象
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
//也是通知下
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
System.out.println("insert-->");
SQLiteDatabase db = dh.getWritableDatabase();
long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
if(rowId>0){
//将rowId追加到后面
//contentUris:用来处理Uri的工具类
Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
//通知监听器,数据已经改变
getContext().getContentResolver().notifyChange(insertedUserUri, null);
return insertedUserUri;
}
throw new SQLException("Failed to insert row into "+uri);
}
@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;
}
}
最后记得在AndroidManifest.xml里配置:
<provider
android:name="com.example.contentprovider.MyCP"
android:authorities="com.example.contentprovider.mycp">
</provider>
分享到:
相关推荐
ContentProvider在android中的作用是对外共享数据;本实例实现了对数据的增删改查操作
自定义ContentProvider实例,包含提供数据端和读取数据端
简单Android中的内容提供者实例,带数据库操作。
应用A(TestBaidu)调用另外一个应用(TestContentProvider)中的自定义ContentProvider,具体实现如下,感兴趣的朋友可以参考下哈
AsyncQueryHandler及ContentProvider的使用,异步查询数据 显示在listview里面,及其常用的Adapter的用法,
Android 的ContentProvider 实例
主要介绍了Android 中ContentProvider的实例详解的相关资料,希望通过本文大家能掌握这部分内容,需要的朋友可以参考下
contentprovider 实例
本实例主要讲解自己创建ContentProvider用法及在其它应用中调用自己的ContentProvider。对应博客地址:http://blog.csdn.net/chenliqiang12345678/article/details/50588380
ContentProvider项目
应用程序间数据共享,跨进程实现,一个简单的contentprovider示例demo
ContentProvider 实例,实现ContentProvider,从其他应用访问ContentProvider数据,实现资源共享
主要是学习android的ContentProvider机制时写的测试代码,包括一个自定义内容提供者,还有一个其对应的读取示例。
同我前面的资源一样,我的每个功能的实例都是力图实现最简短话...这个实例不讲求大而全的实现ContentProvider的所有功能,而只是为了便于理解而实现。对应于我的博客“How:ContentProvider基本功能核心框架(增删改查)”
Android 自定义ContentProvider简单实例 Android允许我们定义自己的的ContentProvider对象来共享数据,练练手,简单来实现一下。 要使用ContentProvider来操作数据,必须要有保存数据的场所。可以使用文件或SQLite...
ContentProvider使用案例,ContentProvider使用案例,ContentProvider使用案例