元数据接口
package com.example.contentproviderprojecrt; import android.net.Uri; import android.provider.BaseColumns; public interface MLDNbatabaseMetaData { //外部访问,content地址://com.example.contentproviderproject public static final String AUTHORITY="com.example.contentproviderproject"; //数据库的名称 public static final String DATABASE_NAME="mldn.db"; //数据库的版本 public static final int VERSION=1; //member表的元素定义,直接继承与_ID和_COUNT静态变量 public static interface MemberTableMetaData extends BaseColumns{ //数据表的名称 public static final String TABLE_NAME="member"; //外部访问的URI地址 public static final Uri CONTENT_URI=Uri.parse("content://"+ AUTHORITY+"/"+TABLE_NAME); //取得member表中的所有数据 public static final String CONTACT_LIST="vnd.android.cursor.dir/vnd.contentproviderproject.member"; //取得一个member信息 public static final String CONTACT_ITEM="vnd.android.cursor.item/vnd.contentproviderproject.member"; //字段名称 public static final String MEMBER_NAME="name"; public static final String MEMBER_AGE="age"; public static final String MEMBER_BIRTHDAY="birthday"; //显示时候的排序字段 public static final String SORT_ORDER="_id DESC"; } }
定义数据库操作类助手
package com.example.contentproviderprojecrt; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class MyDatabaseHelper extends SQLiteOpenHelper { public MyDatabaseHelper(Context context) { //创建数据库 super(context, MLDNbatabaseMetaData.DATABASE_NAME, null, MLDNbatabaseMetaData.VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表 String sql="CREATE TABLE "+MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME+" (" +MLDNbatabaseMetaData.MemberTableMetaData._ID+" INTEGER PRIMARY KEY," +MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_NAME+" VARCHAR(50) NOT NULL," +MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_AGE+" INTEGER NOT NULL," +MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_BIRTHDAY+" DATE NOT NULL" +")"; db.execSQL(sql);//执行SQL语句 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //更新表 String sql="DROP TABLE IF EXISTS "+MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME; db.execSQL(sql);//执行SQL语句 this.onCreate(db);//更新数据库 } }
定义表操作contentProvider类
package com.example.contentproviderprojecrt; 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; public class MemberContentProvider extends ContentProvider { private static UriMatcher uriMatcher=null; //定义UriMatcher对象 private static final int GET_MEMBER_LIST=1; //查询全部的常量标记 private static final int GET_MEMBER_ITEM=2; //根据ID查询的常量标记 private MyDatabaseHelper helper=null; //数据库操作类对象 static{ uriMatcher=new UriMatcher(uriMatcher.NO_MATCH); //实例化UriMatcher uriMatcher.addURI(MLDNbatabaseMetaData.AUTHORITY, MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME, GET_MEMBER_LIST);//增加匹配项 uriMatcher.addURI(MLDNbatabaseMetaData.AUTHORITY, MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME+"/#", GET_MEMBER_ITEM);//增加匹配项 } //删除数据操作 @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db=this.helper.getWritableDatabase(); //以写的方式打开 int result=0;//操作结果 switch(uriMatcher.match(uri)){//匹配传入的Uri case GET_MEMBER_LIST: result=db.delete(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME, selection, selectionArgs); break; case GET_MEMBER_ITEM: long id=ContentUris.parseId(uri); String where="_id="+id; result=db.delete(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME, where, selectionArgs); break; default: throw new UnsupportedOperationException("NOT SUPPORT OPERATION "+uri); } return result; } @Override public String getType(Uri uri) { switch(uriMatcher.match(uri)){//匹配传入的Uri case GET_MEMBER_LIST: return MLDNbatabaseMetaData.MemberTableMetaData.CONTACT_LIST; case GET_MEMBER_ITEM: return MLDNbatabaseMetaData.MemberTableMetaData.CONTACT_ITEM; default: throw new UnsupportedOperationException("NOT SUPPORT OPERATION "+uri);//抛出异常 } } @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db=this.helper.getWritableDatabase();//以写的方式打开 long id=0; //增加之后的ID switch(uriMatcher.match(uri)){//匹配传入的Uri case GET_MEMBER_LIST: id=db.insert(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME, MLDNbatabaseMetaData.MemberTableMetaData._ID, values); String uriPath=uri.toString();//取出地址 String path=uriPath+"/"+id; //建立新的URI地址 return Uri.parse(path); case GET_MEMBER_ITEM: return null; default: throw new UnsupportedOperationException("NOT SUPPORT OPERATION "+uri); } } @Override public boolean onCreate() { this.helper=new MyDatabaseHelper(super.getContext()); //实例化DatabaseHelper return true; //操作成功 } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db=this.helper.getReadableDatabase();//以读的方式打开 switch(uriMatcher.match(uri)){ //匹配传入的Uri case GET_MEMBER_LIST: return db.query(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder); case GET_MEMBER_ITEM: long id=ContentUris.parseId(uri); String where="_id="+id; return db.query(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME, projection, where, selectionArgs, null, null, sortOrder); default: throw new UnsupportedOperationException("NOT SUPPORT OPERATION "+uri); } } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db=this.helper.getWritableDatabase();//以写的方式打开 int result=0; //操作结果 switch(uriMatcher.match(uri)){//匹配传入的Uri case GET_MEMBER_LIST: result=db.update(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME, values, null, null); break; case GET_MEMBER_ITEM: long id=ContentUris.parseId(uri); String where="_id="+id; result=db.update(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME, values, where, selectionArgs); break; default: throw new UnsupportedOperationException("NOT SUPPORT OPERATION "+uri); } return result; } }
Acitivity程序
package com.example.contentproviderprojecrt; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class MainActivity extends Activity { private Button insertBut=null; private Button updateBut=null; private Button deleteBut=null; private Button queryBut=null; private ListView memberList=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_main); this.insertBut=(Button)super.findViewById(R.id.insertBut);//获取按钮 this.insertBut.setOnClickListener(new InsertOnClickListener());//设置按钮单击事件 this.updateBut=(Button)super.findViewById(R.id.updateBut);//获取按钮 this.updateBut.setOnClickListener(new UpdateOnClickListener());//设置按钮单击事件 this.deleteBut=(Button)super.findViewById(R.id.deleteBut);//获取按钮 this.deleteBut.setOnClickListener(new DeleteOnClickListener());//设置按钮单击事件 this.queryBut=(Button)super.findViewById(R.id.queryBut);//获取按钮 this.queryBut.setOnClickListener(new QueryOnClickListener());//设置按钮单击事件 this.memberList=(ListView)super.findViewById(R.id.memberList);//获取ListView } private class QueryOnClickListener implements OnClickListener{//查询按钮事件 @Override public void onClick(View v) { Cursor result=MainActivity.this.textQuery(null);//查询的结果集 List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();//用于设置SimpleAdapter for(result.moveToFirst();!result.isAfterLast();result.moveToNext()){//循环取出数据 Map<String,Object> map=new HashMap<String, Object>(); map.put("_id", result.getInt(0)); map.put("name", result.getString(1)); map.put("age", result.getInt(2)); map.put("birthday", result.getString(3)); list.add(map); //保存取出的数据 } MainActivity.this.memberList.setAdapter(new SimpleAdapter( MainActivity.this, //将数据包装 list, //数据集合 R.layout.member,//显示的布局文件 new String[]{"_id","name","age","birthday"}, //匹配的Map key new int[]{R.id._id,R.id.name,R.id.age,R.id.birthday})); //布局文件里面对应的ID } } private class DeleteOnClickListener implements OnClickListener{//删除按钮事件 @Override public void onClick(View v) { long result=0;//返回删除了多少条数据 result=MainActivity.this.textDelete(String.valueOf(2)); Toast.makeText(MainActivity.this, "result="+result, Toast.LENGTH_LONG).show(); } } private class UpdateOnClickListener implements OnClickListener{//更新按钮事件 @Override public void onClick(View v) { long result=0;//返回更新了多少条数据 result=MainActivity.this.textUpdate("1", "李元静", 18, "1998-01-01"); Toast.makeText(MainActivity.this, "result="+result, Toast.LENGTH_LONG).show(); } } private class InsertOnClickListener implements OnClickListener{//增加按钮事件 @Override public void onClick(View v) { long id=0;//保存接受ID id=MainActivity.this.textInsert("李元静", 21, new SimpleDateFormat("yyyy-MM-dd").format(new Date())); Toast.makeText(MainActivity.this, "id="+id, Toast.LENGTH_LONG).show(); } } private Cursor textQuery(String _id){ if(_id==null || "".equals(_id)){//查询全部数据 return super.getContentResolver().query( MLDNbatabaseMetaData.MemberTableMetaData.CONTENT_URI , null, null, null, MLDNbatabaseMetaData.MemberTableMetaData.SORT_ORDER); }else{//查询指定ID数据 return super.getContentResolver().query( Uri.withAppendedPath(MLDNbatabaseMetaData.MemberTableMetaData.CONTENT_URI, _id) , null, null, null, MLDNbatabaseMetaData.MemberTableMetaData.SORT_ORDER); } } private long textDelete(String _id){ ContentResolver contentSesolver=super.getContentResolver();//定义取得ContentResolver对象 int result=0; if(_id==null || "".equals(_id)){//删除全部数据 result=contentSesolver.delete(MLDNbatabaseMetaData.MemberTableMetaData.CONTENT_URI, null, null); }else{//删除指定数据 result=contentSesolver.delete(Uri.withAppendedPath(MLDNbatabaseMetaData.MemberTableMetaData.CONTENT_URI, _id), null, null); } return result; } private long textInsert(String name,int age,String birthday){ ContentResolver contentSesolver=null;//定义ContentResolver contentSesolver=super.getContentResolver();//取得contentSesolver ContentValues values=new ContentValues();//设置内容 values.put(MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_NAME, name); values.put(MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_AGE, age); values.put(MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_BIRTHDAY, birthday); Uri resultUri=contentSesolver.insert(MLDNbatabaseMetaData.MemberTableMetaData.CONTENT_URI, values); return ContentUris.parseId(resultUri);//解析ID返回 } private long textUpdate(String _id,String name,int age,String birthday){ long result=0; ContentResolver contentSesolver=null; //定义ContentResolver contentSesolver=super.getContentResolver();//取得contentSesolver ContentValues values=new ContentValues();//设置内容 values.put(MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_NAME, name); values.put(MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_AGE, age); values.put(MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_BIRTHDAY, birthday); if(_id==null || "".equals(_id)){//更新全部 result=contentSesolver.update(MLDNbatabaseMetaData.MemberTableMetaData.CONTENT_URI, values, null, null); }else{//更新制定数据 result=contentSesolver.update( Uri.withAppendedPath(MLDNbatabaseMetaData.MemberTableMetaData.CONTENT_URI, _id), values, null, null); } Uri resultUri=contentSesolver.insert(MLDNbatabaseMetaData.MemberTableMetaData.CONTENT_URI, values); return result; } @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; } }
Layout:activity_mail.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" > <Button android:id="@+id/insertBut" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="添加数据"/> <Button android:id="@+id/updateBut" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="修改数据"/> <Button android:id="@+id/deleteBut" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="删除数据"/> <Button android:id="@+id/queryBut" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询数据"/> </LinearLayout> <ListView android:id="@+id/memberList" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
member.xml
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TableRow > <TextView android:id="@+id/_id" android:layout_width="30px" android:layout_height="wrap_content"/> <TextView android:id="@+id/name" android:layout_width="100px" android:layout_height="wrap_content"/> <TextView android:id="@+id/age" android:layout_width="30px" android:layout_height="wrap_content"/> <TextView android:id="@+id/birthday" android:layout_width="150px" android:layout_height="wrap_content"/> </TableRow> </TableLayout>