一、数据库
1. 创建数据库 继承SQLiteOpenHelper
2. 实现数据库的增删改查 (直接写sql语句, 利用系统api)
例1:数据库
布局:
<ScrollView 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" >
<LinearLayout
android:id="@+id/ll_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
</LinearLayout>
</ScrollView>
自定义数据库:
package com.itheima.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class PersonDBOpenHelper extends SQLiteOpenHelper {
private static final String TAG = "PersonDBOpenHelper";
public PersonDBOpenHelper(Context context) {
//context 上下文
//name 数据库的名称
//factory 数据库查询结果的游标工厂
//version 数据库的版本 >=1
super(context, "person.db", null, 3);
}
/**
* 数据库在<b> 第一次</b> 创建的时候调用的方法
* 适合做数据库表结构的初始化9
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.i(TAG,"oncreate 数据库被创建了");
db.execSQL("create table person (id integer primary key autoincrement , name varchar(20), phone varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i(TAG,"onUpgrade 数据库更新了");
//程序1.0的版本已经发布了.
//程序的2.0的版本也要发布了. 2.0的版本 增加一个新的表
}
}
dao包:
personDao:
package com.itheima.db.dao;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.itheima.db.PersonDBOpenHelper;
/**
* 对person数据库 中的person表 增删改查
* @author Administrator
*
*/
public class PersonDao {
private PersonDBOpenHelper helper;
public PersonDao(Context context) {
helper = new PersonDBOpenHelper(context);
}
/**
* 添加一条记录
* @param name
* @param phone
*/
public void add(String name,String phone){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("insert into person (name,phone) values (?,?)", new Object[]{name,phone});
db.close();//最好记得关闭数据库, 避免如果有过的打开的连接 导致数据库以后无法访问.
}
/**
* 查询一条记录
* @param name 根据名字查询
*/
public boolean find(String name){
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from person where name=?", new String[]{name});
boolean result = cursor.moveToFirst();
cursor.close();
db.close();
return result;
}
/**
* 修改记录
* @param 姓名根据姓名修改
* @param newphone 新的电话号码
*/
public void update(String name,String newphone){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("update person set phone=? where name=?", new Object[]{newphone , name});
db.close();
}
/**
* 删除记录
*/
public void delete(String name){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("delete from person where name=?", new Object[]{ name});
db.close();
}
}
personDao2:
package com.itheima.db.dao;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.itheima.db.PersonDBOpenHelper;
import com.itheima.db.domain.Person;
public class PersonDao2 {
private PersonDBOpenHelper helper;
public PersonDao2(Context context) {
helper = new PersonDBOpenHelper(context);
}
public boolean add(String name, String phone) {
SQLiteDatabase db = helper.getWritableDatabase();
// db.execSQL("insert into person (name,phone) values (?,?)", new
// Object[]{name,phone});
ContentValues values = new ContentValues();
values.put("name", name);
values.put("phone", phone);
long id = db.insert("person", null, values);
db.close();
return id != -1;
}
public boolean find(String name) {
SQLiteDatabase db = helper.getReadableDatabase();
/*
* Cursor cursor = db.rawQuery("select * from peron where name =?", new
* String[]{name});
*/
Cursor cursor = db.query("person", null, "name=?",
new String[] { name }, null, null, null);
boolean result = cursor.moveToFirst();
cursor.close();
db.close();
return result;
}
/**
* 获取全部的person信息
* @return
*/
public List<Person> findAll(){
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("person", null, null, null, null, null, null);
List<Person> persons = new ArrayList<Person>();
while(cursor.moveToNext()){
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
Person person = new Person(name, phone, id);
persons.add(person);
}
cursor.close();
db.close();
return persons;
}
public boolean update(String name, String newphone) {
SQLiteDatabase db = helper.getReadableDatabase();
// db.execSQL("update person set phone=? where name=?", new
// Object[]{newphone,name});
ContentValues values = new ContentValues();
values.put("phone", newphone);
int result = db.update("person", values, "name=?",
new String[] { name });
db.close();
return result>0;
}
public boolean delete(String name) {
SQLiteDatabase db = helper.getWritableDatabase();
// db.execSQL("delete from person where name=?", new Object[]{ name});
int result = db.delete("person", "name=?", new String[]{name});
db.close();
return result>0;
}
}
单元测试(对业务逻辑进行测试,保证无误)
package com.itheima.db.test;
import com.itheima.db.PersonDBOpenHelper;
import com.itheima.db.dao.PersonDao;
import com.itheima.db.dao.PersonDao2;
import android.test.AndroidTestCase;
public class TestPersonDB extends AndroidTestCase {
private PersonDao2 dao;
public void testCreateDB() throws Exception {
// getContext() 获取的是一个假的模拟的上下文 一个方便测试框架使用的上下文
PersonDBOpenHelper helper = new PersonDBOpenHelper(getContext());// 数据库并不会创建
helper.getWritableDatabase();
}
/**
* 当测试框架准备好的时候执行的代码 适合做测试内容的初始化
*/
@Override
protected void setUp() throws Exception {
dao = new PersonDao2(getContext());
super.setUp();
}
/**
* 擦屁股
*/
@Override
protected void tearDown() throws Exception {
dao = null;
super.tearDown();
}
public void testAdd() throws Exception {
String basename ="zhangsan";
long number = 1350000000l;
for(int i = 0;i<50;i++){
dao.add(basename+i, String.valueOf(number+i));
}
}
public void testFind() throws Exception {
boolean result = dao.find("zhangsan");
assertEquals(true, result);
}
public void testUpdate() throws Exception {
dao.update("zhangsan", "110");
}
public void testDelete() throws Exception {
dao.delete("zhangsan");
}
}
javabean:
package com.itheima.db.domain;
public class Person {
private String name;
private String phone;
private int id;
public Person() {
}
@Override
public String toString() {
return "Person [name=" + name + ", phone=" + phone + ", id=" + id + "]";
}
public Person(String name, String phone, int id) {
this.name = name;
this.phone = phone;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
activity:
package com.itheima.db;
import java.util.List;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.itheima.db.dao.PersonDao2;
import com.itheima.db.domain.Person;
public class MainActivity extends Activity {
private LinearLayout ll_root;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ll_root = (LinearLayout) findViewById(R.id.ll_root);
PersonDao2 dao = new PersonDao2(this);
List<Person> persons = dao.findAll();
for(Person p : persons){
String info = p.toString();
TextView tv = new TextView(this);
tv.setText(info);
ll_root.addView(tv);
}
}
}
数据库事务:
package com.itheima.db.test;
import com.itheima.db.PersonDBOpenHelper;
import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase;
public class TestTransaction extends AndroidTestCase {
String s;
public void test() throws Exception {
PersonDBOpenHelper helper = new PersonDBOpenHelper(getContext());
SQLiteDatabase db = helper.getWritableDatabase();
db.beginTransaction();// 开始数据库的事务
try {
db.execSQL("update person set account = account-100 where name='zhangsan'");
// s.equals("haha");
db.execSQL("update person set account = account+100 where name='zhangsan0'");
db.setTransactionSuccessful(); // 如果没有标记数据库事务成功 //数据会回滚
} finally {
db.endTransaction(); // 检查是否设置了事务成功的flag
}
db.close();
}
}
二、内容提供者:
举例:
package com.itheima.db;
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;
public class PersonDBProvider extends ContentProvider {
//我是一个内容提供者 提供数据给别的应用 , 我的后门的地址 是通过uri来判断 实现一个地址的对照器
private static final int OK = 200;
private static final int ID = 201;
//uri的匹配器
private static UriMatcher mather = new UriMatcher(UriMatcher.NO_MATCH);//如果发现路径不正确 不匹配 返回-1
//定义uri的匹配规则
static{
//建立了一条匹配规则
//匹配的路径 content://com.itheima.db/person/
mather.addURI("com.itheima.db", "person", OK);
mather.addURI("com.itheima.db","person/#", ID);
}
private PersonDBOpenHelper helper;
@Override
public boolean onCreate() {
helper = new PersonDBOpenHelper(getContext());
return false;
}
//查询数据库
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
int result = mather.match(uri);
if(result==OK){//口令正确
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
return cursor;//cursor所对应的数据库不要关闭;关闭了cursor就不能查询到内容了;
}else if(result == ID){
int postion = uri.getPath().lastIndexOf("/");
String newid = uri.getPath().substring(postion+1);
System.out.println(uri.getPath());
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.query("person", projection, "id=?", new String[]{newid}, null, null, sortOrder);
return cursor;
}
else{
throw new IllegalArgumentException("口令失败,滚犊子..");
}
}
@Override
public String getType(Uri uri) {
int result = mather.match(uri);
if(result==OK){//口令正确
return "vnd.android.cursor.dir/person";
}else if(result == ID){
return "vnd.android.cursor.item/person";
}
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int result = mather.match(uri);
if(result==OK){//口令正确
SQLiteDatabase db = helper.getWritableDatabase();
db.insert("person", null, values);
db.close();
}else{
throw new IllegalArgumentException("口令失败,滚犊子..");
}
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int result = mather.match(uri);
if(result==OK){//口令正确
SQLiteDatabase db = helper.getWritableDatabase();
db.delete("person", selection, selectionArgs);
db.close();
}else{
throw new IllegalArgumentException("口令失败,滚犊子..");
}
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int result = mather.match(uri);
if(result==OK){//口令正确
SQLiteDatabase db = helper.getWritableDatabase();
db.update("person", values, selection, selectionArgs);
db.close();
}else{
throw new IllegalArgumentException("口令失败,滚犊子..");
}
return 0;
}
}
另一个应用:
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<Button
android:onClick="query"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询" />
<Button
android:onClick="insert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加" />
<Button
android:onClick="update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="更新" />
<Button
android:onClick="delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="queryOne"
android:text="查询id为20的联系人" />
</LinearLayout>
activity:
package com.itheima.other;
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;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void query(View view){
//得到内容解析者
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.itheima.db/person");
Cursor cursor = resolver.query(uri, new String[]{"name","phone","account"}, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(0);
String phone = cursor.getString(1);
String account = cursor.getString(2);
System.out.println(name+"---"+phone+"---"+account);
}
cursor.close();
}
public void insert(View view){
//得到内容解析者
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.itheima.db/person");
ContentValues values = new ContentValues();
values.put("name", "王五");
values.put("phone", "5556");
values.put("account", 1000000);
resolver.insert(uri, values);
}
public void update(View view){
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.itheima.db/person");
ContentValues values = new ContentValues();
values.put("account", 5);
resolver.update(uri, values, "name=?", new String[]{"王五"});
}
public void delete(View view){
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.itheima.db/person");
resolver.delete(uri, "name=?", new String[]{"王五"});
}
public void queryOne(View view){
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.itheima.db/person/20");
Cursor cursor = resolver.query(uri, new String[]{"name","phone","id","account"}, null, null, null);
if(cursor.moveToNext()){
String name = cursor.getString(0);
String phone = cursor.getString(1);
String id = cursor.getString(2);
String account = cursor.getString(3);
System.out.println(name+"---"+id+"---"+phone+"---"+account);
}
cursor.close();
}
}
三、读取系统短信:
package com.itheima.readsms;
import java.util.Date;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.location.Address;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void readSms(View view) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://sms/"); // 全部短信的uri
Cursor cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) {
String address = cursor.getString(cursor.getColumnIndex("address"));
long date = cursor.getLong(cursor.getColumnIndex("date"));
String body = cursor.getString(cursor.getColumnIndex("body"));
String type = cursor.getString(cursor.getColumnIndex("type"));
System.out.println("地址:" + address + " 时间" + new Date(date)
+ " 内容:" + body);
if ("1".equals(type)) {
System.out.println("接收到的短信");
} else {
System.out.println("发送的短信");
}
}
cursor.close();
}
}