标签:
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。
创建步骤:
1)创建类继承ContentProvider父类;
2)定义public static final的Uri类型的类常量,为其指定一个唯一的字符串值,最好是以类的全名称。如:
public static final Uri CONTENT_URI = Uri.parse( "content://com.google.android.MyContentProvider");
3)定义要返回给客户端的数据列名。如果使用Android数据库,必须定义_id的列,用来表示每条记录的唯一性。
4)创建数据存储系统。大多数Content Provider使用Android文件系统或SQLite数据库来保持数据。
5)声明public static String型的变量,指定要从游标处返回的数据列。
6)使用ContentResover().notifyChange()方法来通知监听器关于数据更新的信息。
7)在AndroidManifest.xml使用<provider>对该ContentProvider进行配置。
新建项目
新建layout布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity2" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/main2_bt1"
android:text="保存" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/main2_bt2"
android:text="取出" />
</LinearLayout>
新建java类的Util
package com.example.android_lession8_4;
import android.net.Uri;
import android.provider.BaseColumns;
//该工具包用于指明用户自定义的cp 的uri和对应字段的名称
public class MyUtil {
// 根地址
public final static String AUTHORITY="com.zyy.test.MyContentProvider";
//BaseColumns默认指明了两个字段_ID _Count 其中id表示标识符,count表示行数
public static final class User implements BaseColumns{
//指明了cp的uri地址
public static final Uri CONTENT_URI=Uri.parse("content://"+AUTHORITY);
//cp中的数据项
public static final String USER_NAME="USER_NAME";
public static final String USER_PWD="USER_PWD";
}
}
创建自定义content provider 为了多个app数据共享
package com.example.android_lession8_4;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.util.Log;
public class MyContentProvider extends ContentProvider {
private SQLiteDatabase sqlDB;// 数据库库对象
private static final String DATABASE_NAME="user.db"; //声明数据库名称
private static final int DATABASE_VERSION=1; //声明数据库版本号
private static final String DATABASE_TABLE="t_User"; //存储的表名
private MyDataBaseHelper dbhelper; //数据库帮助类,用来创建数据库并获取相关读写权限
//搭建sqlite操作环境
private static class MyDataBaseHelper extends SQLiteOpenHelper{
public MyDataBaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建用于存储数据的表
db.execSQL("Create table "+DATABASE_TABLE+" (_id integer primary key autoincrement,USER_NAME text,USER_PWD text);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists "+DATABASE_TABLE);
onCreate(db);
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
//保存
@Override
public Uri insert(Uri uri, ContentValues values) {
sqlDB=dbhelper.getWritableDatabase();//获取数据库写对象
//返回受影响行id
long rowid=sqlDB.insert(DATABASE_TABLE, null, values);
if(rowid>0){
//创建对应"表的uri"
Uri rowUri=ContentUris.appendId(MyUtil.User.CONTENT_URI.buildUpon(), rowid).build();
Log.d("zyy", "rowuri:"+rowUri.getPath());
//通知cp监听器更新(增删改通用)
getContext().getContentResolver().notifyChange(rowUri, null);
return rowUri;
}
throw new SQLException("cp 插入数据失败:"+uri);
}
@Override
public boolean onCreate() {
//实例化数据库帮助类对象,由他来创建数据库存储表
dbhelper=new MyDataBaseHelper(getContext());
return dbhelper==null?false:true;
}
//取
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// 获取数据库读对象
sqlDB=dbhelper.getReadableDatabase();
//设置sql查询创建者
SQLiteQueryBuilder sq=new SQLiteQueryBuilder();
//设置查询表
sq.setTables(DATABASE_TABLE);
//获取对应的cp在sqlite中查询结果集
Cursor cursor=sq.query(sqlDB, projection, selection, selectionArgs, null, null, sortOrder);
//后台检测数据变化,如果有变化,则返回变化后的cursor
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
创建activity活动java类
package com.example.android_lession8_4;
import android.os.Bundle;
import android.app.Activity;
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.Toast;
public class MainActivity2 extends Activity implements OnClickListener{
private Button bt1,bt2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_activity2);
bt1=(Button) findViewById(R.id.main2_bt1);
bt2=(Button) findViewById(R.id.main2_bt2);
bt1.setOnClickListener(this);
bt2.setOnClickListener(this);
}
@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_activity2, menu);
return true;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main2_bt1:
//存数据
ContentValues cv=new ContentValues();
cv.put(MyUtil.User.USER_NAME, "zyy");
cv.put(MyUtil.User.USER_PWD, "123");
getApplicationContext().getContentResolver().insert(MyUtil.User.CONTENT_URI, cv);
Toast.makeText(getApplicationContext(), "添加成功", Toast.LENGTH_LONG).show();
break;
case R.id.main2_bt2:
//取数据
String colums[] =new String[]{MyUtil.User._ID,MyUtil.User.USER_NAME,MyUtil.User.USER_PWD};
Cursor c=getApplicationContext().getContentResolver().query(MyUtil.User.CONTENT_URI, colums, null, null, null);
int a=10;
int id=-1;
String username=null;
String userpwd=null;
while(c.moveToNext()){
id=c.getInt(c.getColumnIndex(MyUtil.User._ID));
username=c.getString(c.getColumnIndex(MyUtil.User.USER_NAME));
userpwd=c.getString(c.getColumnIndex(MyUtil.User.USER_PWD));
}
Toast.makeText(getApplicationContext(), "id:"+id+" 姓名:"+username+" 密码:"+userpwd, Toast.LENGTH_LONG).show();
break;
}
}
}
自定义broadcastReceiver广播基础demo介绍
标签:
原文地址:http://www.cnblogs.com/andriod2016/p/5664448.html