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

Android-ContentProvider内容提供者

2017-02-14 18:17 411 查看

一、ContentProvider的概念

 ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider

1、ContentProvider使用表的形式来组织数据

   无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格

2、ContentProvider提供的方法

   query:查询

   insert:插入

   update:更新

   delete:删除

   getType:得到数据类型

   onCreate:创建数据时调用的回调函数

3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中

二、ContentProvider的内部原理

自定义一个ContentProvider,来实现内部原理

  步骤:

  1、定义一个CONTENT_URI常量(里面的字符串必须是唯一)

  Public static final Uri CONTENT_URI = Uri.parse(“content://com.example.sj_provider.data”);

  如果有子表,URI为:

  Public static final Uri CONTENT_URI = Uri.parse(“content://com.example.sj_provider.data/users”);

  2、定义一个类,继承ContentProvider

  Public class MyContentProvider extends ContentProvider

  3、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)

二、ContentProvider的三要素

1.内容(数据)

2.名字(唯一的)

3.开放

下面小编实现了个查询的简单小列子



activity_main.xml

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="ID:"
android:id="@+id/et_main_id"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="pname:"
android:id="@+id/et_main_pname"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="page:"
android:id="@+id/et_main_page"
/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="保存"
android:onClick="save"
/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="查询"
android:onClick="query"
/>
</LinearLayout>

<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@android:id/list"
></ListView>


item_listview.xml

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/tv_item_listview_id"
android:layout_weight="1"
/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/tv_item_listview_pnane"
android:layout_weight="1"
/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/tv_item_listview_page"
android:layout_weight="1"
/>


DbHelper.java

public class DbHelper extends SQLiteOpenHelper {

public DbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
Log.i("test","DbHelper构造");
}

/**
* 创建表的操作
* @param sqLiteDatabase
*/
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
Log.i("test","创建表");
sqLiteDatabase.execSQL("create table person(_id integer primary key autoincrement,pname,page)");
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
Log.i("test","onUpgrade");
}
}


Mainactivity.java

public class MainActivity extends ListActivity {

private EditText et_main_id;
private EditText et_main_pname;
private EditText et_main_page;
private SQLiteDatabase db;
private ListView listView;
private Cursor cursor;
private SimpleCursorAdapter simpleCursorAdapter;

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

//打乱集合中的数据
//        Collections.shuffle();

DbHelper dbHelper=new DbHelper(this,"questions.db",null,2);
db = dbHelper.getReadableDatabase();
initViews();

cursor=getPersons(null);//查询到所有数据

//适配器
//ArrayAdapter SimpleAdapter(List<Map>)  BaseAdapter
//SimpleCursorAdapter

simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.item_listview,cursor,new String[]{"_id","pname","page"},new int[]{R.id.tv_item_listview_id,R.id.tv_item_listview_pnane,R.id.tv_item_listview_page});

//设置适配器
listView.setAdapter(simpleCursorAdapter);
}

private void initViews() {
et_main_id = (EditText) findViewById(R.id.et_main_id);
et_main_pname = (EditText) findViewById(R.id.et_main_pname);
et_main_page = (EditText) findViewById(R.id.et_main_page);
listView = getListView();
}

public void save(View view){
//获取名字和年龄
String pname=et_main_pname.getText().toString();
String page=et_main_page.getText().toString();

ContentValues values=new ContentValues();//Map
values.put("pname",pname);
values.put("page",page);
values.putNull("_id");
db.insert("person","pname",values);

cursor=getPersons(null);

//通知适配器数据发生改变
simpleCursorAdapter.changeCursor(cursor);

}
public void query(View view){
//判断ID是否为空
if(TextUtils.isEmpty(et_main_id.getText())){
//查询所有
cursor=getPersons(null);
}else{
//查询单个
String id=et_main_id.getText().toString();
cursor=getPersons(id);
}
//通知适配器数据发生改变
simpleCursorAdapter.changeCursor(cursor);
}

/**
* 从数据库中查询
* 1.查询所有
* 2.查询单个
*/
public Cursor getPersons(String id){
if(TextUtils.isEmpty(id)){
//查询所有
//游标
cursor = db.query(false,"person",null,null,null,null,null,null,null);
}else{
//查询单个
cursor = db.query(false,"person",null,"_id=?",new String[]{id},null,null,null,null);
}
//        db.rawQuery()
return cursor;
}

}


MyProvider.java

public class MyProvider extends ContentProvider {

private DbHelper dbHelper;
private SQLiteDatabase db;
private UriMatcher uriMatcher;
private Cursor c;

@Override
public boolean onCreate() {
Log.i("test","onCreate");
dbHelper = new DbHelper(getContext(),"questions.db",null,2);
db = dbHelper.getReadableDatabase();

//实例化URI匹配器
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//给匹配器中添加匹配规则

//查询所有
uriMatcher.addURI("com.example.sj_provider.data","persons",0);
//查询单个
uriMatcher.addURI("com.example.sj_provider.data","persons/#",1);

return false;
}

@Nullable
@Override
public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
Log.i("test","query");

//开始匹配
int code=uriMatcher.match(uri);
switch (code) {
case 0:
//查询所有
c = db.query(false,"person",strings,s,strings1,null,null,s1,null);
return c;
case 1:
//得到#的值
long id=ContentUris.parseId(uri);
//查询单个:
c= db.query(false,"person",strings,"_id=?",new String[]{id+""},null,null,s1,null);
return c;
}
return null;
}

@Nullable
@Override
public String getType(Uri uri) {
return null;
}

@Nullable
@Override
public Uri insert(Uri uri, ContentValues contentValues) {
Log.i("test","insert");
return null;
}

@Override
public int delete(Uri uri, String s, String[] strings) {
Log.i("test","delete");
return 0;
}

@Override
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
Log.i("test","update");
return 0;
}
}


AndroidManifest.xml

<provider
android:authorities="com.example.sj_provider.data"
android:name="com.example.sj_provider.MyProvider"
android:exported="true"
>
</provider>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android