Android四大组件之ContentProvider使用实例
来源:互联网 发布:知达常青藤中学校官网 编辑:程序博客网 时间:2024/05/29 00:30
1、创建数据库管理类,并创建所需的表和数据
package com.cx.datastored;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "Users.db"; private static final int DATABASE_VERSION= 1; private static final String TABLE_NAME= "User";public MyDatabaseHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {//创建用于存储数据的表 db.execSQL("Create table " + TABLE_NAME + "( _id INTEGER PRIMARY KEY AUTOINCREMENT, USER_NAME TEXT);");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db);}}2、创建一个类,定义uri并存储用户名称并显示所有的用户名称(使用 SQLLite数据库存储这些数据)
import android.net.Uri;import android.provider.BaseColumns;public class MyUsers {public static final String AUTHORITY = "com.cx.datastored.MyContentProvider"; //BaseColumn类中已经包含了 _id字段public static final class User implements BaseColumns {//定义uri public static final Uri CONTENT_URI = Uri.parse("content://com.cx.datastored.MyContentProvider"); // 表数据列 public static final String USER_NAME = "USER_NAME"; }}
3、重写ContentProvider,完成自己的MyContentProvider,这里只做了插入和查询功能
import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentValues;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteQueryBuilder;import android.net.Uri;public class MyContentProvider extends ContentProvider {private SQLiteDatabase sqlDB; private MyDatabaseHelper dbHelper; private static final String TABLE_NAME= "User";@Overridepublic int delete(Uri arg0, String arg1, String[] arg2) {//根据Uri删除arg1指定的条件所匹配的全部记录return 0;}@Overridepublic String getType(Uri arg0) {//返回当前Uri的MIME类型,如果该URI对应的数据可能包含多条记录,那么MIME类型字符串就是以vnd.android.dir开头//如果该URI对应的数据只有一条,该MIME类型字符串就是以vnd..android.cursor.item开头return null;}@Overridepublic Uri insert(Uri arg0, ContentValues arg1) {//根据Uri插入arg1对应的数据sqlDB = dbHelper.getWritableDatabase(); long rowId = sqlDB.insert(TABLE_NAME, "", arg1); if (rowId > 0) { Uri rowUri = ContentUris.appendId(MyUsers.User.CONTENT_URI.buildUpon(), rowId).build(); getContext().getContentResolver().notifyChange(rowUri, null); return rowUri; } throw new SQLException("Failed to insert row into " + arg0);}@Overridepublic boolean onCreate() {// 在ContentProvider创建后被调用 dbHelper = new MyDatabaseHelper(getContext()); return (dbHelper == null) ? false : true;}@Overridepublic Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,String arg4) {//根据Uri查询出arg2指定的条件所匹配的全部记录,并且可以指定查询那些列,以什么方式(arg4)排序SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); SQLiteDatabase db = dbHelper.getReadableDatabase(); qb.setTables(TABLE_NAME); Cursor c = qb.query(db, arg1, arg2, null, null, null, arg4); c.setNotificationUri(getContext().getContentResolver(), arg0); return c;}@Overridepublic int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {//根据Uri修改arg2指定的条件所匹配的全部记录return 0;}}4、 在AndroidMenifest.xml中使用<provider>标签来设置ContentProvider
<provider android:exported="true" android:name="com.cx.datastored.MyContentProvider" android:authorities="com.cx.datastored.MyContentProvider" ></provider>注:android:exported="true"如果不设置,在本应用中访问数据时正常,但在其他应用中访问时就会出现异常。
5、在本应用中测试
package com.cx.mycontentdemo;import android.annotation.SuppressLint;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.widget.Toast;public class MainActivity extends Activity {@SuppressLint("SdCardPath")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);insertRecord("user"); displayRecords();}private void insertRecord(String userName) {ContentValues values = new ContentValues(); values.put(MyUsers.User.USER_NAME, userName); getContentResolver().insert(MyUsers.User.CONTENT_URI, values); }private void displayRecords() { ContentResolver cr = getContentResolver(); String columns[] = new String[] { MyUsers.User._ID, MyUsers.User.USER_NAME }; Uri myUri = MyUsers.User.CONTENT_URI; Cursor cur = cr.query(myUri, columns, null, null, null); if (cur.moveToFirst()) { String id = null; String userName = null; do { id = cur.getString(cur.getColumnIndex(MyUsers.User._ID)); userName = cur.getString(cur.getColumnIndex(MyUsers.User.USER_NAME)); Toast.makeText(this, id + " " + userName, Toast.LENGTH_LONG).show(); } while (cur.moveToNext()); } }}6、在其他应用中测试,这里需要新建一个工程。
1)新建工程中创建一个与上面2相同的类
import android.net.Uri;import android.provider.BaseColumns;public class MyUsers {public static final String AUTHORITY = "com.cx.datastored.MyContentProvider"; //BaseColumn类中已经包含了 _id字段public static final class User implements BaseColumns {//定义uri public static final Uri CONTENT_URI = Uri.parse("content://com.cx.datastored.MyContentProvider"); // 表数据列 public static final String USER_NAME = "USER_NAME"; }}2)测试代码也与5相同,只是他们是不同的应用
package com.cx.mycontentdemo;import android.annotation.SuppressLint;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.widget.Toast;public class MainActivity extends Activity {@SuppressLint("SdCardPath")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);insertRecord("user"); displayRecords();}private void insertRecord(String userName) {ContentValues values = new ContentValues(); values.put(MyUsers.User.USER_NAME, userName); getContentResolver().insert(MyUsers.User.CONTENT_URI, values); }private void displayRecords() { ContentResolver cr = getContentResolver(); String columns[] = new String[] { MyUsers.User._ID, MyUsers.User.USER_NAME }; Uri myUri = MyUsers.User.CONTENT_URI; Cursor cur = cr.query(myUri, columns, null, null, null); if (cur.moveToFirst()) { String id = null; String userName = null; do { id = cur.getString(cur.getColumnIndex(MyUsers.User._ID)); userName = cur.getString(cur.getColumnIndex(MyUsers.User.USER_NAME)); Toast.makeText(this, id + " " + userName, Toast.LENGTH_LONG).show(); } while (cur.moveToNext()); } }}源码下载
测试应用源码
注意:只有在先运行了上面的应用后,再运行测试应用源码才会看到效果。
由于ContentProvider的主要用途是不同应用间的数据共享,所以在开发时很少会用到。例如,一个公司的一系列产品中的的某些数据需要相互使用。
文章参考:http://www.cnblogs.com/devinzhang/archive/2012/01/20/2327863.html
0 0
- Android四大组件之ContentProvider使用实例
- Android四大组件之ContentProvider
- android四大组件之ContentProvider
- android四大组件之 ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- android 四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- android四大组件之ContentProvider
- android四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之~~ContentProvider
- Android 四大组件之ContentProvider
- Android四大组件之ContentProvider
- API 与 ABI 的具体含义
- MFC屏蔽esc键盘消息
- Windows平台下Pin的编译
- 【PHP】进一法取整、四舍五入取整、忽略小数等的取整数方法大全
- c++类
- Android四大组件之ContentProvider使用实例
- 二叉平衡树的实现,AVL平衡树的实现与分析及测试
- Design Pattern--Singleton
- MFC中的类及函数
- ruby截取字符串
- Maven单元测试
- Apache+Tomcat+mod_proxy集群
- Jump Game
- js函数定义方式(包括嵌套,对象等)