1、  编写ContentPrivider提供者的Android应用

清单文件

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

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

package="com.itheima28.sqlitedemo"

android:versionCode="1"

android:versionName="1.0" >

<instrumentation

android:name="android.test.InstrumentationTestRunner"

android:targetPackage="com.itheima28.sqlitedemo" >

</instrumentation>

<permission android:name="aa.bb.cc.read" ></permission>

<permission android:name="aa.bb.cc.write" ></permission>

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="19" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

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

<activity

android:name="com.itheima28.sqlitedemo.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>

<!—注意加上:android:exported="true",通过它来避免出错

<provider

android:name=".providers.PersonContentProvider"

android:authorities="com.itheima28.sqlitedemo.providers.PersonContentProvider"

android:readPermission="aa.bb.cc.read"

android:writePermission="aa.bb.cc.write"

android:exported="true">

</provider>

</application>

</manifest>

2 编写实体Person

package com.itheima28.sqlitedemo.entities;

publicclass Person {

privateintid;

private String name;

privateintage;

publicint getId() {

returnid;

}

publicvoid setId(int id) {

this.id = id;

}

public String getName() {

returnname;

}

publicvoid setName(String name) {

this.name = name;

}

publicint getAge() {

returnage;

}

publicvoid setAge(int age) {

this.age = age;

}

public Person() {

super();

// TODO Auto-generated constructor stub

}

public Person(int id, String name, int age) {

super();

this.id = id;

this.name = name;

this.age = age;

}

@Override

public String toString() {

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

}

}

3 编写dbHelper

package com.itheima28.sqlitedemo.db;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.util.Log;

/**

* @author toto

* 数据库帮助类,用于创建和管理数据库的

*/

public class PersonSQLiteOpenHelper extends SQLiteOpenHelper{

private static final String TAG = "PersonSQLiteOpenHelper";

public PersonSQLiteOpenHelper(Context context){

super(context, "itheima28.db", null, 2);

}

/**

* 数据库第一次创建时回调此方法

* 初始化表

*/

@Override

public void onCreate(SQLiteDatabase db) {

//操作数据

String sql = "create table person(_id integer primary key, name varchar(20), age integer);";

db.execSQL(sql);

}

/**

* 数据库的版本号更新时回调此方法

* 更新数据库的内容(删除表,添加表,修改表)

*/

@Override

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

if (oldVersion == 1 && newVersion == 2) {

Log.i(TAG, "数据库更新啦");

db.execSQL("alter table person add balance integer;");

}

}

}

4 编写通过sql的Dao操作类

package com.itheima28.sqlitedemo.dao;

import java.util.ArrayList;

import java.util.List;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

public class PersonDao {

private PersonSQLiteOpenHelper mOpenHelper;   // 数据库的帮助类对象

public PersonDao(Context context) {

mOpenHelper = new PersonSQLiteOpenHelper(context);

}

/**

* 添加到person表一条数据

* @param person

*/

public void insert(Person person) {

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

if(db.isOpen()) {        // 如果数据库打开, 执行添加的操作

// 执行添加到数据库的操作

db.execSQL("insert into person(name, age) values(?, ?);", new Object[]{person.getName(), person.getAge()});

db.close();        // 数据库关闭

}

}

/**

* 更据id删除记录

* @param id

*/

public void delete(int id) {

SQLiteDatabase db = mOpenHelper.getWritableDatabase();         // 获得可写的数据库对象

if(db.isOpen()) {        // 如果数据库打开, 执行添加的操作

db.execSQL("delete from person where _id = ?;", new Integer[]{id});

db.close();        // 数据库关闭

}

}

/**

* 根据id找到记录, 并且修改姓名

* @param id

* @param name

*/

public void update(int id, String name) {

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

if(db.isOpen()) {        // 如果数据库打开, 执行添加的操作

db.execSQL("update person set name = ? where _id = ?;", new Object[]{name, id});

db.close();        // 数据库关闭

}

}

public List<Person> queryAll() {

SQLiteDatabase db = mOpenHelper.getReadableDatabase();       // 获得一个只读的数据库对象

if(db.isOpen()) {

Cursor cursor = db.rawQuery("select _id, name, age from person;", null);

if(cursor != null && cursor.getCount() > 0) {

List<Person> personList = new ArrayList<Person>();

int id;

String name;

int age;

while(cursor.moveToNext()) {

id = cursor.getInt(0);        // 取第0列的数据 id

name = cursor.getString(1);    // 取姓名

age = cursor.getInt(2);              // 取年龄

personList.add(new Person(id, name, age));

}

db.close();

return personList;

}

db.close();

}

return null;

}

/**

* 根据id查询人

* @param id

* @return

*/

public Person queryItem(int id) {

SQLiteDatabase db = mOpenHelper.getReadableDatabase();       // 获得一个只读的数据库对象

if(db.isOpen()) {

Cursor cursor = db.rawQuery("select _id, name, age from person where _id = ?;", new String[]{id + ""});

if(cursor != null && cursor.moveToFirst()) {

int _id = cursor.getInt(0);

String name = cursor.getString(1);

int age = cursor.getInt(2);

db.close();

return new Person(_id, name, age);

}

db.close();

}

return null;

}

}

5 编写不是通过sql的操作类

package com.itheima28.sqlitedemo.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 android.util.Log;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

public class PersonDao2 {

private static final String TAG = "PersonDao2";

private PersonSQLiteOpenHelper mOpenHelper;   // 数据库的帮助类对象

public PersonDao2(Context context) {

mOpenHelper = new PersonSQLiteOpenHelper(context);

}

/**

* 添加到person表一条数据

* @param person

*/

public void insert(Person person) {

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

if(db.isOpen()) {        // 如果数据库打开, 执行添加的操作

ContentValues values = new ContentValues();

values.put("name", person.getName());                  // key作为要存储的列名, value对象列的值

values.put("age", person.getAge());

long id = db.insert("person", "name", values);

Log.i(TAG, "id: " + id);

db.close();        // 数据库关闭

}

}

/**

* 更据id删除记录

* @param id

*/

public void delete(int id) {

SQLiteDatabase db = mOpenHelper.getWritableDatabase();         // 获得可写的数据库对象

if(db.isOpen()) {        // 如果数据库打开, 执行添加的操作

String whereClause = "_id = ?";

String[] whereArgs = {id + ""};

int count = db.delete("person", whereClause, whereArgs);

Log.i(TAG, "删除了: " + count + "行");

db.close();        // 数据库关闭

}

}

/**

* 根据id找到记录, 并且修改姓名

* @param id

* @param name

*/

public void update(int id, String name) {

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

if(db.isOpen()) {        // 如果数据库打开, 执行添加的操作

ContentValues values = new ContentValues();

values.put("name", name);

int count  = db.update("person", values, "_id = ?", new String[]{id + ""});

Log.i(TAG, "修改了: " + count + "行");

db.close();        // 数据库关闭

}

}

public List<Person> queryAll() {

SQLiteDatabase db = mOpenHelper.getReadableDatabase();       // 获得一个只读的数据库对象

if(db.isOpen()) {

String[] columns = {"_id", "name", "age"};     // 需要的列

String selection = null;     // 选择条件, 给null查询所有

String[] selectionArgs = null;   // 选择条件的参数, 会把选择条件中的? 替换成数据中的值

String groupBy = null;       // 分组语句  group by name

String having = null; // 过滤语句

String orderBy = null;       // 排序

Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);

int id;

String name;

int age;

if(cursor != null && cursor.getCount() > 0) {

List<Person> personList = new ArrayList<Person>();

while(cursor.moveToNext()) {  // 向下移一位, 知道最后一位, 不可以往下移动了, 停止.

id = cursor.getInt(0);

name = cursor.getString(1);

age = cursor.getInt(2);

personList.add(new Person(id, name, age));

}

db.close();

return personList;

}

db.close();

}

return null;

}

/**

* 根据id查询人

* @param id

* @return

*/

public Person queryItem(int id) {

SQLiteDatabase db = mOpenHelper.getReadableDatabase();       // 获得一个只读的数据库对象

if(db.isOpen()) {

String[] columns = {"_id", "name", "age"};     // 需要的列

String selection = "_id = ?";     // 选择条件, 给null查询所有

String[] selectionArgs = {id + ""};     // 选择条件的参数, 会把选择条件中的? 替换成数据中的值

String groupBy = null;       // 分组语句  group by name

String having = null; // 过滤语句

String orderBy = null;       // 排序

Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);

if(cursor != null && cursor.moveToFirst()) {              // cursor对象不为null, 并且可以移动到第一行

int _id = cursor.getInt(0);

String name = cursor.getString(1);

int age = cursor.getInt(2);

db.close();

return new Person(_id, name, age);

}

db.close();

}

return null;

}

}

6 编写通过sql操作数据库的单元测试

package com.itheima28.sqlitedemo.test;

import java.util.List;

import android.database.sqlite.SQLiteDatabase;

import android.test.AndroidTestCase;

import android.util.Log;

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

public class TestCase extends AndroidTestCase {

private static final String TAG = "TestCase";

public void test() {

// 数据库什么时候创建

PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

// 第一次连接数据库时创建数据库文件. onCreate会被调用

openHelper.getReadableDatabase();

}

public void testInsert() {

PersonDao dao = new PersonDao(getContext());

for (int i = 0; i < 20; i++) {

dao.insert(new Person(0, "冠希" + i, 10 + i));

}

}

public void testDelete() {

PersonDao dao = new PersonDao(getContext());

dao.delete(1);

}

public void testUpdate() {

PersonDao dao = new PersonDao(getContext());

dao.update(3, "凤姐");

}

public void testQueryAll() {

PersonDao dao = new PersonDao(getContext());

List<Person> personList = dao.queryAll();

for (Person person : personList) {

Log.i(TAG, person.toString());

}

}

public void testQueryItem() {

PersonDao dao = new PersonDao(getContext());

Person person = dao.queryItem(4);

Log.i(TAG, person.toString());

}

public void testTransaction() {

PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

SQLiteDatabase db = openHelper.getWritableDatabase();

if(db.isOpen()) {

try {

// 开启事务

db.beginTransaction();

// 1. 从张三账户中扣1000块钱

db.execSQL("update person set balance = balance - 1000 where name = 'zhangsan';");

// ATM机, 挂掉了.

// int result = 10 / 0;

// 2. 向李四账户中加1000块钱

db.execSQL("update person set balance = balance + 1000 where name = 'lisi';");

// 标记事务成功

db.setTransactionSuccessful();

} finally {

// 停止事务

db.endTransaction();

}

db.close();

}

}

public void testTransactionInsert() {

PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

SQLiteDatabase db = openHelper.getWritableDatabase();

if(db.isOpen()) {

// 1. 记住当前的时间

long start = System.currentTimeMillis();

// 2. 开始添加数据

try {

db.beginTransaction();

for (int i = 0; i < 10000; i++) {

db.execSQL("insert into person(name, age, balance) values('wang" + i + "', " + (10 + i) + ", " + (10000 + i) + ")");

}

db.setTransactionSuccessful();

} finally {

db.endTransaction();

}

// 3. 记住结束时间, 计算耗时时间

long end = System.currentTimeMillis();

long diff = end - start;

Log.i(TAG, "耗时: " + diff + "毫秒");

db.close();

}

}

}

7 编写不是通过sql操作的数据库的单元测试

package com.itheima28.sqlitedemo.test;

import java.util.List;

import android.test.AndroidTestCase;

import android.util.Log;

import com.itheima28.sqlitedemo.dao.PersonDao2;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

public class TestCase2 extends AndroidTestCase {

private static final String TAG = "TestCase";

public void test() {

// 数据库什么时候创建

PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

// 第一次连接数据库时创建数据库文件. onCreate会被调用

openHelper.getReadableDatabase();

}

public void testInsert() {

PersonDao2 dao = new PersonDao2(getContext());

dao.insert(new Person(0, "zhouqi", 88));

}

public void testDelete() {

PersonDao2 dao = new PersonDao2(getContext());

dao.delete(8);

}

public void testUpdate() {

PersonDao2 dao = new PersonDao2(getContext());

dao.update(3, "fengjie");

}

public void testQueryAll() {

PersonDao2 dao = new PersonDao2(getContext());

List<Person> personList = dao.queryAll();

for (Person person : personList) {

Log.i(TAG, person.toString());

}

}

public void testQueryItem() {

PersonDao2 dao = new PersonDao2(getContext());

Person person = dao.queryItem(4);

Log.i(TAG, person.toString());

}

}

8 Activity不用写东西

二、第二个测试项目调用第一个项目的ContentProvider

清单文件如下:

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

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

package="com.itheima28.othercontentprovider"

android:versionCode="1"

android:versionName="1.0" >

<instrumentation

android:name="android.test.InstrumentationTestRunner"

android:targetPackage="com.itheima28.othercontentprovider">

</instrumentation>

<uses-permission android:name="aa.bb.cc.read"/>

<uses-permission android:name="aa.bb.cc.write"/>

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="19" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

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

<activity

android:name="com.itheima28.othercontentprovider.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>

</application>

</manifest>

2 Activity不用写

3 单元测试类如下:

package com.itheima28.othercontentprovider;

import android.content.ContentResolver;

import android.content.ContentUris;

import android.content.ContentValues;

import android.database.Cursor;

import android.net.Uri;

import android.test.AndroidTestCase;

import android.util.Log;

publicclass TextCase extends AndroidTestCase {

privatestaticfinal String TAG = "TextCase";

publicvoid testInsert() {

Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/insert");

//内容提供者访问对象

ContentResolver resolver = getContext().getContentResolver();

ContentValues values = new ContentValues();

values.put("name", "fengjie");

values.put("age", 90);

uri = resolver.insert(uri, values);

Log.i(TAG, "uri:" + uri);

long id = ContentUris.parseId(uri);

Log.i(TAG, "添加到:" + id);

}

publicvoid testDelete() {

Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/delete");

//内容提供者访问对象

ContentResolver resolver = getContext().getContentResolver();

String where = "_id = ?";

String[] selectionArgs = {"21"};

int count = resolver.delete(uri, where, selectionArgs);

Log.i(TAG, "删除行:" + count);

}

publicvoid testUpdate() {

Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/update");

//内容提供者访问对象

ContentResolver resolver = getContext().getContentResolver();

ContentValues values = new ContentValues();

values.put("name", "lisi");

int count = resolver.update(uri, values,"_id = ?", new String[]{"20"});

Log.i(TAG, "更新行:" + count);

}

publicvoid testQueryAll() {

Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/queryAll");

//内容提供者访问对象

ContentResolver resolver = getContext().getContentResolver();

Cursor cursor = resolver.query(uri, new String[]{"_id", "name", "age"}, null, null, "_id desc");

if (cursor != null && cursor.getCount() > 0) {

int id;

String name;

int age;

while(cursor.moveToNext()){

id = cursor.getInt(0);

name = cursor.getString(1);

age = cursor.getInt(2);

Log.i(TAG, "id: " + id + ", name: " + name + ", age: " + age);

}

cursor.close();

}

}

publicvoid testQuerySingleItem() {

Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/query/#");

// 在uri的末尾添加一个id content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/query/20

uri = ContentUris.withAppendedId(uri, 20);

//内容提供者访问对象

ContentResolver resolver = getContext().getContentResolver();

Cursor cursor = resolver.query(uri, new String[]{"_id", "name", "age"}, null, null, null);

if (cursor != null && cursor.moveToFirst()) {

int id = cursor.getInt(0);

String name = cursor.getString(1);

int age = cursor.getInt(2);

cursor.close();

Log.i(TAG, "id: " + id + ", name: " + name + ", age: " + age);

}

}

}

09_Android中ContentProvider和Sqllite混合操作,一个项目调用另外一个项目的ContentProvider的更多相关文章

  1. Eclipse中一个项目调用另一个项目的资源

    如果一个项目A想要引用另一个项目B的资源的话,按照一下步骤进行设置: 右键点击项目A---->>>Build Path--->>>Configure Build P ...

  2. vue中methods一个方法调用另外一个方法

    转自http://blog.csdn.net/zhangjing1019/article/details/77942923 vue在同一个组件内: methods中的一个方法调用methods中的另外 ...

  3. WinForm中一个窗体调用另一个窗体

    [转] WinForm中一个窗体调用另一个窗体的控件和事件的方法(附带源码) //如果想打开一个 Form2 的窗体类,只需要: Form2 form = new Form2(); //有没有参数得看 ...

  4. 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法

    参考原贴地址:https://blog.csdn.net/clementad/article/details/47339519 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Trans ...

  5. eclipse中一个项目引用另一个项目的方法(申明:来源于网络)

    eclipse中一个项目引用另一个项目的方法(申明:来源于网络) 地址:http://blog.csdn.net/a942980741/article/details/39990699

  6. 【转】在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法

    参考 原文链接 @Transactional does not work on method level 描述 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational) ...

  7. Android studio 一个项目引入另一个项目作为Libary

    1.在我们开发Android项目时,有时需要一个项目作为另一个项目的工具类的引用,这样就需要配置下,使得MyLibrary到MyApplication作为一个module. 我们直接截图上步骤: 1. ...

  8. C#一个窗体调用另一个窗体的方法

    一个窗体调用另一个窗体的方法:例如:窗体B要调用窗体A中的方法1.首先在窗体A中将窗体A设为静态窗体public static  FormA   m_formA; //设此窗体为静态,其他窗体可调用此 ...

  9. Qt一个project调用还有一个project的类成员变量

    一句两句话已经不能表达如今的激动情绪了.唯有感叹知识的博大精深,并把感叹转变为文字. 同一个project调用其它类成员变量很easy. 如: 定义 Test1.h中申明成员变量 class A { ...

随机推荐

  1. jQuery 效果 – 停止动画

    jQuery stop() 方法用于在动画或效果完成前对它们进行停止. 点击这里,向上/向下滑动面板 实例 jQuery stop() 滑动 演示 jQuery stop() 方法. jQuery s ...

  2. Openstack: Single node Installation and External Network Accessing Configuration Guide

    Summary of installation Step 0: Prerequisites Step 1: Create Openstack hostsystem Step 2: Config Ope ...

  3. Objective-C数据结构

    Objective-C数据结构 枚举 typedef enum { SexMan, SexWoman } Sex; 结构体 typedef struct { int year; int month; ...

  4. J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())

    J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())   当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...

  5. gloox配置聊天室

    gloox配置聊天室 (金庆的专栏) gloox是XMPP协议的C++客户端库.以下代码测试创建多人聊天室(MUC), 并进行配置.参照gloox中的muc示例代码.gloox代码示例中没有聊天室的配 ...

  6. weakref 待解决.

    暂时不知为何在控制台多执行一次b()后,del a就不会立即销毁Foo实例. >>> class Foo(object): def __init__(self): self.obj ...

  7. /proc/stat 详解

    在Linux系统中,可以用/proc/stat文件来计算cpu的利用率.这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻. cat /proc/stat cpu 6 ...

  8. 使用Apache的ab进行压力测试

    概述 ab是apache自带的压力测试工具,当安装完apache的时候,就可以在bin下面找到ab然后进行apache 负载压力测试. 后台测试开发中,常用的压力测试服务,php一般选择xampp,下 ...

  9. maven配置详解

    什么是pom?     pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的 ...

  10. Android 玩转IOC,Retfotit源码解析,教你徒手实现自定义的Retrofit框架

    CSDN:码小白 原文地址: http://blog.csdn.net/sk719887916/article/details/51957819 前言 Retrofit用法和介绍的文章实在是多的数不清 ...