1.内容提供者
将私有的数据库暴露给其他应用使用。
2.直接暴露数据库
public void query(View v){
String path = "/data/data/com.my.androidpro33/databases/my.db";
SQLiteDatabase readableDatabase = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
Cursor rawQuery = readableDatabase.rawQuery("select name,phone from info", null);
while(rawQuery.moveToNext()){
String name = rawQuery.getString(rawQuery.getColumnIndex("name"));
System.out.println(name);
}
rawQuery.close();
}
3.通过内容提供者访问暴露的数据库
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
public MySQLiteOpenHelper(Context context) {
super(context, "my.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
db.execSQL("alter table info add age integer");
db.execSQL("insert into info(name,phone) values('张','13777771');");
db.execSQL("insert into info(name,phone) values('李','13777772');");
db.execSQL("insert into info(name,phone) values('王','13777773');");
db.execSQL("insert into info(name,phone) values('赵','13777774');");
db.execSQL("insert into info(name,phone) values('田','13777775');");
db.execSQL("insert into info(name,phone) values('bob','13777776');");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
public class MyContentProvider extends ContentProvider {
private static final int QUERY_SUCCESS = 0;
private MySQLiteOpenHelper sqLiteOpenHelper;
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
static {
URI_MATCHER.addURI("com.my.provider", "query", QUERY_SUCCESS );
}
@Override
public boolean onCreate() {
sqLiteOpenHelper = new MySQLiteOpenHelper(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
int result = URI_MATCHER.match(uri);
if(result == QUERY_SUCCESS){
SQLiteDatabase database = sqLiteOpenHelper.getReadableDatabase();
Cursor cursor = database.query("info", null, selection, selectionArgs, null, null, sortOrder);
System.out.println(cursor == null);
return cursor;
}else {
throw new IllegalArgumentException("内容提供者匹配失败");
}
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase database = sqLiteOpenHelper.getReadableDatabase();
long id = database.insert("my.db", null, values);
return Uri.parse(String.valueOf(id));
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase database = sqLiteOpenHelper.getReadableDatabase();
int number = database.delete("my.db", selection, selectionArgs);
return number;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase database = sqLiteOpenHelper.getReadableDatabase();
int number = database.update("my.db", values, selection, selectionArgs);
return number;
}
}
public void query1(View v){
Uri uri = Uri.parse("content://com.my.provider/query");
ContentResolver contentResolver = getContentResolver();
Cursor rawQuery = contentResolver.query(uri, null, null, null, null);
while(rawQuery.moveToNext()){
String name = rawQuery.getString(rawQuery.getColumnIndex("name"));
System.out.println(name);
}
rawQuery.close();
}
<provider android:name="com.my.androidpro35.MyContentProvider"
android:authorities="com.my.provider" android:exported="true"></provider>
4.内容提供者访问短信数据库
public class MainActivity extends Activity {
private List<Sms> list = new ArrayList<Sms>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void query(View v){
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://sms");
String[] projection = {"address","date","body"};
Cursor cursor = resolver.query(uri, projection, null, null, null);
while(cursor.moveToNext()){
String address = cursor.getString(0);
String date = cursor.getString(1);
String body = cursor.getString(2);
Sms sms = new Sms();
sms.address = address;
sms.date = date;
sms.body = body;
list.add(sms);
}
}
public void backups(View v){
XmlSerializer xml = Xml.newSerializer();
try {
xml.setOutput(openFileOutput("sms.xml", MODE_PRIVATE), "utf-8");
xml.startDocument("utf-8", null);
xml.startTag(null, "smsList");
for(Sms sms : list){
xml.startTag(null, "sms");
xml.startTag(null, "address");
xml.text(sms.address);
xml.endTag(null, "address");
xml.startTag(null, "date");
xml.text(sms.date);
xml.endTag(null, "date");
xml.startTag(null, "body");
xml.text(sms.body);
xml.endTag(null, "body");
xml.endTag(null, "sms");
}
xml.endTag(null, "smsList");
xml.endDocument();
} catch (Exception e) {
e.printStackTrace();
}
}
public void insert(View v){
ContentResolver resolver = getContentResolver();
Uri url = Uri.parse("content://sms");
ContentValues values = new ContentValues();
values.put("address", "95555");
values.put("date", System.currentTimeMillis());
values.put("body", "恭喜-----------");
resolver.insert(url, values);
}
}
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
5.内容提供者访问联系人数据库
public class MainActivity extends Activity {
private List<Contact> list = new ArrayList<Contact>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void query(View v){
ContentResolver resolver = getContentResolver();
Uri raw_contacts_uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri data_uri = Uri.parse("content://com.android.contacts/data");
Cursor cursor1 = resolver.query(raw_contacts_uri, new String[]{"contact_id"}, null, null, null);
Contact contact = null;
while(cursor1.moveToNext()){
String contact_id = cursor1.getString(0);
String[] projection = {"data1","mimetype"};
String selection = "raw_contact_id = ?";
String[] selectionArgs = {contact_id};
Cursor cursor2 = resolver.query(data_uri, projection , selection, selectionArgs, null);
contact = new Contact();
while(cursor2.moveToNext()){
String data1 = cursor2.getString(0);
String mimetype = cursor2.getString(1);
if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
contact.phone = data1;
}else if("vnd.android.cursor.item/email_v2".equals(mimetype)){
contact.email = data1;
}else if("vnd.android.cursor.item/name".equals(mimetype)){
contact.name = data1;
}else if("vnd.android.cursor.item/postal-address_v2".equals(mimetype)){
contact.address = data1;
}
}
list.add(contact);
}
for(Contact con : list){
System.out.println(con);
}
}
}
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
6.保存联系人数据
public class MainActivity extends Activity {
private EditText et_name;
private EditText et_address;
private EditText et_phone;
private EditText et_email;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_name = (EditText) findViewById(R.id.et_name);
et_address = (EditText) findViewById(R.id.et_address);
et_phone = (EditText) findViewById(R.id.et_phone);
et_email = (EditText) findViewById(R.id.et_email);
}
public void save(View v){
System.out.println("1");
ContentResolver resolver = getContentResolver();
Uri raw_contacts_uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri data_uri = Uri.parse("content://com.android.contacts/data");
String[] projection = {"contact_id"};
Cursor cursor1 = resolver.query(raw_contacts_uri, projection , null, null, null);
int count = cursor1.getCount() + 1;
System.out.println(count + "count");
ContentValues values = new ContentValues();
values.put("contact_id", count);
resolver.insert(raw_contacts_uri, values);
String name = et_name.getText().toString().trim();
ContentValues nameValues = new ContentValues();
nameValues.put("data1", name);
nameValues.put("mimetype", "vnd.android.cursor.item/name");
nameValues.put("raw_contact_id", count);
resolver.insert(data_uri, nameValues);
String address = et_address.getText().toString().trim();
ContentValues addressValues = new ContentValues();
addressValues.put("data1", address);
addressValues.put("mimetype", "vnd.android.cursor.item/postal-address_v2");
addressValues.put("raw_contact_id", count);
resolver.insert(data_uri, addressValues);
String phone = et_phone.getText().toString().trim();
ContentValues phoneValues = new ContentValues();
phoneValues.put("data1", phone);
phoneValues.put("mimetype", "vnd.android.cursor.item/phone_v2");
phoneValues.put("raw_contact_id", count);
resolver.insert(data_uri, phoneValues);
String email = et_email.getText().toString().trim();
ContentValues emailValues = new ContentValues();
emailValues.put("data1", email);
emailValues.put("mimetype", "vnd.android.cursor.item/email_v2");
emailValues.put("raw_contact_id", count);
resolver.insert(data_uri, emailValues);
Toast.makeText(getApplicationContext(), "OK", Toast.LENGTH_SHORT).show();
}
}
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
7.内容观察者
public void insert(View v){
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.my.provider/insert");
ContentValues values = new ContentValues();
values.put("name", "wang");
values.put("phone", "10101010");
resolver.insert(uri, values);
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int result = URI_MATCHER.match(uri);
if(result == INSERT_SUCCESS){
SQLiteDatabase database = sqLiteOpenHelper.getReadableDatabase();
getContext().getContentResolver().notifyChange(uri, null);
long id = database.insert("info", null, values);
return Uri.parse(String.valueOf(id));
}else {
throw new IllegalArgumentException("匹配失败");
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri uri = Uri.parse("content://com.my.provider/insert");
boolean notifyForDescendents = true;
MyContentObserver observer = new MyContentObserver(new Handler());
getContentResolver().registerContentObserver(uri, notifyForDescendents , observer);
}
private class MyContentObserver extends ContentObserver {
public MyContentObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
System.out.println(uri);
}
}
}
8.内容提供者、内容解析者、内容观察者
1:ContentProvider,内容提供者,可以将自己的数据库暴露出来,使得别来访问。
2:ContentResolver,内容解析者,可以访问别人的数据库。
3:ContentObserver,内容观察者,当数据库数据被修改时,可以回调方法,收到通知。
9.四大组件
1:Activity。声明周期,onCreate当Activity创建了就会被调用,一般用来进行界面、数据的初始化,可以为获取组件、注册广播接受者、开启服务。onStart执行完成界面可见不可操作。Onresume执行完成之后界面可见,可以操作,可以刷新界面。onPause执行完成界面可见不可操作。onStop执行完成界面不可见、不可操作,可以停止刷新界面的操作。onDestory,销魂当前的Activity,可以关闭数据库、注销广播接受者、关闭bind开启服务。
2:Service,没有界面的Activity。主要使得应用在后台运行,可以将长期运行的操作放在Service中。用于解决Activity退出之后,还有任务要完成,使得Activity不能回收,从而造成Activity泄露。有两种开启的方式,startService和bindService。startService的声明周期方法,onCreate、onStartCommand(执行一次startService进行一次调用)、onDestory。bindService的声明周期方法,onCreate、onBind。aidl是rpc的通信方式。
3:BroadcastReceiver。通过Intent进行通信。主要用来发布一些系统通知或者自定义的通知。
4:ContentProvider。提供自己数据库的数据供他人访问。