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路径全部给注册上,如下:
//常量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使用(银行数据库创建和增删改查的案例)的更多相关文章
- Android(java)学习笔记245:ContentProvider使用(银行数据库创建和增删改查的案例)
1. Android的四大组件: (1)Activity 用户交互的UI界面 (2)Service 后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentPro ...
- MYSQL学习笔记 (二)对数据库结构的增删改查
显示数据库 show databases; 选择数据库 use database;//其实database为数据库的名字 创建表 create table tbclass( id int not nu ...
- Django学习笔记(10)——Book单表的增删改查页面
一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...
- MySql cmd下的学习笔记 —— 有关表的操作(对表的增删改查)
create table 表名 ( 列名1 列属性, 列名2 列属性 ... ... 列名n 列属性 )engine myisam charset utf8; (增加表的一列) (一)在表的最末列增加 ...
- yii学习笔记(6),数据库操作(增删改)
数据库增删改操作通过活动记录实例来完成 插入记录 /* ----------添加记录---------- */ // 创建活动记录对象 $article = new Article(); $artic ...
- Android -- SQLite 数据库创建,增删改查,事务处理
1. 概述 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类 ...
- python学习第十五天字典的创建及增删改查操作方法
字典是python比较常见的数据类型,跟列表一样,比如的字典的创建,字典的常见的操作的方法,增加,删除,修改,查找等方法,字典的一共的数据方法为 keys() values() fromkeys() ...
- Android:日常学习笔记(10)———使用LitePal操作数据库
Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...
随机推荐
- 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述
共识算法 区块链中最重要的便是共识算法,比特币使用的是POS(Proof of Work,工作量证明),以太币使用的是POS(Proof of Stake,股权证明)使得算理便的不怎么重要了,而今PO ...
- 强类型DataSet (2011-12-30 23:16:59)转载▼ 标签: 杂谈 分类: Asp.Net练习笔记 http://blog.sina.com.cn/s/blog_9d90c4140101214w.html
强类型DataSet (2011-12-30 23:16:59) 转载▼ 标签: 杂谈 分类: Asp.Net练习笔记 using System; using System.Collections.G ...
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较(转)
几大最短路径算法比较 几个最短路径算法的比较:Floyd 求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3). Floy ...
- 有关使用HTTP协议传输二进制文件
HTTP协议是基于字符(ASCII)的,当Content-Type项为text/xml,则内容是文本格式:当二进制格式时,Content-Type项为image/gif,就是了.例如,浏览器请求一张图 ...
- mac多线程下载神器
本文参考:https://blog.csdn.net/orangleliu/article/details/46834429 神器:axel 安装(已经安装homebrew前提下,没有请参考:http ...
- codeforces 688C C. NP-Hard Problem(bfs判断奇数长度环)
题目链接: C. NP-Hard Problem time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- bzoj 4543 HOTEL 加强版
题目大意: 求树上取三个点这三个点两两距离相等的方案数 思路: 远古时候的$n^2$做法是换根 但那样无法继续优化了 学习了一波长链剖分 考虑如何在一棵树上进行dp 设$f[i][j]$表示以$i$为 ...
- 学习Python到写poc其实没那么难
现在,开始! 0x00 前言 今天刚刚把http://drops.wooyun.org/tips/12751放到收藏夹准备看的,然后又看到题主的这个问题.顺便观摩了1楼大神的博客,我这种炒鸡新手表示很 ...
- Codeforces Round #209 (Div. 2) C - Prime Number
传送门 题意 给出n个数及x,求 \[\frac{\sum _{i=1}^n x^{a_1+a_2+...+a_{i-1}+a_{i+1}+...a_n}}{\prod_{i=1}^n x^{a_i} ...
- 理解C++中拷贝构造函数
拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同样对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象的时候系统会自动调用它:其形参是本类对象的引用,它的特殊功能是将参数 ...