Android(java)学习笔记253:ContentProvider使用之内容观察者02

下面通过3个应用程序之间的交互说明一下内容观察者:

一、 如下3个应用程序为相互交互的:

Android(java)学习笔记253:ContentProvider使用之内容观察者02

二、交互逻辑图:

Android(java)学习笔记253:ContentProvider使用之内容观察者02

三、具体代码:

1.   16_数据库工程:

Android(java)学习笔记253:ContentProvider使用之内容观察者02

(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)工程如下图:

Android(java)学习笔记253:ContentProvider使用之内容观察者02

(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>

布局效果如下:

Android(java)学习笔记253:ContentProvider使用之内容观察者02

(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)工程一览图,如下:

Android(java)学习笔记253:ContentProvider使用之内容观察者02

(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. 上面三个应用全部布署到模拟器上,如下:

Android(java)学习笔记253:ContentProvider使用之内容观察者02

(1)三个程序都运行起来,先点击进入 17_银行行长 ,如下图:

Android(java)学习笔记253:ContentProvider使用之内容观察者02

(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打印的日志,如下:

Android(java)学习笔记253:ContentProvider使用之内容观察者02

这个时候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_其他的应用  也检测到了数据库的变化。

上一篇:Topcoder SRM 598 div2


下一篇:java持有对象-集合类