Android(java)学习笔记253:ContentProvider使用之内容观察者02
下面通过3个应用程序之间的交互说明一下内容观察者:
一、 如下3个应用程序为相互交互的:
二、交互逻辑图:
三、具体代码:
1. 16_数据库工程:
(1)数据库帮助类BankDBOpenHelper(继承自SQLiteOpenHelper):
package com.itheima.db; import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper; /**
* 银行数据库打开的帮助类
* @author Administrator
*
*/
public class BankDBOpenHelper extends SQLiteOpenHelper { public BankDBOpenHelper(Context context) {
super(context, "bank.db", null, 1);
}
//数据库第一次被创建调用的方法,适合做数据库表结构的初始化
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table account (_id integer primary key autoincrement,name varchar(20),money varchar(2))");
}
//数据库版本更新的时候调用的方法
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}
(2)操作数据库的工具类BankDBDao,如下:
package com.itheima.db.dao; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import com.itheima.db.BankDBOpenHelper; /**
* 银行数据库的data access object
*/
public class BankDBDao {
private BankDBOpenHelper helper;
public BankDBDao(Context context) {
helper = new BankDBOpenHelper(context);
}
/**
* 添加一条账户信息
* @param name 姓名
* @param money 钱
* @return 代表添加在数据库的行号id 如果返回-1代表添加失败,用户已经存在
*/
public long add(String name,float money){
if(isUserExist(name)){
return -1;
}
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("money", money);
long rowID = db.insert("account", null, values);
db.close();
return rowID;
}
/**
* 删除一条数据库的记录
* @param name
* @return 是否删除成功
*/
public boolean delete(String name){
SQLiteDatabase db = helper.getWritableDatabase();
int result = db.delete("account", "name=?", new String[]{name});
db.close();
if(result>0){
return true;
}else{
return false;
}
}
/**
* 修改用户的账户信息
* @param name 要修改储户的姓名
* @param money 新的账户余额
* @return 是否修改成功
*/
public boolean update(String name,float money){
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("money", money);
int result = db.update("account", values, "name=?", new String[]{name});
db.close();
if(result>0){
return true;
}else{
return false;
}
}
/**
* 查询某个用户有多少钱
* @param name
* @return
*/
public float getUserMoney(String name){
float money = 0;
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("account", new String[]{"money"}, "name=?", new String[]{name}, null, null, null);
if(cursor.moveToNext()){
money = cursor.getFloat(0);
}cursor.close();
db.close();
return money;
} /**
* 查询某个用户是否存在
* @param name
* @return
*/
public boolean isUserExist(String name){
boolean result = false;
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("account", null, "name=?", new String[]{name}, null, null, null);
if(cursor.moveToNext()){
result = true;
}cursor.close();
db.close();
return result;
}
/**
* 返回所有的储户信息
* @return
*/
public List<Map<String,Object>> findAllUser(){
List<Map<String,Object>> allUsers = new ArrayList<Map<String,Object>>();
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("account", new String[]{"_id","name","money"}, null,null, null, null, null);
while(cursor.moveToNext()){
Map<String,Object> user = new HashMap<String, Object>();
user.put("_id", cursor.getInt(0));
user.put("name", cursor.getString(1));
user.put("money", cursor.getFloat(2));
allUsers.add(user);
}
cursor.close();
db.close();
return allUsers;
}
}
(3)内容提供者类BankInfoProvider,如下:
package com.itheima.db.provider; import com.itheima.db.BankDBOpenHelper;
import com.itheima.db.dao.BankDBDao; import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri; /**
* 银行内部的内线, 用来提供数据(双重间谍)
*/
public class BankInfoProvider extends ContentProvider {
private static final int ACCOUNT = 1;
private static final int SINGLE_ACCOUNT = 2;
private BankDBOpenHelper helper;
// 定义一个uri的匹配器 ,识别器
private static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
// 训练匹配器
mUriMatcher.addURI("com.itheima.db", "account", ACCOUNT);
// content://com.itheima.db/account 访问accout表里面的全部数据
// content://com.itheima.db/account/8 访问accout表里面的第8条数据
mUriMatcher.addURI("com.itheima.db", "account/#", SINGLE_ACCOUNT);
} @Override
public boolean onCreate() {
helper = new BankDBOpenHelper(getContext());
return false;
} // 查询的方法
@Override
public Cursor query(Uri uri, String[] columns, String selection,
String[] selectionArgs, String sortOrder) {
int code = mUriMatcher.match(uri);
if (code == ACCOUNT) {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("account", columns, selection,
selectionArgs, null, null, null);
return cursor;
} else {
throw new IllegalArgumentException("根据法律规定,你无权查看数据。");
}
} // vnd.android.cursor.item 单条记录
// vnd.android.cursor.dir 多条记录
@Override
public String getType(Uri uri) {
int result = mUriMatcher.match(uri);
if (result == ACCOUNT) {
// 多条记录
return "vnd.android.cursor.dir/account";
} else if (result == SINGLE_ACCOUNT) {
// 单条记录
return "vnd.android.cursor.item/account";
}
return null;
} @Override
public Uri insert(Uri uri, ContentValues values) {
int code = mUriMatcher.match(uri);
if (code == ACCOUNT) {
SQLiteDatabase db = helper.getWritableDatabase();
long id = db.insert("account", null, values);
db.close();
//后面程序,通知这个uri的数据变化了
getContext().getContentResolver().notifyChange(uri, null);
return Uri.parse("content://com.itheima.db/account/" + id);
} else {
throw new IllegalArgumentException("根据法律规定,你无权添加数据。");
}
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int code = mUriMatcher.match(uri);
if (code == ACCOUNT) {
SQLiteDatabase db = helper.getWritableDatabase();
int result = db.delete("account", selection, selectionArgs);
db.close();
//后面程序,通知这个uri的数据变化了
getContext().getContentResolver().notifyChange(uri, null);
return result;
} else {
throw new IllegalArgumentException("根据法律规定,你无权删除数据。");
}
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int code = mUriMatcher.match(uri);
if (code == ACCOUNT) {
SQLiteDatabase db = helper.getWritableDatabase();
int result = db.update("account", values, selection, selectionArgs);
db.close();
//后面程序,通知这个uri的数据变化了
getContext().getContentResolver().notifyChange(uri, null);
return result;
} else {
throw new IllegalArgumentException("根据法律规定,你无权修改数据。");
}
} }
在上面insert()、delete()、update()方法中,我们都有:getContext().getContentResolver().notifyChange(uri, null);
这个方法就是发送数据库发生改变的消息(Handler)给公共内存;
(4)在AndroidMainfest.xml文件中注册内容提供者,并注明主机名android:authorities:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itheima.db"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.itheima.db.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <provider
android:name="com.itheima.db.provider.BankInfoProvider"
android:authorities="com.itheima.db" >
</provider>
</application> </manifest>
(5)在MainActivity初始化数据库,如下:
package com.itheima.db; import java.util.Random; import com.itheima.db.dao.BankDBDao; import android.os.Bundle;
import android.app.Activity;
import android.view.Menu; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BankDBDao dao = new BankDBDao(this);
Random random = new Random();
for(int i =0;i<20;i++){
dao.add("张"+i, random.nextFloat()+random.nextInt(500));
}
} }
2. 17_银行行长工程:
(1)工程如下图:
(2)先设置一下UI布局如下:
<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:orientation="vertical"
tools:context=".MainActivity" > <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="query"
android:text="查询银行的数据库信息" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="add"
android:text="添加一条储户信息" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="delete"
android:text="删除一条储户信息" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="update"
android:text="修改一条储户信息" /> </LinearLayout>
布局效果如下:
(3)来到MainActivity,如下:
package com.itheima.bankboss; import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 银行行长查询私有的数据库信息
* @param view
*/
public void query(View view){
//得到内容提供者的解析器
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.itheima.db/account");
Cursor cursor = resolver.query(uri, null, null, null, null);
while(cursor.moveToNext()){
String id = cursor.getString(0);
String name = cursor.getString(1);
String money = cursor.getString(2);
System.out.println(id);
System.out.println(name);
System.out.println(money);
}
cursor.close();
}
/**
* 通过内容提供者 ,向银行私有的数据库添加一条记录
* @param view
*/
public void add(View view){
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.itheima.db/account");
ContentValues values = new ContentValues();
values.put("name", "王五");
values.put("money", 1000000.23f);
Uri result = resolver.insert(uri, values);
Toast.makeText(this, result.toString(), 0).show();
} public void delete(View view){
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.itheima.db/account");
int result = resolver.delete(uri, "name=?", new String[]{"王五"});
if(result>0){
Toast.makeText(this, "删除成功", 0).show();
}else{
Toast.makeText(this, "删除失败", 0).show();
}
}
public void update(View view){
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.itheima.db/account");
ContentValues values = new ContentValues();
values.put("money", 0.05f);
int result = resolver.update(uri, values, "name=?", new String[]{"王五"});
if(result>0){
Toast.makeText(this, "修改成功", 0).show();
}else{
Toast.makeText(this, "修改失败", 0).show();
}
}
}
清单文件AndroidMainfest.xml,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itheima.bankboss"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.itheima.bankboss.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
3. 18_其他的应用
(1)工程一览图,如下:
(2)布局文件,清单文件AndroidMainfest.xml两者不做修改,只修改MainActivity,如下:
package com.itheima.other; import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.database.ContentObserver;
import android.view.Menu; 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.itheima.db/account");
getContentResolver().registerContentObserver(uri, true, new MyObserver(new Handler()));
} //自定义一个内容观察者
private class MyObserver extends ContentObserver{ public MyObserver(Handler handler) {
super(handler);
}
//这个方法在当内容变化的时候调用。 回调函数。
@Override
public void onChange(boolean selfChange) {
System.out.println("哈哈,你被我抓住了,银行的数据库发生了变化。");
super.onChange(selfChange);
} }
}
备注:registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
参数uri:待检测资源文件是否改变的路径uri;
参数notifyForDescendents: true (只有uri前缀匹配,也可以检测资源文件是否改变), false(表示uri完全匹配,才能检测资源文件是否改变);
参数observer:定义的内容观察者;
这里代码中自定义一个内容观察者,当他获取到公共内存的消息(使用消息机制),这个消息内容就是16_数据库 发送给公共内存的消息的。
在自定义的内容观察者内部重写的onChange()方法,这个方法很重要的,主要是得知数据库内容修改了,执行代码。这个代码主要是提示用户的。
4. 上面三个应用全部布署到模拟器上,如下:
(1)三个程序都运行起来,先点击进入 17_银行行长 ,如下图:
(2)点击 "查询银行数据库信息",同时观察logcat打印的日志,如下:
09-15 06:10:08.923: I/System.out(2352): 1
09-15 06:10:08.923: I/System.out(2352): 王五
09-15 06:10:08.923: I/System.out(2352): 1000000.25
09-15 06:10:08.933: I/System.out(2352): 2
09-15 06:10:08.933: I/System.out(2352): 张0
09-15 06:10:08.933: I/System.out(2352): 382.509613037109
09-15 06:10:08.943: I/System.out(2352): 3
09-15 06:10:08.953: I/System.out(2352): 张1
09-15 06:10:08.953: I/System.out(2352): 333.448028564453
09-15 06:10:08.953: I/System.out(2352): 4
09-15 06:10:08.953: I/System.out(2352): 张2
09-15 06:10:08.953: I/System.out(2352): 151.61848449707
09-15 06:10:08.953: I/System.out(2352): 5
09-15 06:10:08.953: I/System.out(2352): 张3
09-15 06:10:08.953: I/System.out(2352): 478.295715332031
09-15 06:10:08.953: I/System.out(2352): 6
09-15 06:10:08.953: I/System.out(2352): 张4
09-15 06:10:08.953: I/System.out(2352): 171.737258911133
09-15 06:10:08.953: I/System.out(2352): 7
09-15 06:10:08.953: I/System.out(2352): 张5
09-15 06:10:08.953: I/System.out(2352): 360.500274658203
09-15 06:10:08.963: I/System.out(2352): 8
09-15 06:10:08.963: I/System.out(2352): 张6
09-15 06:10:08.963: I/System.out(2352): 454.060882568359
09-15 06:10:08.963: I/System.out(2352): 9
09-15 06:10:08.963: I/System.out(2352): 张7
09-15 06:10:08.963: I/System.out(2352): 238.111083984375
09-15 06:10:08.963: I/System.out(2352): 10
09-15 06:10:08.963: I/System.out(2352): 张8
09-15 06:10:08.963: I/System.out(2352): 189.068878173828
09-15 06:10:08.963: I/System.out(2352): 11
09-15 06:10:08.963: I/System.out(2352): 张9
09-15 06:10:08.963: I/System.out(2352): 251.897613525391
09-15 06:10:08.963: I/System.out(2352): 12
09-15 06:10:08.963: I/System.out(2352): 张10
09-15 06:10:08.963: I/System.out(2352): 163.039077758789
09-15 06:10:08.983: I/System.out(2352): 13
09-15 06:10:08.983: I/System.out(2352): 张11
09-15 06:10:08.983: I/System.out(2352): 406.003662109375
09-15 06:10:08.983: I/System.out(2352): 14
09-15 06:10:08.983: I/System.out(2352): 张12
09-15 06:10:08.983: I/System.out(2352): 188.824310302734
09-15 06:10:08.983: I/System.out(2352): 15
09-15 06:10:08.983: I/System.out(2352): 张13
09-15 06:10:08.993: I/System.out(2352): 352.776428222656
09-15 06:10:08.993: I/System.out(2352): 16
09-15 06:10:08.993: I/System.out(2352): 张14
09-15 06:10:08.993: I/System.out(2352): 467.630920410156
09-15 06:10:08.993: I/System.out(2352): 17
09-15 06:10:08.993: I/System.out(2352): 张15
09-15 06:10:08.993: I/System.out(2352): 398.476989746094
09-15 06:10:08.993: I/System.out(2352): 18
09-15 06:10:08.993: I/System.out(2352): 张16
09-15 06:10:08.993: I/System.out(2352): 130.809677124023
09-15 06:10:08.993: I/System.out(2352): 19
09-15 06:10:08.993: I/System.out(2352): 张17
09-15 06:10:08.993: I/System.out(2352): 327.802581787109
09-15 06:10:08.993: I/System.out(2352): 20
09-15 06:10:08.993: I/System.out(2352): 张18
09-15 06:10:08.993: I/System.out(2352): 232.474548339844
09-15 06:10:09.133: I/System.out(2352): 21
09-15 06:10:09.133: I/System.out(2352): 张19
09-15 06:10:09.143: I/System.out(2352): 143.222579956055
(3)多次点击 "添加一条储户信息",同时观察logcat打印的日志,如下:
这个时候logcat(System.out)也出现多条日志,如下:
09-15 06:11:39.943: I/System.out(2337): 哈哈,你被我抓住了,银行的数据库发生了变化。
09-15 06:11:49.983: I/System.out(2337): 哈哈,你被我抓住了,银行的数据库发生了变化。
09-15 06:11:53.863: I/System.out(2337): 哈哈,你被我抓住了,银行的数据库发生了变化。
09-15 06:12:11.973: I/System.out(2337): 哈哈,你被我抓住了,银行的数据库发生了变化。
(4)这个时候我们点击"查询银行的数据库信息",观察logcat(System.out)打印的日志如下:
09-15 06:11:39.943: I/System.out(2337): 哈哈,你被我抓住了,银行的数据库发生了变化。
09-15 06:11:49.983: I/System.out(2337): 哈哈,你被我抓住了,银行的数据库发生了变化。
09-15 06:11:53.863: I/System.out(2337): 哈哈,你被我抓住了,银行的数据库发生了变化。
09-15 06:12:11.973: I/System.out(2337): 哈哈,你被我抓住了,银行的数据库发生了变化。
09-15 06:14:17.773: I/System.out(2352): 1
09-15 06:14:17.773: I/System.out(2352): 王五
09-15 06:14:17.773: I/System.out(2352): 1000000.25
09-15 06:14:17.783: I/System.out(2352): 2
09-15 06:14:17.803: I/System.out(2352): 张0
09-15 06:14:17.803: I/System.out(2352): 382.509613037109
09-15 06:14:17.803: I/System.out(2352): 3
09-15 06:14:17.803: I/System.out(2352): 张1
09-15 06:14:17.823: I/System.out(2352): 333.448028564453
09-15 06:14:17.823: I/System.out(2352): 4
09-15 06:14:17.823: I/System.out(2352): 张2
09-15 06:14:17.833: I/System.out(2352): 151.61848449707
09-15 06:14:17.843: I/System.out(2352): 5
09-15 06:14:17.843: I/System.out(2352): 张3
09-15 06:14:17.843: I/System.out(2352): 478.295715332031
09-15 06:14:17.843: I/System.out(2352): 6
09-15 06:14:17.843: I/System.out(2352): 张4
09-15 06:14:17.843: I/System.out(2352): 171.737258911133
09-15 06:14:17.843: I/System.out(2352): 7
09-15 06:14:17.843: I/System.out(2352): 张5
09-15 06:14:17.843: I/System.out(2352): 360.500274658203
09-15 06:14:17.893: I/System.out(2352): 8
09-15 06:14:17.893: I/System.out(2352): 张6
09-15 06:14:17.893: I/System.out(2352): 454.060882568359
09-15 06:14:17.893: I/System.out(2352): 9
09-15 06:14:17.893: I/System.out(2352): 张7
09-15 06:14:17.893: I/System.out(2352): 238.111083984375
09-15 06:14:17.903: I/System.out(2352): 10
09-15 06:14:17.903: I/System.out(2352): 张8
09-15 06:14:17.903: I/System.out(2352): 189.068878173828
09-15 06:14:17.913: I/System.out(2352): 11
09-15 06:14:17.913: I/System.out(2352): 张9
09-15 06:14:17.913: I/System.out(2352): 251.897613525391
09-15 06:14:17.913: I/System.out(2352): 12
09-15 06:14:17.913: I/System.out(2352): 张10
09-15 06:14:17.913: I/System.out(2352): 163.039077758789
09-15 06:14:17.923: I/System.out(2352): 13
09-15 06:14:17.923: I/System.out(2352): 张11
09-15 06:14:17.923: I/System.out(2352): 406.003662109375
09-15 06:14:17.923: I/System.out(2352): 14
09-15 06:14:17.923: I/System.out(2352): 张12
09-15 06:14:17.923: I/System.out(2352): 188.824310302734
09-15 06:14:17.923: I/System.out(2352): 15
09-15 06:14:17.923: I/System.out(2352): 张13
09-15 06:14:17.933: I/System.out(2352): 352.776428222656
09-15 06:14:17.933: I/System.out(2352): 16
09-15 06:14:17.933: I/System.out(2352): 张14
09-15 06:14:17.933: I/System.out(2352): 467.630920410156
09-15 06:14:17.943: I/System.out(2352): 17
09-15 06:14:17.943: I/System.out(2352): 张15
09-15 06:14:17.943: I/System.out(2352): 398.476989746094
09-15 06:14:17.958: I/System.out(2352): 18
09-15 06:14:17.958: I/System.out(2352): 张16
09-15 06:14:17.963: I/System.out(2352): 130.809677124023
09-15 06:14:17.963: I/System.out(2352): 19
09-15 06:14:17.963: I/System.out(2352): 张17
09-15 06:14:17.963: I/System.out(2352): 327.802581787109
09-15 06:14:17.963: I/System.out(2352): 20
09-15 06:14:17.963: I/System.out(2352): 张18
09-15 06:14:17.963: I/System.out(2352): 232.474548339844
09-15 06:14:17.988: I/System.out(2352): 21
09-15 06:14:17.993: I/System.out(2352): 张19
09-15 06:14:17.993: I/System.out(2352): 143.222579956055
09-15 06:14:17.993: I/System.out(2352): 22
09-15 06:14:17.993: I/System.out(2352): 王五
09-15 06:14:17.993: I/System.out(2352): 1000000.25
09-15 06:14:17.993: I/System.out(2352): 23
09-15 06:14:17.993: I/System.out(2352): 王五
09-15 06:14:17.993: I/System.out(2352): 1000000.25
09-15 06:14:17.993: I/System.out(2352): 24
09-15 06:14:17.993: I/System.out(2352): 王五
09-15 06:14:18.004: I/System.out(2352): 1000000.25
09-15 06:14:18.004: I/System.out(2352): 25
09-15 06:14:18.004: I/System.out(2352): 王五
09-15 06:14:18.004: I/System.out(2352): 1000000.25
红色的是我们添加的数据,说明插入数据,修改了数据库,确实 18_其他的应用 也检测到了数据库的变化。
Android(java)学习笔记253:ContentProvider使用之内容观察者02的更多相关文章
- Android(java)学习笔记197:ContentProvider使用之内容观察者02
下面通过3个应用程序之间的交互说明一下内容观察者: 一. 如下3个应用程序为相互交互的: 二.交互逻辑图: 三.具体代码: 1. 16_数据库工程: (1)数据库帮助类BankDBOpenHelp ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- Android 数字签名学习笔记
Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- 20145316许心远《Java学习笔记(第8版)》课程总结
20145316许心远<Java学习笔记(第8版)>课程总结 每周读书笔记链接汇总 ▪ 第一周读书笔记 ▪ 第二周读书笔记 ▪ 第三周读书笔记 ▪ 第四周读书笔记 ▪ 第五周读书笔记 ▪ ...
- Android:日常学习笔记(6)——探究活动(4)
Android:日常学习笔记(6)——探究活动(4) 活动的启动模式 standard模式 standard是活动默认的启动模式,在不进行显示定义的情况下,所有活动都会自动使用这种启动模式. stan ...
随机推荐
- Java Calendar 计算时间差
public static void main(String[] args) { Calendar c=Calendar.getInstance(); int y=2016;//年 int M=1;/ ...
- 重新开始学习javase_集合_Set
一,Set之HashSet(转:http://blog.csdn.net/zheng0518/article/details/42197337) 1. HashSet概述: HashSet实现S ...
- memset 初始化数组
memset是初始化一段内存区域的函数,其头文件是<string.h>,以前经常使用出现错误,整理一下. C++ Reference对于memset的定义为: void * memset ...
- mysql的limit经典用法及优化
用法一 SELECT `keyword_rank`.* FROM `keyword_rank` WHERE (advertiserid='59') LIMIT 2 OFFSET 1; 比如这个 ...
- JQuery Easy Ui dataGrid 数据表格 ---制作查询下拉菜单
JQuery Easy Ui dataGrid 数据表格 数据表格 - DataGrid 继承$.fn.panel.defaults,使用$.fn.datagrid.defaults重载默认值.. 数 ...
- 初涉JavaScript模式 (13) : 代码复用 【上】
引子 博客断了一段时间,不是不写,一是没时间,二是觉得自己沉淀不够,经过一段时间的学习和实战,今天来总结下一个老生常谈的东西: 代码复用. 为何复用 JS门槛低,故很多人以为写几个特效就会JS,其实真 ...
- ThinkPHP 发送post请求
function post($url, $param=array()){ if(!is_array($param)){ throw new Exception("参数必须为array&quo ...
- [Android] createTrack_l
在分析AudioTrack的时候,第一步会new AudioTrack,并调用他的set方法.在set方法的最后调用了createTrack_l创建音轨.我们现在来分析createTrack_l的流程 ...
- sphinx,github和readthedocs配合使用
http://daler.github.io/sphinxdoc-test/includeme.html http://pages.github.com/ http://www.lulinfeng.c ...
- Documentation/sched-bwc.txt 的中文翻译
Chinese translated version of Documentation/sched-bwc.txt If you have any comment or update to the c ...