Android中ContentProvider详解
在 Android中,对于数据的存贮,有几种方式,有文件方式,有文件式数据库方式,网络数据,Android自带了一个SQLite数据库,做嵌入开发的人对这个跨平台的本地文件数据库一定不会陌生,在Android对于数据的访问,提出了新的方式,ContentProvider方式,我们首先来看看SQLite在 Android中的使用,在Android中有最简单的使用方式,就是利Context对象的openorCreateDatabase
我们来看看一段代码:
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.database.Cursor;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.os.Bundle;
- importandroid.view.Menu;
- importandroid.view.MenuItem;
- importandroid.widget.TextView;
- publicclassDBActivityextendsActivity{
- privateSQLiteDatabasemdb=null;
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- initDatabase();
- setContentView(R.layout.main);
- }
- @Override
- publicbooleanonCreateOptionsMenu(Menumenu){
- //TODOAuto-generatedmethodstub
- super.onCreateOptionsMenu(menu);
- menu.add(1,Menu.FIRST+1,1,"GetName");
- menu.add(1,Menu.FIRST+2,2,"Test");
- returntrue;
- }
- publicbooleanonOptionsItemSelected(MenuItemitem){
- //TODOAuto-generatedmethodstub
- super.onOptionsItemSelected(item);
- switch(item.getItemId())
- {
- caseMenu.FIRST+1:
- {
- TextViewtv=(TextView)this.findViewById(R.id.view_main);
- tv.setText(this.getName());
- break;
- }
- caseMenu.FIRST+2:
- {
- this.setTitle("DelItem...");
- break;
- }
- }
- returntrue;
- }
- privatevoidinitDatabase()
- {
- mdb=this.openOrCreateDatabase("dbfile",0,null);
- Stringsql_create="createtabletest(idint,nameTEXT)";
- mdb.execSQL(sql_create);
- Stringsql_insert="insertintotest(id,name)values(3,'name3')";
- mdb.execSQL(sql_insert);
- }
- privateStringgetName()
- {
- Stringname=null;
- Cursorcur=mdb.rawQuery("select*fromtest",null);
- cur.moveToFirst();
- while(!cur.isLast())
- {
- name=name+cur.getString(1)+"\r\n";
- cur.moveToNext();
- }
- returnname;
- }
- }
import android.app.Activity;import android.content.Intent;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.TextView;public class DBActivity extends Activity { private SQLiteDatabase mdb = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initDatabase(); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub super.onCreateOptionsMenu(menu); menu.add(1, Menu.FIRST +1, 1, "GetName"); menu.add(1, Menu.FIRST +2, 2, "Test"); return true; } public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub super.onOptionsItemSelected(item); switch (item.getItemId()) { case Menu.FIRST+ 1: { TextView tv = (TextView)this.findViewById(R.id.view_main); tv.setText(this.getName()); break; } case Menu.FIRST + 2: { this.setTitle("Del Item..."); break; } } return true; } private void initDatabase() { mdb = this.openOrCreateDatabase("dbfile", 0, null); String sql_create = "create table test (id int, name TEXT)"; mdb.execSQL(sql_create); String sql_insert = "insert into test(id, name) values(3, 'name3')"; mdb.execSQL(sql_insert); } private String getName() { String name = null; Cursor cur = mdb.rawQuery("select * from test", null); cur.moveToFirst(); while (!cur.isLast()) { name = name + cur.getString(1)+ "\r\n"; cur.moveToNext(); } return name; }}
我们再来看看单独使用SQLiteOpenHelper方式:
先由SQLiteOpenHelper继承一个数据库操作类,其中onCreate, onUpgrade必须重载并实现,
- importandroid.content.Context;
- importandroid.database.Cursor;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.database.sqlite.SQLiteOpenHelper;
- publicclassDatabaseHelperextendsSQLiteOpenHelper{
- @Override
- publicvoidonCreate(SQLiteDatabasedb){
- //TODOAuto-generatedmethodstub
- }
- @Override
- publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
- //TODOAuto-generatedmethodstub
- }
- publicDatabaseHelper(Contextct,StringdbName)
- {
- super(ct,dbName,null,1);
- }
- publicbooleaninsert(Stringinsert)
- {
- this.getWritableDatabase().execSQL(insert);
- returntrue;
- }
- publicbooleanupdate(Stringupdate)
- {
- this.getWritableDatabase().execSQL(update);
- returntrue;
- }
- publicbooleandelete(Stringdel)
- {
- this.getWritableDatabase().execSQL(del);
- returntrue;
- }
- publicCursorquery(Stringquery)
- {
- Cursorcur=this.getReadableDatabase().rawQuery(query,null);
- returncur;
- }
- }
import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DatabaseHelper extends SQLiteOpenHelper { @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } public DatabaseHelper(Context ct,String dbName) { super(ct,dbName,null,1); } public boolean insert(String insert) { this.getWritableDatabase().execSQL(insert); return true; } public boolean update(String update) { this.getWritableDatabase().execSQL(update); return true; } public boolean delete(String del) { this.getWritableDatabase().execSQL(del); return true; } public Cursor query(String query) { Cursor cur = this.getReadableDatabase().rawQuery(query, null); return cur; }}
再创建一个使用者(消费者)
Java代码- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.database.Cursor;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.os.Bundle;
- importandroid.view.Menu;
- importandroid.view.MenuItem;
- importandroid.widget.TextView;
- publicclassDBActivityextendsActivity{
- privateSQLiteDatabasemdb=null;
- privateDatabaseHelperhelper=null;
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- initDatabase();
- setContentView(R.layout.main);
- }
- @Override
- publicbooleanonCreateOptionsMenu(Menumenu){
- //TODOAuto-generatedmethodstub
- super.onCreateOptionsMenu(menu);
- menu.add(1,Menu.FIRST+1,1,"GetName");
- menu.add(1,Menu.FIRST+2,2,"Test");
- returntrue;
- }
- publicbooleanonOptionsItemSelected(MenuItemitem){
- //TODOAuto-generatedmethodstub
- super.onOptionsItemSelected(item);
- switch(item.getItemId())
- {
- caseMenu.FIRST+1:
- {
- TextViewtv=(TextView)this.findViewById(R.id.view_main);
- tv.setText(this.getName());
- break;
- }
- caseMenu.FIRST+2:
- {
- this.setTitle("DelItem...");
- break;
- }
- }
- returntrue;
- }
- privatevoidinitDatabase()
- {
- helper=newDatabaseHelper(this,"dbfile");
- //mdb=this.openOrCreateDatabase("dbfile",0,null);
- //Stringsql_create="createtabletest(idint,nameTEXT)";
- //mdb.execSQL(sql_create);
- Stringsql_insert="insertintotest(id,name)values(55,'namexx')";
- //mdb.execSQL(sql_insert);
- helper.insert(sql_insert);
- }
- privateStringgetName()
- {
- Stringname=null;
- //mdb=helper.getReadableDatabase();
- Cursorcur=helper.query("select*fromtest");
- cur.moveToFirst();
- do
- {
- name=name+cur.getString(1)+"\n";
- }while(cur.moveToNext());
- returnname;
- }
- }
import android.app.Activity;import android.content.Intent;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.TextView;public class DBActivity extends Activity { private SQLiteDatabase mdb = null; private DatabaseHelper helper = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initDatabase(); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub super.onCreateOptionsMenu(menu); menu.add(1, Menu.FIRST +1, 1, "GetName"); menu.add(1, Menu.FIRST +2, 2, "Test"); return true; } public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub super.onOptionsItemSelected(item); switch (item.getItemId()) { case Menu.FIRST+ 1: { TextView tv = (TextView)this.findViewById(R.id.view_main); tv.setText(this.getName()); break; } case Menu.FIRST + 2: { this.setTitle("Del Item..."); break; } } return true; } private void initDatabase() { helper = new DatabaseHelper(this,"dbfile"); //mdb = this.openOrCreateDatabase("dbfile", 0, null); //String sql_create = "create table test (id int, name TEXT)"; //mdb.execSQL(sql_create); String sql_insert = "insert into test(id, name) values(55, 'namexx')"; //mdb.execSQL(sql_insert); helper.insert(sql_insert); } private String getName() { String name = null; //mdb = helper.getReadableDatabase(); Cursor cur = helper.query("select * from test"); cur.moveToFirst(); do { name = name + cur.getString(1)+ "\n"; } while(cur.moveToNext()); return name; }}
在来看看使用ContentProvider
Java代码- importandroid.content.ContentProvider;
- importandroid.content.ContentValues;
- importandroid.database.Cursor;
- importandroid.net.Uri;
- importandroid.widget.Toast;
- publicclassTestProviderextendsContentProvider{
- privateDatabaseHelpermdbHelper=null;
- finalstaticStringTABLE_NAME="test";
- @Override
- publicintdelete(Uriarg0,Stringarg1,String[]arg2){
- mdbHelper.getWritableDatabase().delete(TABLE_NAME,arg1,arg2);
- return0;
- }
- @Override
- publicStringgetType(Uriuri){
- //TODOAuto-generatedmethodstub
- returnnull;
- }
- @Override
- publicUriinsert(Uriuri,ContentValuesvalues){
- //TODOAuto-generatedmethodstub
- mdbHelper.getWritableDatabase().insert(TABLE_NAME,"",values);
- returnnull;
- }
- @Override
- publicbooleanonCreate(){
- //TODOAuto-generatedmethodstub
- mdbHelper=newDatabaseHelper(this.getContext(),"dbfile");
- returntrue;
- }
- @Override
- publicCursorquery(Uriuri,String[]projection,Stringselection,
- String[]selectionArgs,StringsortOrder){
- Cursorcur=mdbHelper.getReadableDatabase().query(TABLE_NAME,projection,selection,null,null,null,null);
- Toast.makeText(this.getContext(),"testCur!",Toast.LENGTH_SHORT);
- returncur;
- }
- @Override
- publicintupdate(Uriuri,ContentValuesvalues,Stringselection,
- String[]selectionArgs){
- mdbHelper.getWritableDatabase().update(TABLE_NAME,values,selection,null);
- return0;
- }
- }
import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.widget.Toast;public class TestProvider extends ContentProvider { private DatabaseHelper mdbHelper = null; final static String TABLE_NAME = "test"; @Override public int delete(Uri arg0, String arg1, String[] arg2) { mdbHelper.getWritableDatabase().delete(TABLE_NAME, arg1, arg2); return 0; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub mdbHelper.getWritableDatabase().insert(TABLE_NAME, "", values); return null; } @Override public boolean onCreate() { // TODO Auto-generated method stub mdbHelper = new DatabaseHelper(this.getContext(), "dbfile"); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor cur = mdbHelper.getReadableDatabase().query(TABLE_NAME,projection,selection,null,null,null, null); Toast.makeText(this.getContext(), "test Cur!", Toast.LENGTH_SHORT); return cur; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { mdbHelper.getWritableDatabase().update(TABLE_NAME, values, selection, null); return 0; }}
老规矩,AndroidManifest.xml来定义这个Provider
<provider android:label="test_provider" android:authorities="com.my.provider" android:name="TestProvider">
</provider>
这里的android:authorities = "com.my.provider"是标识这个ContentProvider,调用者可以根据这个标识来找到它,
我们组合一个能找到它的Uri,
public class ProviderConst {
public static final Uri MY_TEST_URI = Uri.parse("content://com.my.provider/test");
}
content 指的是内容提供者ContentProvider。
//com.my.provider映射到我们已定义的那个ContentProvider标识
/test这个作为一个参数,传给ContentProvider,可以根据这个参数来决定操作目标,比如数据库中的哪张表,文件中的那一部分数据等。
我们来操作这个内容提供者:
Java代码- privateStringgetName()
- {
- Stringname=null;
- Cursorcur=this.getContentResolver().query(ProviderConst.MY_TEST_URI,newString[]{"id","name"},null,null,null);
- if(cur==null)
- returnnull;
- cur.moveToFirst();
- do
- {
- name=name+cur.getString(1)+"\n";
- }while(cur.moveToNext());
- returnname;
- }
更多相关文章
- 守护进程通信之Socket
- Android有用代码片断(六)
- 深入解读Linux与Android的相互关系
- Android中JNI的使用
- 爱Android更要懂Android
- 安卓隐藏标题栏状态栏 ,实现全屏效果
- Android(安卓)Activity 常用功能设置(全屏、横竖屏等)
- Android(安卓)SDK各版本源码
- android定位个人当前位置