下面通过3个应用程序之间的交互说明一下内容观察者:
一、 如下3个应用程序为相互交互的:
二、交互逻辑图:
三、具体代码:
1. 16_数据库工程:
(1)数据库帮助类BankDBOpenHelper(继承自SQLiteOpenHelper):
1 package com.itheima.db; 2 3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 import android.database.sqlite.SQLiteDatabase.CursorFactory; 6 import android.database.sqlite.SQLiteOpenHelper; 7 8 /** 9 * 银行数据库打开的帮助类 10 * @author Administrator 11 * 12 */ 13 public class BankDBOpenHelper extends SQLiteOpenHelper { 14 15 public BankDBOpenHelper(Context context) { 16 super(context, "bank.db", null, 1); 17 } 18 //数据库第一次被创建调用的方法,适合做数据库表结构的初始化 19 @Override 20 public void onCreate(SQLiteDatabase db) { 21 db.execSQL("create table account (_id integer primary key autoincrement,name varchar(20),money varchar(2))"); 22 } 23 //数据库版本更新的时候调用的方法 24 @Override 25 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 26 27 } 28 }
(2)操作数据库的工具类BankDBDao,如下:
1 package com.itheima.db.dao; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import android.content.ContentValues; 9 import android.content.Context; 10 import android.database.Cursor; 11 import android.database.sqlite.SQLiteDatabase; 12 13 import com.itheima.db.BankDBOpenHelper; 14 15 /** 16 * 银行数据库的data access object 17 */ 18 public class BankDBDao { 19 private BankDBOpenHelper helper; 20 public BankDBDao(Context context) { 21 helper = new BankDBOpenHelper(context); 22 } 23 /** 24 * 添加一条账户信息 25 * @param name 姓名 26 * @param money 钱 27 * @return 代表添加在数据库的行号id 如果返回-1代表添加失败,用户已经存在 28 */ 29 public long add(String name,float money){ 30 if(isUserExist(name)){ 31 return -1; 32 } 33 SQLiteDatabase db = helper.getWritableDatabase(); 34 ContentValues values = new ContentValues(); 35 values.put("name", name); 36 values.put("money", money); 37 long rowID = db.insert("account", null, values); 38 db.close(); 39 return rowID; 40 } 41 /** 42 * 删除一条数据库的记录 43 * @param name 44 * @return 是否删除成功 45 */ 46 public boolean delete(String name){ 47 SQLiteDatabase db = helper.getWritableDatabase(); 48 int result = db.delete("account", "name=?", new String[]{name}); 49 db.close(); 50 if(result>0){ 51 return true; 52 }else{ 53 return false; 54 } 55 } 56 /** 57 * 修改用户的账户信息 58 * @param name 要修改储户的姓名 59 * @param money 新的账户余额 60 * @return 是否修改成功 61 */ 62 public boolean update(String name,float money){ 63 SQLiteDatabase db = helper.getWritableDatabase(); 64 ContentValues values = new ContentValues(); 65 values.put("money", money); 66 int result = db.update("account", values, "name=?", new String[]{name}); 67 db.close(); 68 if(result>0){ 69 return true; 70 }else{ 71 return false; 72 } 73 } 74 /** 75 * 查询某个用户有多少钱 76 * @param name 77 * @return 78 */ 79 public float getUserMoney(String name){ 80 float money = 0; 81 SQLiteDatabase db = helper.getReadableDatabase(); 82 Cursor cursor = db.query("account", new String[]{"money"}, "name=?", new String[]{name}, null, null, null); 83 if(cursor.moveToNext()){ 84 money = cursor.getFloat(0); 85 }cursor.close(); 86 db.close(); 87 return money; 88 } 89 90 /** 91 * 查询某个用户是否存在 92 * @param name 93 * @return 94 */ 95 public boolean isUserExist(String name){ 96 boolean result = false; 97 SQLiteDatabase db = helper.getReadableDatabase(); 98 Cursor cursor = db.query("account", null, "name=?", new String[]{name}, null, null, null); 99 if(cursor.moveToNext()){ 100 result = true; 101 }cursor.close(); 102 db.close(); 103 return result; 104 } 105 /** 106 * 返回所有的储户信息 107 * @return 108 */ 109 public List<Map<String,Object>> findAllUser(){ 110 List<Map<String,Object>> allUsers = new ArrayList<Map<String,Object>>(); 111 SQLiteDatabase db = helper.getReadableDatabase(); 112 Cursor cursor = db.query("account", new String[]{"_id","name","money"}, null,null, null, null, null); 113 while(cursor.moveToNext()){ 114 Map<String,Object> user = new HashMap<String, Object>(); 115 user.put("_id", cursor.getInt(0)); 116 user.put("name", cursor.getString(1)); 117 user.put("money", cursor.getFloat(2)); 118 allUsers.add(user); 119 } 120 cursor.close(); 121 db.close(); 122 return allUsers; 123 } 124 }
(3)内容提供者类BankInfoProvider,如下:
1 package com.itheima.db.provider; 2 3 import com.itheima.db.BankDBOpenHelper; 4 import com.itheima.db.dao.BankDBDao; 5 6 import android.content.ContentProvider; 7 import android.content.ContentValues; 8 import android.content.UriMatcher; 9 import android.database.Cursor; 10 import android.database.sqlite.SQLiteDatabase; 11 import android.net.Uri; 12 13 /** 14 * 银行内部的内线, 用来提供数据(双重间谍) 15 */ 16 public class BankInfoProvider extends ContentProvider { 17 private static final int ACCOUNT = 1; 18 private static final int SINGLE_ACCOUNT = 2; 19 private BankDBOpenHelper helper; 20 // 定义一个uri的匹配器 ,识别器 21 private static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 22 static { 23 // 训练匹配器 24 mUriMatcher.addURI("com.itheima.db", "account", ACCOUNT); 25 // content://com.itheima.db/account 访问accout表里面的全部数据 26 // content://com.itheima.db/account/8 访问accout表里面的第8条数据 27 mUriMatcher.addURI("com.itheima.db", "account/#", SINGLE_ACCOUNT); 28 } 29 30 @Override 31 public boolean onCreate() { 32 helper = new BankDBOpenHelper(getContext()); 33 return false; 34 } 35 36 // 查询的方法 37 @Override 38 public Cursor query(Uri uri, String[] columns, String selection, 39 String[] selectionArgs, String sortOrder) { 40 int code = mUriMatcher.match(uri); 41 if (code == ACCOUNT) { 42 SQLiteDatabase db = helper.getReadableDatabase(); 43 Cursor cursor = db.query("account", columns, selection, 44 selectionArgs, null, null, null); 45 return cursor; 46 } else { 47 throw new IllegalArgumentException("根据法律规定,你无权查看数据。"); 48 } 49 } 50 51 // vnd.android.cursor.item 单条记录 52 // vnd.android.cursor.dir 多条记录 53 @Override 54 public String getType(Uri uri) { 55 int result = mUriMatcher.match(uri); 56 if (result == ACCOUNT) { 57 // 多条记录 58 return "vnd.android.cursor.dir/account"; 59 } else if (result == SINGLE_ACCOUNT) { 60 // 单条记录 61 return "vnd.android.cursor.item/account"; 62 } 63 return null; 64 } 65 66 @Override 67 public Uri insert(Uri uri, ContentValues values) { 68 int code = mUriMatcher.match(uri); 69 if (code == ACCOUNT) { 70 SQLiteDatabase db = helper.getWritableDatabase(); 71 long id = db.insert("account", null, values); 72 db.close(); 73 //后面程序,通知这个uri的数据变化了 74 getContext().getContentResolver().notifyChange(uri, null); 75 return Uri.parse("content://com.itheima.db/account/" + id); 76 } else { 77 throw new IllegalArgumentException("根据法律规定,你无权添加数据。"); 78 } 79 } 80 81 @Override 82 public int delete(Uri uri, String selection, String[] selectionArgs) { 83 int code = mUriMatcher.match(uri); 84 if (code == ACCOUNT) { 85 SQLiteDatabase db = helper.getWritableDatabase(); 86 int result = db.delete("account", selection, selectionArgs); 87 db.close(); 88 //后面程序,通知这个uri的数据变化了 89 getContext().getContentResolver().notifyChange(uri, null); 90 return result; 91 } else { 92 throw new IllegalArgumentException("根据法律规定,你无权删除数据。"); 93 } 94 } 95 96 @Override 97 public int update(Uri uri, ContentValues values, String selection, 98 String[] selectionArgs) { 99 int code = mUriMatcher.match(uri); 100 if (code == ACCOUNT) { 101 SQLiteDatabase db = helper.getWritableDatabase(); 102 int result = db.update("account", values, selection, selectionArgs); 103 db.close(); 104 //后面程序,通知这个uri的数据变化了 105 getContext().getContentResolver().notifyChange(uri, null); 106 return result; 107 } else { 108 throw new IllegalArgumentException("根据法律规定,你无权修改数据。"); 109 } 110 } 111 112 }
在上面insert()、delete()、update()方法中,我们都有:getContext().getContentResolver().notifyChange(uri, null);
这个方法就是发送数据库发生改变的消息(Handler)给公共内存;
(4)在AndroidMainfest.xml文件中注册内容提供者,并注明主机名android:authorities:
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.itheima.db" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="8" 9 android:targetSdkVersion="17" /> 10 11 <application 12 android:allowBackup="true" 13 android:icon="@drawable/ic_launcher" 14 android:label="@string/app_name" 15 android:theme="@style/AppTheme" > 16 <activity 17 android:name="com.itheima.db.MainActivity" 18 android:label="@string/app_name" > 19 <intent-filter> 20 <action android:name="android.intent.action.MAIN" /> 21 22 <category android:name="android.intent.category.LAUNCHER" /> 23 </intent-filter> 24 </activity> 25 26 <provider 27 android:name="com.itheima.db.provider.BankInfoProvider" 28 android:authorities="com.itheima.db" > 29 </provider> 30 </application> 31 32 </manifest>
(5)在MainActivity初始化数据库,如下:
1 package com.itheima.db; 2 3 import java.util.Random; 4 5 import com.itheima.db.dao.BankDBDao; 6 7 import android.os.Bundle; 8 import android.app.Activity; 9 import android.view.Menu; 10 11 public class MainActivity extends Activity { 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 BankDBDao dao = new BankDBDao(this); 18 Random random = new Random(); 19 for(int i =0;i<20;i++){ 20 dao.add("张"+i, random.nextFloat()+random.nextInt(500)); 21 } 22 } 23 24 25 }
2. 17_银行行长工程:
(1)工程如下图:
(2)先设置一下UI布局如下:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 tools:context=".MainActivity" > 7 8 <Button 9 android:layout_width="match_parent" 10 android:layout_height="wrap_content" 11 android:onClick="query" 12 android:text="查询银行的数据库信息" /> 13 14 <Button 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content" 17 android:onClick="add" 18 android:text="添加一条储户信息" /> 19 20 <Button 21 android:layout_width="match_parent" 22 android:layout_height="wrap_content" 23 android:onClick="delete" 24 android:text="删除一条储户信息" /> 25 26 <Button 27 android:layout_width="match_parent" 28 android:layout_height="wrap_content" 29 android:onClick="update" 30 android:text="修改一条储户信息" /> 31 32 </LinearLayout>
布局效果如下:
(3)来到MainActivity,如下:
1 package com.itheima.bankboss; 2 3 import android.app.Activity; 4 import android.content.ContentResolver; 5 import android.content.ContentValues; 6 import android.database.Cursor; 7 import android.net.Uri; 8 import android.os.Bundle; 9 import android.view.View; 10 import android.widget.Toast; 11 12 public class MainActivity extends Activity { 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 } 19 /** 20 * 银行行长查询私有的数据库信息 21 * @param view 22 */ 23 public void query(View view){ 24 //得到内容提供者的解析器 25 ContentResolver resolver = getContentResolver(); 26 Uri uri = Uri.parse("content://com.itheima.db/account"); 27 Cursor cursor = resolver.query(uri, null, null, null, null); 28 while(cursor.moveToNext()){ 29 String id = cursor.getString(0); 30 String name = cursor.getString(1); 31 String money = cursor.getString(2); 32 System.out.println(id); 33 System.out.println(name); 34 System.out.println(money); 35 } 36 cursor.close(); 37 } 38 /** 39 * 通过内容提供者 ,向银行私有的数据库添加一条记录 40 * @param view 41 */ 42 public void add(View view){ 43 ContentResolver resolver = getContentResolver(); 44 Uri uri = Uri.parse("content://com.itheima.db/account"); 45 ContentValues values = new ContentValues(); 46 values.put("name", "王五"); 47 values.put("money", 1000000.23f); 48 Uri result = resolver.insert(uri, values); 49 Toast.makeText(this, result.toString(), 0).show(); 50 } 51 52 public void delete(View view){ 53 ContentResolver resolver = getContentResolver(); 54 Uri uri = Uri.parse("content://com.itheima.db/account"); 55 int result = resolver.delete(uri, "name=?", new String[]{"王五"}); 56 if(result>0){ 57 Toast.makeText(this, "删除成功", 0).show(); 58 }else{ 59 Toast.makeText(this, "删除失败", 0).show(); 60 } 61 } 62 public void update(View view){ 63 ContentResolver resolver = getContentResolver(); 64 Uri uri = Uri.parse("content://com.itheima.db/account"); 65 ContentValues values = new ContentValues(); 66 values.put("money", 0.05f); 67 int result = resolver.update(uri, values, "name=?", new String[]{"王五"}); 68 if(result>0){ 69 Toast.makeText(this, "修改成功", 0).show(); 70 }else{ 71 Toast.makeText(this, "修改失败", 0).show(); 72 } 73 } 74 }
清单文件AndroidMainfest.xml,如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.itheima.bankboss" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="8" 9 android:targetSdkVersion="17" /> 10 11 <application 12 android:allowBackup="true" 13 android:icon="@drawable/ic_launcher" 14 android:label="@string/app_name" 15 android:theme="@style/AppTheme" > 16 <activity 17 android:name="com.itheima.bankboss.MainActivity" 18 android:label="@string/app_name" > 19 <intent-filter> 20 <action android:name="android.intent.action.MAIN" /> 21 22 <category android:name="android.intent.category.LAUNCHER" /> 23 </intent-filter> 24 </activity> 25 </application> 26 27 </manifest>
3. 18_其他的应用
(1)工程一览图,如下:
(2)布局文件,清单文件AndroidMainfest.xml两者不做修改,只修改MainActivity,如下:
1 package com.itheima.other; 2 3 import android.net.Uri; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.app.Activity; 7 import android.database.ContentObserver; 8 import android.view.Menu; 9 10 public class MainActivity extends Activity { 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 Uri uri = Uri.parse("content://com.itheima.db/account"); 17 getContentResolver().registerContentObserver(uri, true, new MyObserver(new Handler())); 18 } 19 20 //自定义一个内容观察者 21 private class MyObserver extends ContentObserver{ 22 23 public MyObserver(Handler handler) { 24 super(handler); 25 } 26 //这个方法在当内容变化的时候调用。 回调函数。 27 @Override 28 public void onChange(boolean selfChange) { 29 System.out.println("哈哈,你被我抓住了,银行的数据库发生了变化。"); 30 super.onChange(selfChange); 31 } 32 33 } 34 }
备注: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_其他的应用 也检测到了数据库的变化。