Android03————数据库、listview、内容提供者

一、数据库

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();
	}
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值