ch023 Android ContentProvider(第二部分)

--------------------------------------------AndroidManifest.xml----------------------------------

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.kawa.ch23"

    android:versionCode="1"

    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name" >    

        <uses-library android:name="android.test.runner"/>

        <activity

            android:label="@string/app_name"

            android:name=".MainActivity" >

            <intent-filter >

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

        <provider

            android:authorities="com.kawa.ch23.provider.myprovider"

            android:name=".provider.MyProvider" >

        </provider>   

       <activity android:name="com.kawa.ch23.ItemActivity"></activity>

    </application>

     <instrumentation android:name="android.test.InstrumentationTestRunner"

  android:targetPackage="com.kawa.ch23" android:label="Tests for My App" />

</manifest>

--------------------------------------------Layout activity_main.java----------------------------

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

    <TableLayout

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:stretchColumns="1" >

        <TableRow >

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="姓名" />

            <EditText

                android:id="@+id/edtname"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content" 

                android:text="fy"/>

        </TableRow>

        <TableRow >

            <TextView            

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="年龄" />

            <EditText

                android:id="@+id/edtage"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content" 

                android:text="21"/>

        </TableRow>

    </TableLayout>

    <LinearLayout

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal" >

        <Button

            android:id="@+id/btnadd"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="新增" />

        <Button

            android:id="@+id/btnqueryall"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="查询所有" />

    </LinearLayout>

    <ListView

        android:id="@+id/lvall"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content" >

    </ListView>

</LinearLayout>

--------------------------------------------Layout item.xml--------------------------------------

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

    <TableLayout

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:stretchColumns="1" >

        <TableRow >

            <TextView

                android:layout_width="fill_parent"

                android:layout_height="wrap_content"

                android:text="ID" />

            <EditText

                android:id="@+id/edt_item_id"

                android:layout_width="fill_parent"

                android:layout_height="wrap_content" 

                />

        </TableRow>

        <TableRow >

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="姓名" />

            <EditText

                android:id="@+id/edt_item_name"

                android:layout_width="fill_parent"

                android:layout_height="wrap_content" />

        </TableRow>

        <TableRow >

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="年龄" />

            <EditText

                android:id="@+id/edt_item_age"

                android:layout_width="fill_parent"

                android:layout_height="wrap_content" />

        </TableRow>

    </TableLayout>

    <LinearLayout

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal" >

        <Button

            android:id="@+id/btndel"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="删除" />

        <Button

            android:id="@+id/btnupdate"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="更新" />

    </LinearLayout>

</LinearLayout>

--------------------------------------------Layout list_item.xml----------------------------------

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:orientation="horizontal" >

    <TextView

        android:id="@+id/tvId"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content" 

        android:layout_weight="1"

       />

    <TextView

        android:id="@+id/tvname"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content" 

           android:layout_weight="1"/>

    <TextView

        android:id="@+id/tvage"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content" 

           android:layout_weight="1"/>

</LinearLayout>

--------------------------------------------MainActivity.java--------------------------------------

package com.kawa.ch23;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import com.kawa.ch23.model.Person;

import com.kawa.ch23.util.Const;

import android.app.Activity;

import android.content.ContentResolver;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.Context;

import android.content.Intent;

import android.database.Cursor;

import android.net.Uri;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ListView;

import android.widget.SimpleAdapter;

import android.widget.Toast;

/**

 * 

 * 项目名称:com.kawa.ch23    

 * 类名称:MainActivity    

 * 类描述:  

 * 创建人:方勇   

 * 创建时间:2012-12-14 下午9:38:39   

 * Copyright (c) 方勇-版权所有

 */

public class MainActivity extends Activity {

private Button btn_addbtn_queryall;

private EditText field_namefield_age;

private ListView listview;

private List<Person> persons;

private SimpleAdapter simpleAdapter;

private Handler handler = new Handler() {//异步消息

@Override

public void handleMessage(Message msg) {

List<Map<String, Object>> data = (List<Map<String, Object>>) msg.obj;

System.out.println(data.size());

simpleAdapter = new SimpleAdapter(MainActivity.this, data,

R.layout.list_itemnew String[] { "id""name""age" }, new int[] {

R.id.tvId, R.id.tvname, R.id.tvage });

listview.setAdapter(simpleAdapter);

}

};

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

persons = new ArrayList<Person>();

findViews();

setListeners();

}

private void findViews() {

btn_queryall = (Button) this.findViewById(R.id.btnqueryall);

btn_add = (Button) this.findViewById(R.id.btnadd);

field_name = (EditText) this.findViewById(R.id.edtname);

field_age = (EditText) this.findViewById(R.id.edtage);

listview = (ListView) this.findViewById(R.id.lvall);

}

private void setListeners() {

btn_add.setOnClickListener(addOnClickListener);

// 查询所有

btn_queryall.setOnClickListener(queryOnClickListener);

listview.setOnItemClickListener(onItemClickListener);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (resultCode == 2) {

MyThread thread = new MyThread(MainActivity.this);

thread.start();

}

}

private OnClickListener addOnClickListener = new View.OnClickListener() {

@Override

public void onClick(View v) {

ContentResolver contentResolver = MainActivity.this

.getContentResolver();

Uri url = Uri.parse("content://"+Const.PROVIDER_URL+"/person");

ContentValues values = new ContentValues();

values.put("name"field_name.getText().toString());

values.put("age"field_age.getText().toString());

Uri result = contentResolver.insert(url, values);

System.out.println(result.toString());

if (ContentUris.parseId(result) > 0) {

Toast.makeText(MainActivity.this"添加成功",

Toast.LENGTH_LONG).show();

// 添加成功后再启动线程查询

MyThread thread = new MyThread(MainActivity.this);

thread.start();

}

}

};

private OnClickListener queryOnClickListener = new View.OnClickListener() {

@Override

public void onClick(View v) {

MyThread thread = new MyThread(MainActivity.this);

thread.start();

}

};

private OnItemClickListener onItemClickListener = new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view, int position,

long id) {

System.out.println("position:" + position);

Person person = persons.get(position);

Bundle bundle = new Bundle();

bundle.putInt("id", person.getId());

bundle.putString("name", person.getName());

bundle.putInt("age", person.getAge());

Intent intent = new Intent(MainActivity.this,

ItemActivity.class);

intent.putExtra("item", bundle);

startActivityForResult(intent, 1);

}

};

class MyThread extends Thread {

Context context;

public MyThread(Context context) {

// 一定要清空。否则会 有问题,每执行一次都会把之前的全部的item加进去

persons.clear();

listview.setAdapter(null);

this.context = context;

}

@Override

public void run() {

Uri url = Uri.parse("content://"+Const.PROVIDER_URL+"/person");

Cursor cursor = context.getContentResolver().query(url,

new String[] { "_id""name""age" }, nullnull"_id");

while (cursor.moveToNext()) {

Person person = new Person();

person.setId(cursor.getInt(cursor.getColumnIndex("_id")));

person.setName(cursor.getString(cursor.getColumnIndex("name")));

person.setAge(cursor.getInt(cursor.getColumnIndex("age")));

persons.add(person);

}

cursor.close();

List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();

Map<String, Object> map = null;

for (int i = 0; i < persons.size(); i++) {

map = new HashMap<String, Object>();

map.put("id"persons.get(i).getId());

map.put("name"persons.get(i).getName());

map.put("age"persons.get(i).getAge());

data.add(map);

}

Message msg = handler.obtainMessage();

msg.obj = data;

handler.sendMessage(msg);

}

}

}

--------------------------------------------ItemActivity.java--------------------------------------

package com.kawa.ch23;

import com.kawa.ch23.util.Const;

import android.app.Activity;

import android.content.ContentResolver;

import android.content.ContentValues;

import android.content.Intent;

import android.net.Uri;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

/**

 * 

 * 项目名称:com.kawa.ch23    

 * 类名称:ItemActivity    

 * 类描述:  

 * 创建人:方勇   

 * 创建时间:2012-12-14 下午9:45:04   

 * Copyright (c) 方勇-版权所有

 */

public class ItemActivity extends Activity {

private EditText field_name;

private EditText field_age;

private EditText field_id;

private Button btn_delbtn_update;

// 传数据

private Intent intent;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.item);

findViews();

setListeners();

intent = getIntent();

Bundle bundle = intent.getBundleExtra("item");//选中的数据

int id = bundle.getInt("id");

String name = bundle.getString("name");

int age = bundle.getInt("age");

field_id.setText(String.valueOf(id));

field_name.setText(name);

field_age.setText(String.valueOf(age));

}

private void findViews() {

field_id = (EditText) this.findViewById(R.id.edt_item_id);

field_id.setEnabled(false);// 控制不可用

field_name = (EditText) this.findViewById(R.id.edt_item_name);

field_age = (EditText) this.findViewById(R.id.edt_item_age);

// 得到传过来的数据

btn_del = (Button) this.findViewById(R.id.btndel);

btn_update = (Button) this.findViewById(R.id.btnupdate);

}

private void setListeners() {

btn_del.setOnClickListener(delOnClickListener);

btn_update.setOnClickListener(updateOnClickListener);

}

private OnClickListener updateOnClickListener = new View.OnClickListener() {

@Override

public void onClick(View v) {

ContentResolver contentResolver = ItemActivity.this.getContentResolver();

// 构建Uri

String url = "content://"+Const.PROVIDER_URL+"/person/"

field_id.getText();

Uri uri = Uri.parse(url);

ContentValues values = new ContentValues();

values.put("name"field_name.getText().toString());

values.put("age", Integer.parseInt(field_age.getText().toString()));

int result = contentResolver.update(uri, values, nullnull);

System.out.println("update result:" + result);

if (result >= 1) {

Toast.makeText(ItemActivity.this"更新成功", Toast.LENGTH_LONG).show();

ItemActivity.this.setResult(2);//设置返回结果

ItemActivity.this.finish();//销毁

}

}

};

private OnClickListener delOnClickListener = new View.OnClickListener() {

@Override

public void onClick(View v) {

ContentResolver contentResolver = ItemActivity.this.getContentResolver();

// 构建Uri

String url = "content://"+Const.PROVIDER_URL+"/person/"

field_id.getText();

Uri uri = Uri.parse(url);

int result = contentResolver.delete(uri, nullnull);

System.out.println("delete result:" + result);

if (result >= 1) {

Toast.makeText(ItemActivity.this"删除成功", Toast.LENGTH_LONG).show();

ItemActivity.this.setResult(2);

ItemActivity.this.finish();//销毁

}

}

};

}

--------------------------------------------util目录 Const.java-----------------------------------

public class Const {

public static String PROVIDER_URL = "com.kawa.ch23.provider.myprovider";

}

--------------------------------------------provider目录 MyProvider.java-----------------------

package com.kawa.ch23.provider;

import android.content.ContentProvider;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.UriMatcher;

import android.database.Cursor;

import android.net.Uri;

import com.kawa.ch23.db.DBHelper;

import com.kawa.ch23.util.Const;

/**

 * 

 * 项目名称:com.kawa.ch23    

 * 类名称:MyProvider    

 * 类描述:提供者  

 * 创建人:方勇   

 * 创建时间:2012-12-14 下午9:49:38   

 * Copyright (c) 方勇-版权所有

 */

public class MyProvider extends ContentProvider {

private DBHelper dbHelper;

// 定义一个UriMatcher类

private static final UriMatcher MATCHER = new UriMatcher(

UriMatcher.NO_MATCH);

private static final int PERSONS = 1;

private static final int PERSON = 2;

static {

MATCHER.addURI(Const.PROVIDER_URL"person"PERSONS);

MATCHER.addURI(Const.PROVIDER_URL"person/#"PERSON);

}

@Override

public boolean onCreate() {

System.out.println("---oncreate----");

dbHelper = new DBHelper(this.getContext());

dbHelper.open();

return false;

}

// 查询数据

@Override

public Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder) {

switch (MATCHER.match(uri)) {

case PERSONS:

// 查询所有的数据

return dbHelper.findList("person", projection, selection, selectionArgs,

nullnull, sortOrder);

case PERSON:

// 查询某个ID的数据

// 通过ContentUris这个工具类解释出ID

long id = ContentUris.parseId(uri);

String where = " _id=" + id;

if (!"".equals(selection) && selection != null) {

where = selection + " and " + where;

}

return dbHelper.findList("person", projection, where, selectionArgs, null,

null, sortOrder);

default:

throw new IllegalArgumentException("unknow uri" + uri.toString());

}

}

// 返回当前操作的数据的mimeType

@Override

public String getType(Uri uri) {

switch (MATCHER.match(uri)) {

case PERSONS:

return "vnd.android.cursor.dir/person";

case PERSON:

return "vnd.android.cursor.item/person";

default:

throw new IllegalArgumentException("Unkwon Uri:" + uri.toString());

}

}

// 插入数据

@Override

public Uri insert(Uri uri, ContentValues values) {

Uri insertUri = null;

switch (MATCHER.match(uri)) {

case PERSONS:

long rowid = dbHelper.insert("person", values);

insertUri = ContentUris.withAppendedId(uri, rowid);

break;

default:

throw new IllegalArgumentException("Unkwon Uri:" + uri.toString());

}

return insertUri;

}

// 删除数据

@Override

public int delete(Uri uri, String selection, String[] selectionArgs) {

int count = 0;

switch (MATCHER.match(uri)) {

case PERSONS:

count = dbHelper.delete("person", selection, selectionArgs);

return count;

case PERSON:

long id = ContentUris.parseId(uri);

String where = "_id=" + id;

if (selection != null && !"".equals(selection)) {

where = selection + " and " + where;

}

count = dbHelper.delete("person", where, selectionArgs);

return count;

default:

throw new IllegalArgumentException("Unkwon Uri:" + uri.toString());

}

}

// 更新数据

@Override

public int update(Uri uri, ContentValues values, String selection,

String[] selectionArgs) {

int count = 0;

switch (MATCHER.match(uri)) {

case PERSONS:

count = dbHelper.update("person", values, selection, selectionArgs);

break;

case PERSON:

// 通过ContentUri工具类得到ID

long id = ContentUris.parseId(uri);

String where = "_id=" + id;

if (selection != null && !"".equals(selection)) {

where = selection + " and " + where;

}

count = dbHelper.update("person", values, where, selectionArgs);

break;

default:

throw new IllegalArgumentException("Unkwon Uri:" + uri.toString());

}

return count;

}

}

--------------------------------------------provider目录 Test.java-------------------------------

package com.kawa.ch23.provider;

import com.kawa.ch23.util.Const;

import android.content.ContentResolver;

import android.content.ContentValues;

import android.database.Cursor;

import android.net.Uri;

import android.test.AndroidTestCase;

public class Test extends AndroidTestCase {

/*保存*/

public void testInsert() throws Exception {

ContentResolver contentResolver = this.getContext()

.getContentResolver();

Uri url = Uri.parse("content://"+Const.PROVIDER_URL+"/person");

ContentValues values = new ContentValues();

values.put("name""jiahui2");

values.put("age", 20);

contentResolver.insert(url, values);

}

/*删除*/

public void testDelete() throws Exception{

ContentResolver contentResolver = this.getContext()

.getContentResolver();

Uri url = Uri.parse("content://"+Const.PROVIDER_URL+"/person/1");

//ContentValues values = new ContentValues();

contentResolver.delete(url, nullnull);

}

/*更新*/

public void testUpdate() throws Exception {

ContentResolver contentResolver = this.getContext()

.getContentResolver();

Uri url = Uri.parse("content://"+Const.PROVIDER_URL+"/person/1");

ContentValues values = new ContentValues();

values.put("name""jiahui2");

values.put("age", 20);

contentResolver.update(url, values, null,null);

}

/*查询*/

public void testQuery() throws Exception {

ContentResolver contentResolver = this.getContext()

.getContentResolver();

Uri url = Uri.parse("content://"+Const.PROVIDER_URL+"/person");

Cursor cursor = contentResolver.query(url, new String[] { "_id",

"name""age" }, nullnull"_id");

while (cursor.moveToNext()) {

System.out.println("_id:"+cursor.getInt(cursor.getColumnIndex("_id")));

System.out.println("name:"+cursor.getString(cursor.getColumnIndex("name")));

System.out.println("age:"+cursor.getInt(cursor.getColumnIndex("age")));

}

}

}

--------------------------------------------model目录 Person.java-------------------------------

package com.kawa.ch23.model;

import java.io.Serializable;

public class Person  implements Serializable{

private int id;

private String name;

private int age;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + age;

result = prime * result + id;

result = prime * result + ((name == null) ? 0 : name.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

Person other = (Person) obj;

if (age != other.age)

return false;

if (id != other.id)

return false;

if (name == null) {

if (other.name != null)

return false;

else if (!name.equals(other.name))

return false;

return true;

}

@Override

public String toString() {

return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";

}

}

--------------------------------------------db目录 DBHelper.java--------------------------------

package com.kawa.ch23.db;

import com.kawa.ch23.util.LogOut;

import android.content.ContentValues;

import android.content.Context;

import android.database.Cursor;

import android.database.SQLException;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

/**

 * 

 * 项目名称:com.kawa.ch21   

 *  

 * 类名称:DBHelper  

 *   

 * 类描述:Sqlite3数据库操作工具类    

 *   

 * 创建人:fy  

 *  

 * 创建时间:2012-9-7 上午9:27:24   

 * 

 * Copyright (c) 方勇-版权所有

 */

public class DBHelper {

// DDL操作

private static DatabaseHelper dbHelper;

// DML操作

private static SQLiteDatabase db;

// 数据库名

private static final String DATABASE_NAME = "kawa.db";

// 数据库版本

private static final int DATABASE_VERSION = 1;

// 上下文环境

private final Context mCtx;

/* SQliteOpenHelper是一个抽象类,来管理数据库的创建和版本的管理 */

private static class DatabaseHelper extends SQLiteOpenHelper {

DatabaseHelper(Context context) {

super(context, DATABASE_NAMEnullDATABASE_VERSION);

}

@Override

public void onCreate(SQLiteDatabase db) {

String sql = "create table IF NOT EXISTS  person (_id integer primary key autoincrement, name text,age integer)";

LogOut.out("fy""sql[" + sql + "]");

db.execSQL(sql);

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

System.out.println("upgrade a database");

}

}

public DBHelper(Context ctx) {

this.mCtx = ctx;

}

public DBHelper open() throws SQLException {

dbHelper = new DatabaseHelper(mCtx);

db = dbHelper.getWritableDatabase();

return this;

}

public void closeclose() {

db.close();

dbHelper.close();

}

/**

 * 插入数据

 * 参数:tableName 表名

 * initialValues 要插入的列对应值

 *   */

public long insert(String tableName, ContentValues initialValues) {

return db.insert(tableName, null, initialValues);

}

/**

 * 删除数据

 * 参数:tableName 表名

 * deleteCondition 删除的条件

 * deleteArgs 如果deleteCondition中有“?”号,将用此数组中的值替换

 *   */

public int delete(String tableName, String deleteCondition,

String[] deleteArgs) {

return db.delete(tableName, deleteCondition, deleteArgs) ;

}

/**

 * 更新数据

 * 参数:tableName 表名

 * initialValues 要更新的列

 * selection 更新的条件

 * selectArgs 如果selection中有“?”号,将用此数组中的值替换

 *   */

public int update(String tableName, ContentValues initialValues,

String selection, String[] selectArgs) {

int returnValue = db

.update(tableName, initialValues, selection, selectArgs);

return returnValue ;

}

/**

 * 取得一个列表

 * 参数:tableName 表名

 * columns 返回的列

 * selection 查询条件

 * selectArgs 如果selection中有“?”号,将用此数组中的值替换

 *   */

public Cursor findList(String tableName, String[] columns, String selection,

String[] selectionArgs, String groupBy, String having, String orderBy) {

return db.query(tableName, columns, selection, selectionArgs, groupBy,

having, orderBy);

}

}

--------------------------------------------结果----------------------------------------------------

<!--EndFragment-->

猜你喜欢

转载自fangyong2006.iteye.com/blog/1748259
今日推荐