09_Android中ContentProvider和Sqllite混合操作,一个项目调用另外一个项目的ContentProvider

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

}

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-23 15:30:16

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

关于一个解决方案中两个项目,一个项目调用另一个项目的文件

在看一个比较大的项目时, 一个解决方案中有多个项目,比如一个是写好的项目,一个是测试项目,那么怎么从测试项目调用另一个项目的文件呢? 具体解决方案如下: 打开测试项目的属性页:附加包含目录 然后填入你上一个项目源文件所在路径(如果项目须移动时前面加上..\) 接下来就可以调用上一个项目的文件了

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

如果一个项目A想要引用另一个项目B的资源的话,按照一下步骤进行设置: 右键点击项目A---->>>Build Path--->>>Configure Build Path...--->>>在弹出的对话框中选择Projects选项卡--->>>点击Add--->>>选择项目B进行添加. 备注: 如果项目A关联了项目B,再使用项目B关联项目A,那么项目A和项目B上就会显示红色的感叹号表示警告.

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

在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的. 比如,下面代码例子中,有两方法,一个有@Transational注解,一个没有.如果调用了有注解的addPerson()方法,会启动一个Transaction:如果调用updatePersonByPhoneNo(),因为它内部调用了有注解的addPerson(),如果你以为系统也会为它启动一个Transaction,那就错了,实际上是没有的. @Service public cla

一个Activity调用另一个Activity的非静态方法

注意:前提是界面二被打开过未关闭,则用此方法即可实现在界面一中调用界面二的方法! 界面一: public class OneActivity extends Activity { @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_one); callTwoActivityMethod(); } /

从一个应用调用另一个应用的Activity(已知包名)

最近要用到从一个应用调用另一个应用的Activity,我封装了一个方法,直接调用这个方法就可以,前提是要知道要调用应用的包名. 以下是实现方法的代码: 1 2 /** 3 * 根据包名调用app 4 * @param packageName 5 */ 6 public void openApp(String packageName) { 7 PackageInfo pi; 8 try { 9 pi = getPackageManager().getPackageInfo(packageName,

eclipse中一个项目引用另一个项目的方法

有时候我们一个项目会依赖于另一个项目的类库和资源,如下图项目pds-prrs依赖于pds-fw和pds-srv中的类和包 想要在pds-prrs中引入其他两个项目的方法为: 右键pds-prrs->build path->configure build path->project选项卡->.点击add,将另外两个项目加入即可 效果如下

Qt一个工程调用另一个工程的类成员变量

一句两句话已经不能表达现在的激动情绪了,唯有感叹知识的博大精深,并把感叹转变为文字. 同一个工程调用其他类成员变量非常简单. 如: 定义 Test1.h中申明成员变量 class A { public: double m_fTest; }; Test1.cpp中改变成员变量的值. m_fTest = 265.78; 然后再类B中调用类A的成员变量m_fTest,并需求类A中改变该值时,类B中也要随之改变: 调用方法:包涵类A的头文件 #include "test1.h" 然后在调用处声

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

Unity 一个脚本调用另一个脚本的函数

假设两个分别为A和B,分别挂有脚本AScript和BScript,现在想让BScript调用(A的脚本)AScript中的FollowMe()函数. using UnityEngine;using System.Collections; public class BScript : MonoBehaviour{ AScript AComponent; void Function() { AComponent.FollowMe(); } } 注:在编辑器里把A拖到B对象的BScript的AComp