android中数据存储的ContentProvider的使用方法
元数据接口
packagecom.example.contentproviderprojecrt;
importandroid.net.Uri;
importandroid.provider.BaseColumns;
publicinterfaceMLDNbatabaseMetaData{
//外部访问,content地址://com.example.contentproviderproject
publicstaticfinalStringAUTHORITY="com.example.contentproviderproject";
//数据库的名称
publicstaticfinalStringDATABASE_NAME="mldn.db";
//数据库的版本
publicstaticfinalintVERSION=1;
//member表的元素定义,直接继承与_ID和_COUNT静态变量
publicstaticinterfaceMemberTableMetaDataextendsBaseColumns{
//数据表的名称
publicstaticfinalStringTABLE_NAME="member";
//外部访问的URI地址
publicstaticfinalUriCONTENT_URI=Uri.parse("content://"+
AUTHORITY+"/"+TABLE_NAME);
//取得member表中的所有数据
publicstaticfinalStringCONTACT_LIST="vnd.android.cursor.dir/vnd.contentproviderproject.member";
//取得一个member信息
publicstaticfinalStringCONTACT_ITEM="vnd.android.cursor.item/vnd.contentproviderproject.member";
//字段名称
publicstaticfinalStringMEMBER_NAME="name";
publicstaticfinalStringMEMBER_AGE="age";
publicstaticfinalStringMEMBER_BIRTHDAY="birthday";
//显示时候的排序字段
publicstaticfinalStringSORT_ORDER="_idDESC";
}
}
定义数据库操作类助手
packagecom.example.contentproviderprojecrt;
importandroid.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteDatabase.CursorFactory;
importandroid.database.sqlite.SQLiteOpenHelper;
publicclassMyDatabaseHelperextendsSQLiteOpenHelper{
publicMyDatabaseHelper(Contextcontext){
//创建数据库
super(context,MLDNbatabaseMetaData.DATABASE_NAME,null,MLDNbatabaseMetaData.VERSION);
}
@Override
publicvoidonCreate(SQLiteDatabasedb){
//创建表
Stringsql="CREATETABLE"+MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME+"("
+MLDNbatabaseMetaData.MemberTableMetaData._ID+"INTEGERPRIMARYKEY,"
+MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_NAME+"VARCHAR(50)NOTNULL,"
+MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_AGE+"INTEGERNOTNULL,"
+MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_BIRTHDAY+"DATENOTNULL"
+")";
db.execSQL(sql);//执行SQL语句
}
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
//更新表
Stringsql="DROPTABLEIFEXISTS"+MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME;
db.execSQL(sql);//执行SQL语句
this.onCreate(db);//更新数据库
}
}
定义表操作contentProvider类
packagecom.example.contentproviderprojecrt;
importandroid.content.ContentProvider;
importandroid.content.ContentUris;
importandroid.content.ContentValues;
importandroid.content.UriMatcher;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.net.Uri;
publicclassMemberContentProviderextendsContentProvider{
privatestaticUriMatcheruriMatcher=null;//定义UriMatcher对象
privatestaticfinalintGET_MEMBER_LIST=1;//查询全部的常量标记
privatestaticfinalintGET_MEMBER_ITEM=2;//根据ID查询的常量标记
privateMyDatabaseHelperhelper=null;//数据库操作类对象
static{
uriMatcher=newUriMatcher(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
publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
SQLiteDatabasedb=this.helper.getWritableDatabase();//以写的方式打开
intresult=0;//操作结果
switch(uriMatcher.match(uri)){//匹配传入的Uri
caseGET_MEMBER_LIST:
result=db.delete(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME,selection,selectionArgs);
break;
caseGET_MEMBER_ITEM:
longid=ContentUris.parseId(uri);
Stringwhere="_id="+id;
result=db.delete(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME,where,selectionArgs);
break;
default:
thrownewUnsupportedOperationException("NOTSUPPORTOPERATION"+uri);
}
returnresult;
}
@Override
publicStringgetType(Uriuri){
switch(uriMatcher.match(uri)){//匹配传入的Uri
caseGET_MEMBER_LIST:
returnMLDNbatabaseMetaData.MemberTableMetaData.CONTACT_LIST;
caseGET_MEMBER_ITEM:
returnMLDNbatabaseMetaData.MemberTableMetaData.CONTACT_ITEM;
default:
thrownewUnsupportedOperationException("NOTSUPPORTOPERATION"+uri);//抛出异常
}
}
@Override
publicUriinsert(Uriuri,ContentValuesvalues){
SQLiteDatabasedb=this.helper.getWritableDatabase();//以写的方式打开
longid=0;//增加之后的ID
switch(uriMatcher.match(uri)){//匹配传入的Uri
caseGET_MEMBER_LIST:
id=db.insert(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME,
MLDNbatabaseMetaData.MemberTableMetaData._ID,values);
StringuriPath=uri.toString();//取出地址
Stringpath=uriPath+"/"+id;//建立新的URI地址
returnUri.parse(path);
caseGET_MEMBER_ITEM:
returnnull;
default:
thrownewUnsupportedOperationException("NOTSUPPORTOPERATION"+uri);
}
}
@Override
publicbooleanonCreate(){
this.helper=newMyDatabaseHelper(super.getContext());//实例化DatabaseHelper
returntrue;//操作成功
}
@Override
publicCursorquery(Uriuri,String[]projection,Stringselection,
String[]selectionArgs,StringsortOrder){
SQLiteDatabasedb=this.helper.getReadableDatabase();//以读的方式打开
switch(uriMatcher.match(uri)){//匹配传入的Uri
caseGET_MEMBER_LIST:
returndb.query(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME,
projection,selection,selectionArgs,null,null,sortOrder);
caseGET_MEMBER_ITEM:
longid=ContentUris.parseId(uri);
Stringwhere="_id="+id;
returndb.query(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME,projection,where,selectionArgs,null,null,sortOrder);
default:
thrownewUnsupportedOperationException("NOTSUPPORTOPERATION"+uri);
}
}
@Override
publicintupdate(Uriuri,ContentValuesvalues,Stringselection,
String[]selectionArgs){
SQLiteDatabasedb=this.helper.getWritableDatabase();//以写的方式打开
intresult=0;//操作结果
switch(uriMatcher.match(uri)){//匹配传入的Uri
caseGET_MEMBER_LIST:
result=db.update(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME,values,null,null);
break;
caseGET_MEMBER_ITEM:
longid=ContentUris.parseId(uri);
Stringwhere="_id="+id;
result=db.update(MLDNbatabaseMetaData.MemberTableMetaData.TABLE_NAME,values,where,selectionArgs);
break;
default:
thrownewUnsupportedOperationException("NOTSUPPORTOPERATION"+uri);
}
returnresult;
}
}
Acitivity程序
packagecom.example.contentproviderprojecrt;
importjava.text.SimpleDateFormat;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importandroid.net.Uri;
importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.content.ContentResolver;
importandroid.content.ContentUris;
importandroid.content.ContentValues;
importandroid.database.Cursor;
importandroid.view.Menu;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.ListView;
importandroid.widget.SimpleAdapter;
importandroid.widget.Toast;
publicclassMainActivityextendsActivity{
privateButtoninsertBut=null;
privateButtonupdateBut=null;
privateButtondeleteBut=null;
privateButtonqueryBut=null;
privateListViewmemberList=null;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_main);
this.insertBut=(Button)super.findViewById(R.id.insertBut);//获取按钮
this.insertBut.setOnClickListener(newInsertOnClickListener());//设置按钮单击事件
this.updateBut=(Button)super.findViewById(R.id.updateBut);//获取按钮
this.updateBut.setOnClickListener(newUpdateOnClickListener());//设置按钮单击事件
this.deleteBut=(Button)super.findViewById(R.id.deleteBut);//获取按钮
this.deleteBut.setOnClickListener(newDeleteOnClickListener());//设置按钮单击事件
this.queryBut=(Button)super.findViewById(R.id.queryBut);//获取按钮
this.queryBut.setOnClickListener(newQueryOnClickListener());//设置按钮单击事件
this.memberList=(ListView)super.findViewById(R.id.memberList);//获取ListView
}
privateclassQueryOnClickListenerimplementsOnClickListener{//查询按钮事件
@Override
publicvoidonClick(Viewv){
Cursorresult=MainActivity.this.textQuery(null);//查询的结果集
List<Map<String,Object>>list=newArrayList<Map<String,Object>>();//用于设置SimpleAdapter
for(result.moveToFirst();!result.isAfterLast();result.moveToNext()){//循环取出数据
Map<String,Object>map=newHashMap<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(newSimpleAdapter(
MainActivity.this,//将数据包装
list,//数据集合
R.layout.member,//显示的布局文件
newString[]{"_id","name","age","birthday"},//匹配的Mapkey
newint[]{R.id._id,R.id.name,R.id.age,R.id.birthday}));//布局文件里面对应的ID
}
}
privateclassDeleteOnClickListenerimplementsOnClickListener{//删除按钮事件
@Override
publicvoidonClick(Viewv){
longresult=0;//返回删除了多少条数据
result=MainActivity.this.textDelete(String.valueOf(2));
Toast.makeText(MainActivity.this,"result="+result,Toast.LENGTH_LONG).show();
}
}
privateclassUpdateOnClickListenerimplementsOnClickListener{//更新按钮事件
@Override
publicvoidonClick(Viewv){
longresult=0;//返回更新了多少条数据
result=MainActivity.this.textUpdate("1","李元静",18,"1998-01-01");
Toast.makeText(MainActivity.this,"result="+result,Toast.LENGTH_LONG).show();
}
}
privateclassInsertOnClickListenerimplementsOnClickListener{//增加按钮事件
@Override
publicvoidonClick(Viewv){
longid=0;//保存接受ID
id=MainActivity.this.textInsert("李元静",21,newSimpleDateFormat("yyyy-MM-dd").format(newDate()));
Toast.makeText(MainActivity.this,"id="+id,Toast.LENGTH_LONG).show();
}
}
privateCursortextQuery(String_id){
if(_id==null||"".equals(_id)){//查询全部数据
returnsuper.getContentResolver().query(
MLDNbatabaseMetaData.MemberTableMetaData.CONTENT_URI
,null,null,null,
MLDNbatabaseMetaData.MemberTableMetaData.SORT_ORDER);
}else{//查询指定ID数据
returnsuper.getContentResolver().query(
Uri.withAppendedPath(MLDNbatabaseMetaData.MemberTableMetaData.CONTENT_URI,_id)
,null,null,null,
MLDNbatabaseMetaData.MemberTableMetaData.SORT_ORDER);
}
}
privatelongtextDelete(String_id){
ContentResolvercontentSesolver=super.getContentResolver();//定义取得ContentResolver对象
intresult=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);
}
returnresult;
}
privatelongtextInsert(Stringname,intage,Stringbirthday){
ContentResolvercontentSesolver=null;//定义ContentResolver
contentSesolver=super.getContentResolver();//取得contentSesolver
ContentValuesvalues=newContentValues();//设置内容
values.put(MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_NAME,name);
values.put(MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_AGE,age);
values.put(MLDNbatabaseMetaData.MemberTableMetaData.MEMBER_BIRTHDAY,birthday);
UriresultUri=contentSesolver.insert(MLDNbatabaseMetaData.MemberTableMetaData.CONTENT_URI,values);
returnContentUris.parseId(resultUri);//解析ID返回
}
privatelongtextUpdate(String_id,Stringname,intage,Stringbirthday){
longresult=0;
ContentResolvercontentSesolver=null;//定义ContentResolver
contentSesolver=super.getContentResolver();//取得contentSesolver
ContentValuesvalues=newContentValues();//设置内容
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);
}
UriresultUri=contentSesolver.insert(MLDNbatabaseMetaData.MemberTableMetaData.CONTENT_URI,values);
returnresult;
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.main,menu);
returntrue;
}
}
Layout:activity_mail.xml
<LinearLayoutxmlns: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
<?xmlversion="1.0"encoding="utf-8"?>
<TableLayoutxmlns: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>
更多相关文章
- mybatisplus的坑 insert标签insert into select无参数问题的解决
- python起点网月票榜字体反爬案例
- Android(安卓)拨号器的简单实现
- 《Android开发从零开始》——25.数据存储(4)
- Android系统配置数据库注释(settings.db)
- android用户界面之按钮(Button)教程实例汇
- Android中不同应用间实现SharedPreferences数据共享
- Android开发环境搭建
- haproxy根据客户端浏览器进行跳转