zoukankan      html  css  js  c++  java
  • Android(java)学习笔记189:ContentProvider使用(银行数据库创建和增删改查的案例)

    1. Android的四大组件:

    (1)Activity  用户交互的UI界面

    (2)Service  后台运行的服务

    (3)BroadcastReceiver 广播接收者

    (4)ContentProvider  内容提供者

    2. ContentProvider  内容提供者

    用途:把应用程序私有的数据暴露给别的应用程序

    ContentProvider可以理解为一个Android应用对外开放的接口,只要是符合它所定义的Uri格式的请求,均可以正常访问执行操作。其他的Android应用可以使用ContentResolver对象通过与ContentProvider同名的方法请求执行,被执行的就是ContentProvider中的同名方法。所以ContentProvider有很多对外可以访问的方法,在ContentResolver中均有同名的方法,是一一对应的,来看下面这一张图:

    Android附带了许多有用的ContentProvider,但是本文暂时不涉及到这么多(本文将学习如何创建自己的ContentProvider)。Android中自带的ContentProvider包括:

    • Browser:存储如浏览器的信息
    • CallLog:存储通话记录等信息。
    • Contacts Provider:存储联系人(通讯录)等信息。
    • MediaStore:存储媒体文件的信息
    • Settings:存储设备的设置和首选项信息

    此外,还有日历等

    3. Uri的介绍

    Uri代表了要操作的数据,Uri主要包含了两部分信息:

    1》需要操作的ContentProvider ;

    2》对ContentProvider中的什么数据进行操作;

    一个Uri由以下几部分组成:  

       

    ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
    主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它
    路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
    要操作person表中id为10的记录,可以构建这样的路径:/person/10
    要操作person表中id为10的记录的name字段, person/10/name
    要操作person表中的所有记录,可以构建这样的路径:/person
    要操作xxx表中的记录,可以构建这样的路径:/xxx


    当然要操作的数据不一定来自数据库,也可以是文件xml网络数据等其他存储方式,如下:
    要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name
    如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
    Uri uri = Uri.parse("content://com.himi.provider.personprovider/person")

    4.UriMatcher类使用介绍:

    因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher和ContentUris 。掌握它们的使用,会便于我们的开发工作。
    UriMatcher类用于匹配Uri,它的用法如下:
    首先第一步把你需要匹配Uri路径全部给注册上,如下:

     1 //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
     2 UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
     3 //如果match()方法匹配content://com.himi.provider.personprovider/person路径,返回匹配码为1
     4 sMatcher.addURI("com.himi.provider.personprovider", "person", 1);//添加需要匹配uri,如果匹配就会返回匹配码
     5 //如果match()方法匹配content://com.himi.provider.personprovider/person/230路径,返回匹配码为2
     6 sMatcher.addURI("com.himi.provider.personprovider", "person/#", 2);//#号为通配符
     7 switch (sMatcher.match(Uri.parse("content://com.himi.provider.personprovider/person/10"))) { 
     8    case 1
     9      break;
    10    case 2
    11      break;
    12    default://不匹配
    13      break;
    14 }

    注册完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://com.himi.provider.personprovider/person路径,返回的匹配码为1 

    5. ContentUris类使用介绍

    ContentUris类用于操作Uri路径后面的ID部分,它有两个比较实用的方法:
    withAppendedId(uri, id)用于为路径加上ID部分:

    1 Uri uri = Uri.parse("content://com.himi.provider.personprovider/person")
    2 Uri resultUri = ContentUris.withAppendedId(uri, 10); 
    3 //生成后的Uri为:content://com.himi.provider.personprovider/person/10

    parseId(uri)方法用于从路径中获取ID部分:

    1 Uri uri = Uri.parse("content://com.himi.provider.personprovider/person/10")
    2 long personid = ContentUris.parseId(uri);//获取的结果为:10

    6.下面通过一个银行数据库创建和增删改查的实现案例引出一个需求问题:

    这里新建一个Android工程,命名为"08_数据库":

    (1)首先我们这里要用到数据库,首先我们必须先扩展一个抽象类SQLiteOpenHelper(SQLiteOpenHelper类似于File),我们定义一个子类去继承SQLiteOpenHelper,实现其抽象方法:

    自定义的子类为MyDBOpenHelper

     1 package com.himi.db;
     2 
     3 import android.content.Context;
     4 import android.database.sqlite.SQLiteDatabase;
     5 import android.database.sqlite.SQLiteOpenHelper;
     6 
     7 public class MyDBOpenHelper extends SQLiteOpenHelper {
     8 
     9     public MyDBOpenHelper(Context context) {
    10         super(context, "bank.db", null, 1);
    11     }
    12 
    13     //数据库第一被创建调用的方法,适合做数据库表结构的初始化
    14     @Override
    15     public void onCreate(SQLiteDatabase db) {
    16         db.execSQL("create table account (_id integer primary key autoincrement, name varchar(20), money varchar(2))");
    17         
    18     }
    19 
    20     //数据库更新的时候,调用的方法
    21     @Override
    22     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    23 
    24     }
    25 
    26 }

    (2)同时编写一个实现数据库增删改查的工具类,如下利用Google的API,如下:

      1 package com.himi.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.himi.db.MyDBOpenHelper;
     14 
     15 /**
     16  * 
     17  *银行数据库的data access object
     18  *
     19  */
     20 public class BankDBDao {
     21     private MyDBOpenHelper helper;
     22 
     23     public BankDBDao(Context context) {
     24         helper = new MyDBOpenHelper(context);
     25     }
     26     
     27     /**
     28      * 添加一条用户信息
     29      * @param name  姓名
     30      * @param money 钱
     31      * @return 代表添加在数据库的行号id,  如果返回-1,代表添加失败(用户已经存在)
     32      */
     33     public long add(String name, float money) {
     34         if(isUserExist(name)) {
     35             return -1;
     36         }
     37         SQLiteDatabase db = helper.getWritableDatabase();
     38         ContentValues values = new ContentValues();
     39         values.put("name", name);
     40         values.put("money", money);
     41         long rowID = db.insert("account", null, values);
     42         db.close();
     43         return rowID;
     44     }
     45     
     46     
     47     
     48     /**
     49      * 删除一条数据库记录
     50      * @param name 用户姓名
     51      * @return  true 删除成功     false 删除失败
     52      */
     53     public boolean delete(String name) {
     54         SQLiteDatabase db = helper.getWritableDatabase();
     55         int result = db.delete("account", "name=?", new String[] {name});
     56         
     57         db.close();
     58         if(result >0) {
     59             return true;
     60         }else {
     61             return false;
     62         }
     63         
     64     }
     65     
     66     /**
     67      * 修改用户的的账户信息
     68      * @param name  要修改的储户的姓名
     69      * @param money 新的账户余额
     70      * @return  true 修改成功   false 修改失败
     71      */
     72     public boolean update(String name, float money) {
     73         
     74         
     75         SQLiteDatabase db = helper.getWritableDatabase();
     76         ContentValues values = new ContentValues();
     77         values.put("name", name);
     78         values.put("money", money);
     79         int result = db.update("account", values, "name=?", new String[] {name});
     80         db.close();
     81         if(result >0) {
     82             return true;
     83         }else {
     84             return false;
     85         }
     86     }
     87     
     88     /**
     89      * 查询某一个用户信息账户余额
     90      * @param name 要查询的用户的姓名
     91      */
     92     public float getUserMoney(String name) {
     93         float money = 0;
     94         SQLiteDatabase db = helper.getReadableDatabase();
     95         Cursor cursor = db.query("account", new String[] {"money"}, "name=?", new String[] {name}, null, null, null);
     96         if(cursor.moveToNext()) { //游标可以移动下一个,说明有数据查询到    
     97             money = cursor.getFloat(0);
     98         }
     99         cursor.close();
    100         db.close();
    101         return money;
    102     }
    103     
    104     
    105     public List<Map<String, Object>> findAllUser() {
    106         List<Map<String, Object>> allUsers = new ArrayList<Map<String, Object>>();
    107         SQLiteDatabase db = helper.getReadableDatabase();
    108         Cursor cursor = db.query("account", new String[] { "_id", "name",
    109                 "money" }, null, null, null, null, null);
    110         while (cursor.moveToNext()) {
    111             Map<String, Object> user = new HashMap<String, Object>();
    112             user.put("_id", cursor.getInt(0));
    113             user.put("name", cursor.getString(1));
    114             user.put("money", cursor.getFloat(2));
    115             allUsers.add(user);
    116         }
    117 
    118         cursor.close();
    119         db.close();
    120 
    121         return allUsers;
    122     }
    123     
    124     
    125     
    126     /**
    127      * 查询一个用户是否存在
    128      * @param name 要查询用户的名字
    129      * @return   true 存在      false 不存在
    130      */
    131     
    132     public boolean isUserExist(String name) {
    133         boolean result = false;
    134         SQLiteDatabase db = helper.getReadableDatabase();
    135         Cursor cursor = db.query("account", new String[] {"money"}, "name=?", new String[] {name}, null, null, null);
    136         if(cursor.moveToNext()) { //游标可以移动下一个,说明有数据查询到    
    137             result = true;
    138         }
    139         cursor.close();
    140         db.close();
    141         return result;
    142     }
    143   }

     (3)最后的MainActivity,为如下:

     1 package com.himi.db;
     2 
     3 
     4 import java.util.Random;
     5 
     6 import com.himi.db.dao.BankDBDao;
     7 
     8 import android.app.Activity;
     9 import android.os.Bundle;
    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         
    20         for (int i = 0; i < 20; i++) {
    21             dao.add("张" + i, random.nextFloat() + random.nextInt(500));
    22         }
    23     }
    24 
    25 }

    运行效果如下:

    (4)上面数据库中bank.db的数据是私有的,其他程序是不能访问的,但是如果我们想访问该怎么办

    7.这时候我们就可以使用ContentProvider这个组件了,下面我们在新建一个Android工程,命名为" 银行行长",我们的需求就是希望这里的"银行行长"可以获取上面数据库的数据,于是"银行行长"需要在银行安排内线接应,这样才能窃取用户的银行信息,这个"银行行长"的接应就是ContentProvider

    (1)新建的"银行行长"工程如下:

     

    (2)这个"银行行长"想要访问"数据库"的资源,我们需要在"数据库"中安排ContentProvider这个接应后门,如下:在"数据库"工程中,新建一个包 com.himi.db.provider,包中我们新建一个子类BankInfoProvider,让它继承自ContentProvider,结果如下:

    BankInfoProvider.java,如下:

     1 package com.himi.db.provider;
     2 
     3 import android.content.ContentProvider;
     4 import android.content.ContentValues;
     5 import android.content.UriMatcher;
     6 import android.database.Cursor;
     7 import android.database.sqlite.SQLiteDatabase;
     8 import android.net.Uri;
     9 
    10 import com.himi.db.MyDBOpenHelper;
    11 
    12 /**
    13  * 银行的内线,用来提供数据
    14  *
    15  */
    16 public class BankInfoProvider extends ContentProvider {
    17     private static final int ACCOUT = 1;
    18     private MyDBOpenHelper helper;
    19     //定义一个uri的匹配器,识别器(作用:检测路径是否合法的)
    20     private static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);//检测路径不合法返回NO_MATCH = -1
    21     
    22     static {
    23         //训练匹配器
    24         mUriMatcher.addURI("com.himi.db", "accout", ACCOUT);
    25         //  content://com.himi.db/account    访问account表里面的全部数据
    26         //  content://com.himi.db/account/8      访问account表里面的第8条数据
    27     }
    28     
    29     
    30     @Override
    31     public boolean onCreate() {//这里ContentProvider不是Context子类,不能使用this获取上下文
    32         helper = new MyDBOpenHelper(getContext());//getContext()只能在onCreate方法内部调用
    33         return false;
    34     }
    35 
    36     
    37     //查询方法
    38     @Override
    39     public Cursor query(Uri uri, String[] columns, String selection,
    40             String[] selectionArgs, String sortOrder) {
    41         int code = mUriMatcher.match(uri);
    42         if(code == ACCOUT) {
    43         SQLiteDatabase db = helper.getReadableDatabase();
    44         Cursor cursor = db.query("account", columns, selection, selectionArgs, null, null, null);
    45         return cursor;
    46         } else {
    47             throw new IllegalArgumentException("根据法律规定,你无权查看数据");
    48         }
    49     }
    50 
    51     @Override
    52     public String getType(Uri uri) {
    53         // TODO 自动生成的方法存根
    54         return null;
    55     }
    56 
    57     @Override
    58     public Uri insert(Uri uri, ContentValues values) {
    59         int code = mUriMatcher.match(uri);
    60         if(code == ACCOUT) {
    61             SQLiteDatabase db = helper.getWritableDatabase();
    62             long id = db.insert("account", null, values);
    63             db.close();
    64             return Uri.parse("content://com.himi.db/account/"+id);
    65         } else {
    66             throw new IllegalArgumentException("根据法律规定,你无权添加数据");
    67         }
    68     }
    69 
    70     @Override
    71     public int delete(Uri uri, String selection, String[] selectionArgs) {
    72         int code = mUriMatcher.match(uri);
    73         if(code == ACCOUT) {
    74             SQLiteDatabase db = helper.getWritableDatabase();
    75             int result = db.delete("account", selection, selectionArgs);
    76             db.close();
    77             return result;
    78         } else {
    79             throw new IllegalArgumentException("根据法律规定,你无权删除数据");
    80         }
    81     }
    82 
    83     @Override
    84     public int update(Uri uri, ContentValues values, String selection,
    85             String[] selectionArgs) {
    86         int code = mUriMatcher.match(uri);
    87         if(code == ACCOUT) {
    88             SQLiteDatabase db = helper.getWritableDatabase();
    89             int result = db.update("account", values, selection, selectionArgs);
    90             db.close();
    91             return result;
    92         } else {
    93             throw new IllegalArgumentException("根据法律规定,你无权修改数据");
    94         }
    95     }
    96 
    97 }

    UriMatcher本质上是一个文本过滤器,用在contentProvider中帮助我们过滤,分辨出查询者想要查询哪个数据表.

    • void addURI(String authority,String path,int code):

    authority:为AndroidManifest.xml中注册的ContentProvider中的authority属性;

    path:是一个字符串 和contact组合成完整的uri , path用来区分你要进行的操作是添加,修改 删除 查询中的某一个

    code是匹配成功的返回值

    • int match(Uri uri):匹配传递的Uri,返回addURI()传递的code参数

    定义了四大组件都要在AndroidMainfest.xml文件中注册,如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.himi.db"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6 
     7     <uses-sdk
     8         android:minSdkVersion="15"
     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=".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.himi.db.provider.BankInfoProvider"
    28             android:authorities="com.himi.db" >
    29         </provider>
    30     </application>
    31 
    32 </manifest>

    这里总结一下内容提供者编写的步骤

              (1)写一个类继承ContentProvider;

              (2)清单文件中配置,android:authorities = " com.himi.db"  (这个android:authorities 配置参数可以是任意字符串,通常设置包名);

              (3)训练内容提供者的匹配器 UriMatcher;

              (4)根据需求实现内容提供者的增删改查的方法;

    (3)前面我们已经在"数据库"工程中搭建好了ContentProvider内容提供者的框架,接下来当然就是如何在"银行行长"这个工程中使用ContentProvider获取工程"数据库"的数据

    在工程"银行行长",处理一下activity_main.xml的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="com.himi.banker.MainActivity" >
     7 
     8     <Button
     9         android:layout_width="fill_parent"
    10         android:layout_height="wrap_content"
    11         android:onClick="query"
    12         android:text="查询银行的数据库信息" />
    13 
    14     <Button
    15         android:layout_width="fill_parent"
    16         android:layout_height="wrap_content"
    17         android:onClick="add"
    18         android:text="添加一条储户的信息" />
    19 
    20     <Button
    21         android:layout_width="fill_parent"
    22         android:layout_height="wrap_content"
    23         android:onClick="delete"
    24         android:text="删除一条储户的信息" />
    25 
    26     <Button
    27         android:layout_width="fill_parent"
    28         android:layout_height="wrap_content"
    29         android:onClick="update"
    30         android:text="修改一条储户的信息" />
    31 
    32 </LinearLayout>

    布局效果如下:

    与此同时MainActivity,如下:

     1 package com.himi.banker;
     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 
    13 public class MainActivity extends Activity {
    14 
    15     @Override
    16     protected void onCreate(Bundle savedInstanceState) {
    17         super.onCreate(savedInstanceState);
    18         setContentView(R.layout.activity_main);
    19     }
    20 
    21     /**
    22      * 银行行长查询私有的数据库信息
    23      * @param view
    24      */
    25     public void query(View view) {
    26         //得到内容提供者的解析器
    27         ContentResolver resolver = getContentResolver();
    28         Uri uri = Uri.parse("content://com.himi.db/accout");
    29         Cursor cursor = resolver.query(uri, null, null, null, null);
    30         while(cursor.moveToNext()) {
    31             String id = cursor.getString(0);
    32             String name= cursor.getString(1);
    33             String money = cursor.getString(2);
    34             
    35             System.out.println("id");
    36             System.out.println("name");
    37             System.out.println("money");
    38         }
    39         cursor.close();
    40     }
    41     
    42     /**
    43      * 
    44      * 通过内容提供者,向银行私有的数据库添加一条记录
    45      */
    46     public void add(View view) {
    47         //得到内容提供者的解析器
    48         ContentResolver resolver = getContentResolver();
    49         Uri uri = Uri.parse("content://com.himi.db/accout");
    50         ContentValues values = new ContentValues();
    51         values.put("name", "王五");
    52         values.put("money", 1000000.23f);
    53         Uri result = resolver.insert(uri, values);
    54         Toast.makeText(this, result.toString(), 0).show();
    55     }
    56     
    57     /**
    58      * 
    59      * 通过内容提供者,向银行私有的数据库删除一条记录
    60      */
    61     public void delete(View view) {
    62         //得到内容提供者的解析器
    63         ContentResolver resolver = getContentResolver();
    64         Uri uri = Uri.parse("content://com.himi.db/accout");
    65         int result = resolver.delete(uri, "name=?", new String[] {"王五"});
    66         if(result >0) {
    67             Toast.makeText(this, "删除成功", 0).show();
    68         }else {
    69             Toast.makeText(this, "删除失败", 0).show();
    70         }
    71     }
    72     
    73     /**
    74      * 
    75      * 通过内容提供者,向银行私有的数据库修改一条记录
    76      */
    77     public void update(View view) {
    78         //得到内容提供者的解析器
    79         ContentResolver resolver = getContentResolver();
    80         Uri uri = Uri.parse("content://com.himi.db/accout");
    81         ContentValues values = new ContentValues();
    82         values.put("money", 0.05f);
    83         int result= resolver.update(uri, values, "name=?", new String[] {"王五"});
    84         if(result >0) {
    85             Toast.makeText(this, "修改成功", 0).show();
    86         }else {
    87             Toast.makeText(this, "修改失败", 0).show();
    88         }
    89     }
    90     
    91 }
    92  

    8. 分别布署" 数据库"  和 " 银行行长"到模拟器上,如下:

    (1)" 数据库"

    (2)银行行长"

    开始点击" 查询银行的数据库的信息 ",观察logcat打印的日志(System.out),如下:

    09-14 04:12:51.799: I/System.out(4679): id1
    09-14 04:12:51.799: I/System.out(4679): name张0
    09-14 04:12:51.808: I/System.out(4679): money472.8623046875
    09-14 04:12:51.808: I/System.out(4679): id2
    09-14 04:12:51.808: I/System.out(4679): name张1
    09-14 04:12:51.808: I/System.out(4679): money161.064041137695
    09-14 04:12:51.808: I/System.out(4679): id3
    09-14 04:12:51.808: I/System.out(4679): name张2
    09-14 04:12:51.808: I/System.out(4679): money381.409515380859
    09-14 04:12:51.808: I/System.out(4679): id4
    09-14 04:12:51.808: I/System.out(4679): name张3
    09-14 04:12:51.819: I/System.out(4679): money33.1423759460449
    09-14 04:12:51.819: I/System.out(4679): id5
    09-14 04:12:51.819: I/System.out(4679): name张4
    09-14 04:12:51.819: I/System.out(4679): money224.901092529297
    09-14 04:12:51.819: I/System.out(4679): id6
    09-14 04:12:51.819: I/System.out(4679): name张5
    09-14 04:12:51.819: I/System.out(4679): money227.865921020508
    09-14 04:12:51.828: I/System.out(4679): id7
    09-14 04:12:51.828: I/System.out(4679): name张6
    09-14 04:12:51.828: I/System.out(4679): money83.8797454833984
    09-14 04:12:51.828: I/System.out(4679): id8
    09-14 04:12:51.828: I/System.out(4679): name张7
    09-14 04:12:51.828: I/System.out(4679): money137.655731201172
    09-14 04:12:51.899: I/System.out(4679): id9
    09-14 04:12:51.899: I/System.out(4679): name张8
    09-14 04:12:51.899: I/System.out(4679): money375.561340332031
    09-14 04:12:51.909: I/System.out(4679): id10
    09-14 04:12:51.909: I/System.out(4679): name张9
    09-14 04:12:51.909: I/System.out(4679): money400.898559570313
    09-14 04:12:51.909: I/System.out(4679): id11
    09-14 04:12:51.909: I/System.out(4679): name张10
    09-14 04:12:51.909: I/System.out(4679): money86.0730209350586
    09-14 04:12:51.909: I/System.out(4679): id12
    09-14 04:12:51.909: I/System.out(4679): name张11
    09-14 04:12:51.919: I/System.out(4679): money98.2919998168945
    09-14 04:12:51.919: I/System.out(4679): id13
    09-14 04:12:51.919: I/System.out(4679): name张12
    09-14 04:12:51.919: I/System.out(4679): money292.426666259766
    09-14 04:12:51.919: I/System.out(4679): id14
    09-14 04:12:51.919: I/System.out(4679): name张13
    09-14 04:12:51.919: I/System.out(4679): money94.7325286865234
    09-14 04:12:51.929: I/System.out(4679): id15
    09-14 04:12:51.929: I/System.out(4679): name张14
    09-14 04:12:51.929: I/System.out(4679): money237.767715454102
    09-14 04:12:51.929: I/System.out(4679): id16
    09-14 04:12:51.929: I/System.out(4679): name张15
    09-14 04:12:51.929: I/System.out(4679): money38.8954315185547
    09-14 04:12:51.929: I/System.out(4679): id17
    09-14 04:12:51.929: I/System.out(4679): name张16
    09-14 04:12:51.929: I/System.out(4679): money479.318511962891
    09-14 04:12:51.939: I/System.out(4679): id18
    09-14 04:12:51.939: I/System.out(4679): name张17
    09-14 04:12:51.939: I/System.out(4679): money449.530059814453
    09-14 04:12:51.939: I/System.out(4679): id19
    09-14 04:12:51.939: I/System.out(4679): name张18
    09-14 04:12:51.949: I/System.out(4679): money319.149719238281
    09-14 04:12:51.949: I/System.out(4679): id20
    09-14 04:12:51.949: I/System.out(4679): name张19
    09-14 04:12:51.949: I/System.out(4679): money127.495582580566

    点击" 添加一条储户信息 ",再点击" 查询银行的数据库信息",观察logcat打印的日志(System.out)如下:

    09-14 04:17:14.399: I/System.out(4679): id1
    09-14 04:17:14.399: I/System.out(4679): name张0
    09-14 04:17:14.409: I/System.out(4679): money472.8623046875
    09-14 04:17:14.409: I/System.out(4679): id2
    09-14 04:17:14.409: I/System.out(4679): name张1
    09-14 04:17:14.409: I/System.out(4679): money161.064041137695
    09-14 04:17:14.409: I/System.out(4679): id3
    09-14 04:17:14.409: I/System.out(4679): name张2
    09-14 04:17:14.409: I/System.out(4679): money381.409515380859
    09-14 04:17:14.409: I/System.out(4679): id4
    09-14 04:17:14.409: I/System.out(4679): name张3
    09-14 04:17:14.419: I/System.out(4679): money33.1423759460449
    09-14 04:17:14.419: I/System.out(4679): id5
    09-14 04:17:14.419: I/System.out(4679): name张4
    09-14 04:17:14.419: I/System.out(4679): money224.901092529297
    09-14 04:17:14.419: I/System.out(4679): id6
    09-14 04:17:14.419: I/System.out(4679): name张5
    09-14 04:17:14.419: I/System.out(4679): money227.865921020508
    09-14 04:17:14.419: I/System.out(4679): id7
    09-14 04:17:14.429: I/System.out(4679): name张6
    09-14 04:17:14.429: I/System.out(4679): money83.8797454833984
    09-14 04:17:14.429: I/System.out(4679): id8
    09-14 04:17:14.429: I/System.out(4679): name张7
    09-14 04:17:14.479: I/System.out(4679): money137.655731201172
    09-14 04:17:14.479: I/System.out(4679): id9
    09-14 04:17:14.479: I/System.out(4679): name张8
    09-14 04:17:14.479: I/System.out(4679): money375.561340332031
    09-14 04:17:14.479: I/System.out(4679): id10
    09-14 04:17:14.479: I/System.out(4679): name张9
    09-14 04:17:14.479: I/System.out(4679): money400.898559570313
    09-14 04:17:14.479: I/System.out(4679): id11
    09-14 04:17:14.479: I/System.out(4679): name张10
    09-14 04:17:14.479: I/System.out(4679): money86.0730209350586
    09-14 04:17:14.479: I/System.out(4679): id12
    09-14 04:17:14.479: I/System.out(4679): name张11
    09-14 04:17:14.479: I/System.out(4679): money98.2919998168945
    09-14 04:17:14.479: I/System.out(4679): id13
    09-14 04:17:14.479: I/System.out(4679): name张12
    09-14 04:17:14.479: I/System.out(4679): money292.426666259766
    09-14 04:17:14.479: I/System.out(4679): id14
    09-14 04:17:14.479: I/System.out(4679): name张13
    09-14 04:17:14.479: I/System.out(4679): money94.7325286865234
    09-14 04:17:14.479: I/System.out(4679): id15
    09-14 04:17:14.479: I/System.out(4679): name张14
    09-14 04:17:14.489: I/System.out(4679): money237.767715454102
    09-14 04:17:14.489: I/System.out(4679): id16
    09-14 04:17:14.489: I/System.out(4679): name张15
    09-14 04:17:14.489: I/System.out(4679): money38.8954315185547
    09-14 04:17:14.489: I/System.out(4679): id17
    09-14 04:17:14.489: I/System.out(4679): name张16
    09-14 04:17:14.489: I/System.out(4679): money479.318511962891
    09-14 04:17:14.489: I/System.out(4679): id18
    09-14 04:17:14.489: I/System.out(4679): name张17
    09-14 04:17:14.489: I/System.out(4679): money449.530059814453
    09-14 04:17:14.489: I/System.out(4679): id19
    09-14 04:17:14.489: I/System.out(4679): name张18
    09-14 04:17:14.489: I/System.out(4679): money319.149719238281
    09-14 04:17:14.489: I/System.out(4679): id20
    09-14 04:17:14.489: I/System.out(4679): name张19
    09-14 04:17:14.499: I/System.out(4679): money127.495582580566
    09-14 04:17:14.499: I/System.out(4679): id23
    09-14 04:17:14.499: I/System.out(4679): name王五
    09-14 04:17:14.499: I/System.out(4679): money1000000.25

    点击"删除一条储户的信息",(前提:要删除的数据已经存在,这样才能删除。已经删除了或者不存在的,不能再次删除,报错)再次查询一下:

    观察logcat打印的日志(System.out)如下:

    09-14 04:24:55.810: I/System.out(4679): id1
    09-14 04:24:55.810: I/System.out(4679): name张0
    09-14 04:24:55.818: I/System.out(4679): money472.8623046875
    09-14 04:24:55.818: I/System.out(4679): id2
    09-14 04:24:55.818: I/System.out(4679): name张1
    09-14 04:24:55.818: I/System.out(4679): money161.064041137695
    09-14 04:24:55.818: I/System.out(4679): id3
    09-14 04:24:55.818: I/System.out(4679): name张2
    09-14 04:24:55.818: I/System.out(4679): money381.409515380859
    09-14 04:24:55.829: I/System.out(4679): id4
    09-14 04:24:55.829: I/System.out(4679): name张3
    09-14 04:24:55.829: I/System.out(4679): money33.1423759460449
    09-14 04:24:55.829: I/System.out(4679): id5
    09-14 04:24:55.919: I/System.out(4679): name张4
    09-14 04:24:55.919: I/System.out(4679): money224.901092529297
    09-14 04:24:55.940: I/System.out(4679): id6
    09-14 04:24:55.940: I/System.out(4679): name张5
    09-14 04:24:55.960: I/System.out(4679): money227.865921020508
    09-14 04:24:55.960: I/System.out(4679): id7
    09-14 04:24:55.960: I/System.out(4679): name张6
    09-14 04:24:55.960: I/System.out(4679): money83.8797454833984
    09-14 04:24:55.960: I/System.out(4679): id8
    09-14 04:24:55.960: I/System.out(4679): name张7
    09-14 04:24:55.960: I/System.out(4679): money137.655731201172
    09-14 04:24:55.960: I/System.out(4679): id9
    09-14 04:24:55.969: I/System.out(4679): name张8
    09-14 04:24:55.969: I/System.out(4679): money375.561340332031
    09-14 04:24:55.969: I/System.out(4679): id10
    09-14 04:24:55.969: I/System.out(4679): name张9
    09-14 04:24:55.969: I/System.out(4679): money400.898559570313
    09-14 04:24:55.969: I/System.out(4679): id11
    09-14 04:24:55.989: I/System.out(4679): name张10
    09-14 04:24:55.989: I/System.out(4679): money86.0730209350586
    09-14 04:24:55.989: I/System.out(4679): id12
    09-14 04:24:56.002: I/System.out(4679): name张11
    09-14 04:24:56.044: I/System.out(4679): money98.2919998168945
    09-14 04:24:56.049: I/System.out(4679): id13
    09-14 04:24:56.049: I/System.out(4679): name张12
    09-14 04:24:56.049: I/System.out(4679): money292.426666259766
    09-14 04:24:56.049: I/System.out(4679): id14
    09-14 04:24:56.049: I/System.out(4679): name张13
    09-14 04:24:56.049: I/System.out(4679): money94.7325286865234
    09-14 04:24:56.129: I/System.out(4679): id15
    09-14 04:24:56.129: I/System.out(4679): name张14
    09-14 04:24:56.129: I/System.out(4679): money237.767715454102
    09-14 04:24:56.129: I/System.out(4679): id16
    09-14 04:24:56.129: I/System.out(4679): name张15 截图
    09-14 04:24:56.129: I/System.out(4679): money38.8954315185547
    09-14 04:24:56.129: I/System.out(4679): id17
    09-14 04:24:56.129: I/System.out(4679): name张16
    09-14 04:24:56.129: I/System.out(4679): money479.318511962891
    09-14 04:24:56.129: I/System.out(4679): id18
    09-14 04:24:56.129: I/System.out(4679): name张17
    09-14 04:24:56.129: I/System.out(4679): money449.530059814453
    09-14 04:24:56.129: I/System.out(4679): id19
    09-14 04:24:56.129: I/System.out(4679): name张18
    09-14 04:24:56.129: I/System.out(4679): money319.149719238281
    09-14 04:24:56.129: I/System.out(4679): id20
    09-14 04:24:56.129: I/System.out(4679): name张19
    09-14 04:24:56.129: I/System.out(4679): money127.495582580566

    点击"修改一条储户的信息",前提:要修改的数据已经存在,这样才能修改。已经删除了或者不存在的,不能修改,报错)再次查询,如下:

    观察logcat打印的日志:

    09-14 04:30:08.099: I/System.out(4679): id1
    09-14 04:30:08.099: I/System.out(4679): name张0
    09-14 04:30:08.109: I/System.out(4679): money472.8623046875
    09-14 04:30:08.109: I/System.out(4679): id2
    09-14 04:30:08.109: I/System.out(4679): name张1
    09-14 04:30:08.109: I/System.out(4679): money161.064041137695
    09-14 04:30:08.109: I/System.out(4679): id3
    09-14 04:30:08.109: I/System.out(4679): name张2
    09-14 04:30:08.109: I/System.out(4679): money381.409515380859
    09-14 04:30:08.109: I/System.out(4679): id4
    09-14 04:30:08.109: I/System.out(4679): name张3
    09-14 04:30:08.109: I/System.out(4679): money33.1423759460449
    09-14 04:30:08.109: I/System.out(4679): id5
    09-14 04:30:08.109: I/System.out(4679): name张4
    09-14 04:30:08.109: I/System.out(4679): money224.901092529297
    09-14 04:30:08.119: I/System.out(4679): id6
    09-14 04:30:08.119: I/System.out(4679): name张5
    09-14 04:30:08.119: I/System.out(4679): money227.865921020508
    09-14 04:30:08.119: I/System.out(4679): id7
    09-14 04:30:08.119: I/System.out(4679): name张6
    09-14 04:30:08.119: I/System.out(4679): money83.8797454833984
    09-14 04:30:08.119: I/System.out(4679): id8
    09-14 04:30:08.119: I/System.out(4679): name张7
    09-14 04:30:08.119: I/System.out(4679): money137.655731201172
    09-14 04:30:08.119: I/System.out(4679): id9
    09-14 04:30:08.119: I/System.out(4679): name张8
    09-14 04:30:08.119: I/System.out(4679): money375.561340332031
    09-14 04:30:08.119: I/System.out(4679): id10
    09-14 04:30:08.119: I/System.out(4679): name张9
    09-14 04:30:08.119: I/System.out(4679): money400.898559570313
    09-14 04:30:08.119: I/System.out(4679): id11
    09-14 04:30:08.129: I/System.out(4679): name张10
    09-14 04:30:08.129: I/System.out(4679): money86.0730209350586
    09-14 04:30:08.129: I/System.out(4679): id12
    09-14 04:30:08.129: I/System.out(4679): name张11
    09-14 04:30:08.129: I/System.out(4679): money98.2919998168945
    09-14 04:30:08.138: I/System.out(4679): id13
    09-14 04:30:08.138: I/System.out(4679): name张12
    09-14 04:30:08.138: I/System.out(4679): money292.426666259766
    09-14 04:30:08.138: I/System.out(4679): id14
    09-14 04:30:08.138: I/System.out(4679): name张13
    09-14 04:30:08.138: I/System.out(4679): money94.7325286865234
    09-14 04:30:08.138: I/System.out(4679): id15
    09-14 04:30:08.138: I/System.out(4679): name张14
    09-14 04:30:08.138: I/System.out(4679): money237.767715454102
    09-14 04:30:08.149: I/System.out(4679): id16
    09-14 04:30:08.149: I/System.out(4679): name张15
    09-14 04:30:08.149: I/System.out(4679): money38.8954315185547
    09-14 04:30:08.149: I/System.out(4679): id17
    09-14 04:30:08.168: I/System.out(4679): name张16
    09-14 04:30:08.168: I/System.out(4679): money479.318511962891
    09-14 04:30:08.168: I/System.out(4679): id18
    09-14 04:30:08.168: I/System.out(4679): name张17
    09-14 04:30:08.168: I/System.out(4679): money449.530059814453
    09-14 04:30:08.168: I/System.out(4679): id19
    09-14 04:30:08.168: I/System.out(4679): name张18
    09-14 04:30:08.179: I/System.out(4679): money319.149719238281
    09-14 04:30:08.179: I/System.out(4679): id20
    09-14 04:30:08.179: I/System.out(4679): name张19
    09-14 04:30:08.209: I/System.out(4679): money127.495582580566
    09-14 04:30:08.209: I/System.out(4679): id24
    09-14 04:30:08.209: I/System.out(4679): name王五
    09-14 04:30:08.209: I/System.out(4679): money0.0500000007450581

  • 相关阅读:
    Spring Boot 2.X(十九):集成 mybatis-plus 高效开发
    Spring Cloud(二):Eureka 服务注册中心
    Spring Boot 2.X(十八):集成 Spring Security-登录认证和权限控制
    Spring Boot 2.X(十七):应用监控之 Spring Boot Admin 使用及配置
    Spring Boot 2.X(十六):应用监控之 Spring Boot Actuator 使用及配置
    Spring Boot 2.X(十五):集成 Swagger2 开发 API 文档(在线+离线)
    Spring Boot 2.X(十四):日志功能 Logback
    Spring Boot 2.X(十三):邮件服务
    Spring Boot 2.X(十二):定时任务
    Spring Boot 2.X(十一):全局异常处理
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4805669.html
Copyright © 2011-2022 走看看