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路径全部给注册上,如下:

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

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

5. ContentUris类使用介绍

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

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

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

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

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

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

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

自定义的子类为MyDBOpenHelper:

 package com.himi.db;

 import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; public class MyDBOpenHelper extends SQLiteOpenHelper { public MyDBOpenHelper(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)同时编写一个实现数据库增删改查的工具类,如下利用Google的API,如下:

 package com.himi.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.himi.db.MyDBOpenHelper; /**
*
*银行数据库的data access object
*
*/
public class BankDBDao {
private MyDBOpenHelper helper; public BankDBDao(Context context) {
helper = new MyDBOpenHelper(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 true 删除成功 false 删除失败
*/
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 true 修改成功 false 修改失败
*/
public boolean update(String name, float money) { SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
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 要查询的用户的姓名
*/
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;
} 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;
} /**
* 查询一个用户是否存在
* @param name 要查询用户的名字
* @return true 存在 false 不存在
*/ public boolean isUserExist(String name) {
boolean result = false;
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("account", new String[] {"money"}, "name=?", new String[] {name}, null, null, null);
if(cursor.moveToNext()) { //游标可以移动下一个,说明有数据查询到
result = true;
}
cursor.close();
db.close();
return result;
}
}

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

 package com.himi.db;

 import java.util.Random;

 import com.himi.db.dao.BankDBDao;

 import android.app.Activity;
import android.os.Bundle; 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));
}
} }

运行效果如下:

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

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

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

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

BankInfoProvider.java,如下:

 package com.himi.db.provider;

 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; import com.himi.db.MyDBOpenHelper; /**
* 银行的内线,用来提供数据
*
*/
public class BankInfoProvider extends ContentProvider {
private static final int ACCOUT = 1;
private MyDBOpenHelper helper;
//定义一个uri的匹配器,识别器(作用:检测路径是否合法的)
private static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);//检测路径不合法返回NO_MATCH = -1 static {
//训练匹配器
mUriMatcher.addURI("com.himi.db", "accout", ACCOUT);
// content://com.himi.db/account 访问account表里面的全部数据
// content://com.himi.db/account/8 访问account表里面的第8条数据
} @Override
public boolean onCreate() {//这里ContentProvider不是Context子类,不能使用this获取上下文
helper = new MyDBOpenHelper(getContext());//getContext()只能在onCreate方法内部调用
return false;
} //查询方法
@Override
public Cursor query(Uri uri, String[] columns, String selection,
String[] selectionArgs, String sortOrder) {
int code = mUriMatcher.match(uri);
if(code == ACCOUT) {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("account", columns, selection, selectionArgs, null, null, null);
return cursor;
} else {
throw new IllegalArgumentException("根据法律规定,你无权查看数据");
}
} @Override
public String getType(Uri uri) {
// TODO 自动生成的方法存根
return null;
} @Override
public Uri insert(Uri uri, ContentValues values) {
int code = mUriMatcher.match(uri);
if(code == ACCOUT) {
SQLiteDatabase db = helper.getWritableDatabase();
long id = db.insert("account", null, values);
db.close();
return Uri.parse("content://com.himi.db/account/"+id);
} else {
throw new IllegalArgumentException("根据法律规定,你无权添加数据");
}
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int code = mUriMatcher.match(uri);
if(code == ACCOUT) {
SQLiteDatabase db = helper.getWritableDatabase();
int result = db.delete("account", selection, selectionArgs);
db.close();
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 == ACCOUT) {
SQLiteDatabase db = helper.getWritableDatabase();
int result = db.update("account", values, selection, selectionArgs);
db.close();
return result;
} else {
throw new IllegalArgumentException("根据法律规定,你无权修改数据");
}
} }

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文件中注册,如下:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.himi.db"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="17" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".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.himi.db.provider.BankInfoProvider"
android:authorities="com.himi.db" >
</provider>
</application> </manifest>

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

          ()写一个类继承ContentProvider;

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

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

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

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

在工程"银行行长",处理一下activity_main.xml的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="com.himi.banker.MainActivity" > <Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="query"
android:text="查询银行的数据库信息" /> <Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="add"
android:text="添加一条储户的信息" /> <Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="delete"
android:text="删除一条储户的信息" /> <Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="update"
android:text="修改一条储户的信息" /> </LinearLayout>

布局效果如下:

与此同时MainActivity,如下:

 package com.himi.banker;

 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.himi.db/accout");
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();
} /**
*
* 通过内容提供者,向银行私有的数据库添加一条记录
*/
public void add(View view) {
//得到内容提供者的解析器
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.himi.db/accout");
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.himi.db/accout");
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.himi.db/accout");
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();
}
} }

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

Android(java)学习笔记189:ContentProvider使用(银行数据库创建和增删改查的案例)的更多相关文章

  1. Android(java)学习笔记245:ContentProvider使用(银行数据库创建和增删改查的案例)

    1. Android的四大组件: (1)Activity  用户交互的UI界面 (2)Service  后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentPro ...

  2. MYSQL学习笔记 (二)对数据库结构的增删改查

    显示数据库 show databases; 选择数据库 use database;//其实database为数据库的名字 创建表 create table tbclass( id int not nu ...

  3. Django学习笔记(10)——Book单表的增删改查页面

    一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...

  4. MySql cmd下的学习笔记 —— 有关表的操作(对表的增删改查)

    create table 表名 ( 列名1 列属性, 列名2 列属性 ... ... 列名n 列属性 )engine myisam charset utf8; (增加表的一列) (一)在表的最末列增加 ...

  5. yii学习笔记(6),数据库操作(增删改)

    数据库增删改操作通过活动记录实例来完成 插入记录 /* ----------添加记录---------- */ // 创建活动记录对象 $article = new Article(); $artic ...

  6. Android -- SQLite 数据库创建,增删改查,事务处理

    1. 概述 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类 ...

  7. python学习第十五天字典的创建及增删改查操作方法

    字典是python比较常见的数据类型,跟列表一样,比如的字典的创建,字典的常见的操作的方法,增加,删除,修改,查找等方法,字典的一共的数据方法为 keys()  values() fromkeys() ...

  8. Android:日常学习笔记(10)———使用LitePal操作数据库

    Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...

  9. MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存

    目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...

随机推荐

  1. SoapUI中Code多行显示设置

    你们的SoapUI 有设置下面的选项吗? Before adding your project, we recommend that you enable the following ReadyAPI ...

  2. JPEG库在Linux系统下的编译和移植【转】

    本文转载自: 这篇文章介绍了jpeg库在Linux系统下的编译和移植,经过了亲自的验证,编译首先需要准备以下资源:jpegsrc.v6b.tar.gz(jpeg库),libtool-1.5.26.ta ...

  3. Bootstrap 面板

    基本的面板:<div class="panel panel-default"> <div class="panel-body"> 这是一 ...

  4. Struts2自定义返回Json类型result

    本来Struts2有自己的json类型的返回结果,并提供了插件,但是它有一个问题,那就是它会将所有序列化的字段都返回,如果想要制定返回Action的某一个属性,则需要在配置result时,配置参数(这 ...

  5. bzoj3316: JC loves Mkk(单调队列+分数规划)

    Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整数,就输出整数:否则,输出既约分数“P/Q”来 ...

  6. css覆盖select样式并添加小箭头

    .select { border-radius: 5px; border: 1px #F4A627 solid; -webkit-appearance: none;//清除默认样式 backgroun ...

  7. 面试基础试题 一 http和HTTPS的区别

    作为老生常谈的问题,我主要给出我自己的理解和结合大牛的叙述的综合看法,来检验自己学习 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何 ...

  8. python数据库连接例子

    import sqlite3 conn = sqlite3.connect('food.db') curs = conn.cursor() curs.execute(''' CREATE TABLE ...

  9. Python3进行RSA2加密、解密、签名

    1.python3的PyCryptodome库用于密码学,属于对PyCrypto库的扩展 Linux上安装: pip install pycryptodome Windows上安装: pip inst ...

  10. 安卓Activity全屏显示以及不显示title

    1.让Activity全局显示,使系统的导航栏变为透明: (1)可以在Activity代码中添加window属性: if(VERSION.SDK_INT >= VERSION_CODES.KIT ...