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


    下面通过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_其他的应用  也检测到了数据库的变化。

  • 相关阅读:
    python中网络编程之线程
    python并发编程基础之守护进程、队列、锁
    python中并发编程基础1
    python中TCP粘包问题解决方案
    python中的异常处理常用方法
    python中面向对象元类的自定义用法
    python中类与对象之继承
    python中的re模块——正则表达式
    【2020090401】排名 rank over的用法
    【2020090301】mysql中 having 的用法
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4810175.html
Copyright © 2020-2023  润新知