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

来源:互联网 发布:金融学实训软件 编辑:程序博客网 时间:2024/06/07 00:29

一、数据库

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 数据库的版本 >=1super(context, "person.db", null, 3);}/** * 数据库在<b> 第一次</b> 创建的时候调用的方法 * 适合做数据库表结构的初始化9 */@Overridepublic void onCreate(SQLiteDatabase db) {Log.i(TAG,"oncreate 数据库被创建了");db.execSQL("create table person (id integer primary key autoincrement , name varchar(20), phone varchar(20))");}@Overridepublic 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();}/** * 当测试框架准备好的时候执行的代码 适合做测试内容的初始化 */@Overrideprotected void setUp() throws Exception {dao = new PersonDao2(getContext());super.setUp();}/** * 擦屁股 */@Overrideprotected 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() {}@Overridepublic 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;@Overridepublic boolean onCreate() {helper = new PersonDBOpenHelper(getContext());return false;}//查询数据库 @Overridepublic 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("口令失败,滚犊子..");}}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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 {@Overrideprotected 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 {@Overrideprotected 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/"); // 全部短信的uriCursor 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
原创粉丝点击