什么是ContentProvider呢,中文就内容提供者,他能将一个应用中的数据保存至数据库,并且这个数据库是私有的,在内部存储中,然后供其他应用访问。需要供其他应用访问,前提就是在这个应用下的AndroidManifest.xml设置内容提供者代码:
注意:
authorities是数据共享相当于钥匙,只有填对了这个才能访问,自定义
name:内容提供者的名字,自定义
exported:为true才能将数据库作为内容来供外界应用访问
效果图:
首先,先创建两个空的应用,
第一个应用:用来提供数据
创建一个新类,我命名为:MyProvider.java,需要继承ContentProvider并实现其方法。
修改AndroidManifest.xml文件添加内容提供者组件
第二个应用:用来读取数据
下面来说说第一个应用的代码:
activity_main.xml:
AndroidManifest.xml:
MyProvider.java:
package com.oak.d2_contentprovider_writer;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.Nullable;
public class MyProvider extends ContentProvider {
//静态常量,内容提供者存储数据需要的URL,就是AndroidManifest中设置的authorities
public static final Uri URL = Uri.parse("content://com.oak.contentprovider");
private SQLiteDatabase sqLiteDatabase;//数据库
private int isOk =0;//判断数据库中是否存在tab这个表,如果存在,就不再创建。
@Override
public boolean onCreate() {
//打开或创建一个数据库,名字为data.db,私有的
sqLiteDatabase = getContext().openOrCreateDatabase("data.db", Context.MODE_PRIVATE,null);
//查找出这个数据库中的所有表
Cursor cursor = sqLiteDatabase.rawQuery("select name from sqlite_master where type='table';", null);
//将查询出的结果的指针移到第一个,然后循环
cursor.moveToFirst();
while(cursor.moveToNext()){
//遍历出表名
String name = cursor.getString(0);
System.out.println("存在表:"+ name);
//如果存在则不执行下面的if语句中的创建表代码
if (name == "tab")
isOk=1;
}
//创建表代码
if (isOk==0)
sqLiteDatabase.execSQL("create table tab (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL)");
//这里要返回true
return true;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues contentValues) {
//添加数据到表tab中
sqLiteDatabase.insert("tab","_id",contentValues);
return null;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
//查找tab中的数据
Cursor cursor = sqLiteDatabase.query("tab",null,null,null,null,null,null);
return cursor;
}
@Nullable
@Override
public String getType(Uri uri) {
return null;
}
@Override
public int delete(Uri uri, String s, String[] strings) {
return 0;
}
@Override
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
return 0;
}
}
MainActivity.java
package com.oak.d2_contentprovider_writer;
import android.content.ContentValues;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button bt_insert;//拿到写入按钮
private EditText et;//那到编辑框
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到组件编辑框
et = (EditText) findViewById(R.id.et);
//找到组件写入按钮
bt_insert = (Button) findViewById(R.id.bt_insert);
//为写入按钮添加侦听事件
bt_insert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//将编辑框内容保存到变量txt中
String txt = et.getText().toString();
//实例化ContentValues,然后添加数据
ContentValues values = new ContentValues();
Toast.makeText(getApplicationContext(),txt,Toast.LENGTH_SHORT).show();
values.put("name",txt);
//将ContenValues传递到数据库中
getContentResolver().insert(MyProvider.URL,values);
}
});
}
}
第一个应用到这里就结束了,下面我们来写读取内容的第二个应用。
第二应用代码如下:
MainActivity.java:
package com.oak.d2_contentprovider_reader;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//这里写读取那个应用中AndroidManifest中设置的authorities,写错了就读取不到了
private static final Uri URI = Uri.parse("content://com.oak.contentprovider");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//查询数据库中的内容,然后返回结果
Cursor cursor = getContentResolver().query(URI,null,null,null,null);
//将返回的结果的指针移到第一个
cursor.moveToFirst();
//循环结果
for (int i=0;i
到这里就完成了利用内容提供者两个应用之间数据的传递。还有不懂的童鞋们可以给我留言,我会第一时间回复你们的。
By:Brycen Liu