自己写内容提供者(cp端)
布局:
相关代码
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="167dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText2"
android:layout_below="@+id/editText"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="35dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="save"
android:id="@+id/save"
android:layout_below="@+id/editText2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="29dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="get"
android:id="@+id/get"
android:layout_alignBottom="@+id/save"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
准备Sqlite数据库
MainActivity 代码
public class MainActivity extends AppCompatActivity {
private EditText un;
private EditText pw;
private Button save;
private Button get;
private SQLiteDatabase sqLiteDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
un= (EditText) findViewById(R.id.editText);
pw= (EditText) findViewById(R.id.editText2);
save= (Button) findViewById(R.id.save);
get= (Button) findViewById(R.id.get);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String unV=un.getText().toString().trim();
String pwV=pw.getText().toString().trim();
MySqlite sqlite=new MySqlite(MainActivity.this, "lesson12",1);
sqLiteDatabase=sqlite.getReadableDatabase();
/* String sql="insert into user(un.pw) values('"+unV+"','"+pwV+"')";
boolean bol=false;
sqLiteDatabase.execSQL(sql);
bol=true;*/
ContentValues contentValues=new ContentValues();
contentValues.put("un",unV);
contentValues.put("pw",pwV);
Long i= sqLiteDatabase.insert("user",null,contentValues);
Log.i("message",i+"");
}
});
get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MySqlite mysqlite=new MySqlite(MainActivity.this,"lesson12",1);
sqLiteDatabase= mysqlite.getReadableDatabase();//库才会创建,并且创建表
//Cursor相当与Resultset
Cursor cursor=sqLiteDatabase.rawQuery("select* from user",null);//第二个参数给?赋值
cursor.moveToNext();//相当于Resultset。next()
String info=cursor.getString(1);//根据列的索引取值,从0开始
Log.i("message",info);
String name=cursor.getColumnName(0);//根据列名取值
Log.i("message",name);
}
});
}
}
MySqlite 代码
public class MySqlite extends SQLiteOpenHelper {
public MySqlite(Context context, String name, int version) {
super(context, "lesson12", null, version);
}
//执行创建表的语句,只会调用一次
@Override
public void onCreate(SQLiteDatabase db) {
String sql="create table user(id Integer primary key autoincrement,un varchar(30),pw varchar(30))";
boolean bol=false;
db.execSQL(sql);
bol=true;
}
//修改表结构,当版本号有更改时调用(版本号的值只能从小到大)
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
写CP端代码
1.创建一个类 继承ContentProvider,重写里面的方法
2,修改onCreate()方法,得到数据库sqLiteDatabase
private SQLiteDatabase sqLiteDatabase;
//得到数据库sqLiteDatabase
@Override
public boolean onCreate() {
MySqlite mySqlite = new MySqlite(getContext(),5);
sqLiteDatabase = mySqlite.getReadableDatabase();
return false;
}
Android中有四大组件 activity service receiver provider ,可通过 getContext()获得上下文
3.制作自己的URL
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static{
//制作uri的三种写法
//1.p1:类的地址 p2:表名 p3:匹配码
//content://com.hzyc.tf61.lesson12_1.MyCp/user
uriMatcher.addURI("com.hzyc.tf61.lesson12_1.MyCp","user",1);//操作的是整张表
//content://com.hzyc.tf61.lesson12_1.MyCp/user/1
uriMatcher.addURI("com.hzyc.tf61.lesson12_1.MyCp","user/#",2);//操作的是整张表中的id为#这行数据
//content://com.hzyc.tf61.lesson12_1.MyCp/user/1/un
uriMatcher.addURI("com.hzyc.tf61.lesson12_1.MyCp","user/#/*",3);//操作的是整张表中的id为# 列为* 这行这列数据
}
4.在manifest.xml中注册并提供权限
注册权限
permission使用一种权限 exported允许别人访问
<provider
android:authorities="com.black.sq.lesson12_1.MyCp"
android:name=".MyCp"
android:permission="black.LESSON12_1"
android:exported="true"
/>
自定义权限
name:给权限起名
label:解释权限的作用
protectionLevel:保护级别
权限的写法:多个单词,每个单词以“.”分割,除了最后一个单词其他的全小写,最后一个单词的所有字母大写
<permission android:name="black.LESSON12_1"
android:label="get data"
android:protectionLevel="normal"
/>
cp端完整代码:
public class MyCp extends ContentProvider {
//先制作自己的URL
private static UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
static {
//制作URI的三种写法
uriMatcher.addURI("com.black.sq.lesson12_1.MyCp","user",1);
uriMatcher.addURI("com.black.sq.lesson12_1.MyCp","user/#",2);
uriMatcher.addURI("com.black.sq.lesson12_1.MyCp","user/#/*",3);
}
private SQLiteDatabase sqLiteDatabase;
@Override
public boolean onCreate() {
MySqlite mySqlite=new MySqlite(getContext(),"lesson12",4);
sqLiteDatabase=mySqlite.getReadableDatabase();
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return null;
}
@Nullable
@Override
public String getType(Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
int code= uriMatcher.match(uri);
switch (code){
case 1: Long i= sqLiteDatabase.insert("user",null,values);//i代表主键
uri= ContentUris.withAppendedId(uri,i);//给URI增加ID
break;
}
return uri;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
}
访问端
1.在manifest.xml中获取.LESSON12_1权限:
<uses-permission android:name="black.LESSON12_1"/>
2.布局中准备一个按钮
MainActivity代码:
public class Main3Activity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ContentResolver contentResolver=getContentResolver();
ContentValues contentValues=new ContentValues();
contentValues.put("un","abc");
contentValues.put("pw","123");
String uri="content://com.black.sq.lesson12_1.MyCp/user";
Uri uri1= contentResolver.insert(Uri.parse(uri),contentValues);
//从 uri1中把ID取出
long id= ContentUris.parseId(uri1);//id就是主键
Log.i("message",id+"");
}
});
}
}
总结:
App2:
1.准备数据库 Sqlitedatabase 能正常使用(可以在app2内部测试)
2.创建cp端
创建个类,继承ContentProvider,实现6个方法 增删该查 onCreate是用来得到Sqlitedatabase
3.因为cr需要通过url访问cp,cp需要事先定义uri
UriMatcher去定义
4.在manifest.xml中注册provider < provider>
需要权限,自定义权限 < permission></ permission>
App1:
1.创建自己的客户端cr
2.通过uri访问cp uri的写法参照定义好的UriMatcher
3.获得访问app2 cp的权限< use-permissions>