看完Google的文档,我终于自己写出了一个简单的ContentProvider,并且写了另一个工程去使用它,现总结如下:
一、创建一个ContentProvider必备:
1. Set up a system for storing the data,就是想好你用什么方式存储数据,你可以用任何你喜欢的方式存储,文件存储或SQLite数据库
2. Extend the ContentProvider class to provide access to the data.
3. Declare the content provider in the manifest file for your application (AndroidManifest.xml).就是写上类似这样的东西:
<provider android:name="LilyProvider" android:authorities="com.ianc.lilyprovider" />
二、写一个类继承自ContentProvider,并且使用一个继承自SQLiteOpenHelper的类去管理database以及table的创建。
三、将override所有的unimplemented方法,即:
query()
insert()
update()
delete()
getType()
onCreate()
四、需要写一个供使用者使用的类,这个类中必须公布给使用者用的CONTENT_URI,以及各个表的column名,并且最好用注释写好每个column的类型,以方便Provider的用户使用。例如我就写了一个类:
public class LilyUser {
public static class User{
public static final Uri CONTENT_URI = Uri.parse("content://com.ianc.lilyprovider/" + "customer");
}
public static class UserColumns implements BaseColumns{
public static String NAME = "name";
public static String PASSWORD = "password";
}
}这里面我就将整个类看成是一个database,然后里面User算成是一张表(其实表名是customer,这里名字还是没有命名好,应该一致的),而UserColumn则是这张表的所有column。这样的结构比较清晰易读。
五、在创建table的时候_ID很重要,文档中很明确说明了这一点:
1.Be sure to include an integer column named "_id" (with the constant _ID) for the IDs of the records.
2.假如设置了INTEGER PRIMARY KEY AUTOINCREMENT这个属性,那么不论数据库的数据是否被删除过,系统的id将一直增长,而假如不加AUTOINCREMENT这个属性,那么删除掉一条数据后空出的id,将在下一次新增数据时使用,例如有数据1,2,3条,现在删去第2条,再插入一条,那么新增的这一条id是2,假如设置了AUTOINCREMENT,那么则是4。
六、最后我想到一个方式如何在使用ContentProvider 的query时候去实现多表查询了,我想只要自己定义好uri的格式,然后在Provider的query里面去解析传来的uri,只要满足特定条件,就代表是多表查询就ok,这个方法我会下次试试。
我写了两个工程一个是LilyProvider,这个就是我写的ContentProvider了,另一个是TestLilyProvider,就是使用我写的这个provider啦。
附上主要的代码:
LilyUser.java:供Provider的使用者使用的类
view plaincopy to clipboardprint?
1. package com.ianc.lilyprovider;
2. import android.net.Uri;
3. import android.provider.BaseColumns;
4. public class LilyUser {
5.
6. public static class User{
7. public static final Uri CONTENT_URI = Uri.parse("content://com.ianc.lilyprovider/" + "customer");
8. }
9. public static class UserColumns implements BaseColumns{
10. public static String NAME = "name";
11. public static String PASSWORD = "password";
12. }
13. }
LilyProvider.java:一个简单粗暴的ContentProvider
view plaincopy to clipboardprint?
1. package com.ianc.lilyprovider;
2. import android.content.ContentProvider;
3. import android.content.ContentValues;
4. import android.content.Context;
5. import android.content.UriMatcher;
6. import android.database.Cursor;
7. import android.database.sqlite.SQLiteDatabase;
8. import android.database.sqlite.SQLiteOpenHelper;
9. import android.database.sqlite.SQLiteDatabase.CursorFactory;
10. import android.net.Uri;
11. import android.util.Log;
12. public class LilyProvider extends ContentProvider {
13. final String TABLE_NAME = "customer";
14. private static final String DATABASE_NAME = "lily.db";
15. private String AUTHORITY = "com.ianc.lilyprovider";
16. private static final int DATABASE_VERSION = 1;
17. DatabaseHelper mDbHelper;
18. static UriMatcher sUriMatcher;
19. static{
20. // sUriMatcher.addURI(AUTHORITY, path, code)
21. }
22. class DatabaseHelper extends SQLiteOpenHelper {
23. public DatabaseHelper(Context context) {
24. super(context, DATABASE_NAME, null, DATABASE_VERSION);
25. }
26. @Override
27. public void onCreate(SQLiteDatabase db) {
28. Log.i("lily","LilyProvider-->DatabaseHelper-->onCreate");
29. db.execSQL("Create table " + TABLE_NAME + "( " +
30. LilyUser.UserColumns._ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " +
31. LilyUser.UserColumns._COUNT + " INTEGER,"+
32. LilyUser.UserColumns.NAME + " TEXT," +
33. LilyUser.UserColumns.PASSWORD +" TEXT" +
34. ");");
35. }
36. @Override
37. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
38. Log.i("lily","LilyProvider-->DatabaseHelper-->onUpgrade");
39. db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME+";");
40. onCreate(db);
41. }
42.
43. }
44. @Override
45. public int delete(Uri arg0, String arg1, String[] arg2) {
46. Log.i("lily","LilyProvider-->delete");
47. SQLiteDatabase db = mDbHelper.getWritableDatabase();
48. int rownum = db.delete(TABLE_NAME, arg1, arg2);
49. return rownum;
50. }
51. @Override
52. public String getType(Uri uri) {
53. Log.i("lily","LilyProvider-->getType");
54. return null;
55. }
56. @Override
57. public Uri insert(Uri uri, ContentValues values) {
58. Log.i("lily","LilyProvider-->insert");
59. SQLiteDatabase db = mDbHelper.getWritableDatabase();
60. db.insert(TABLE_NAME, null, values);
61. return null;
62. }
63. @Override
64. public boolean onCreate() {
65. Log.i("lily","LilyProvider-->onCreate");
66. mDbHelper = new DatabaseHelper(this.getContext());
67. return false;
68. }
69. @Override
70. public Cursor query(Uri uri, String[] projection, String selection,
71. String[] selectionArgs, String sortOrder) {
72. Log.i("lily","LilyProvider-->query");
73. SQLiteDatabase db = mDbHelper.getReadableDatabase();
74. Cursor c = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
75. return c;
76. }
77. @Override
78. public int update(Uri uri, ContentValues values, String selection,
79. String[] selectionArgs) {
80. Log.i("lily","LilyProvider-->update");
81. SQLiteDatabase db = mDbHelper.getWritableDatabase();
82. int rownum = db.update(TABLE_NAME, values, selection, selectionArgs);
83. return rownum;
84. }
85. }
TestLilyProvider.java:例举一个简单的使用方法
view plaincopy to clipboardprint?
1. package com.ianc.testlilyprovider;
2. import com.ianc.lilyprovider.LilyUser;
3. import android.app.Activity;
4. import android.content.ContentUris;
5. import android.content.ContentValues;
6. import android.database.Cursor;
7. import android.net.Uri;
8. import android.os.Bundle;
9. import android.util.Log;
10. import android.view.View;
11. import android.view.View.OnClickListener;
12. import android.widget.Button;
13. public class TestLilyProvider extends Activity implements OnClickListener {
14. Button mQueryBtn;
15. Button mInsertBtn;
16. Button mUpdateBtn;
17. Button mDeleteBtn;
18. /** Called when the activity is first created. */
19. @Override
20. public void onCreate(Bundle savedInstanceState) {
21. super.onCreate(savedInstanceState);
22. setContentView(R.layout.main);
23. mQueryBtn = (Button)findViewById(R.id.query);
24. mInsertBtn = (Button)findViewById(R.id.insert);
25. mUpdateBtn = (Button)findViewById(R.id.update);
26. mDeleteBtn = (Button)findViewById(R.id.delete);
27.
28. mQueryBtn.setOnClickListener(this);
29. mInsertBtn.setOnClickListener(this);
30. mUpdateBtn.setOnClickListener(this);
31. mDeleteBtn.setOnClickListener(this);
32. }
33. @Override
34. public void onClick(View v) {
35. if (v == mQueryBtn){
36. query();
37. }
38. else if (v == mInsertBtn){
39. insert();
40. }
41. else if (v == mUpdateBtn){
42. update();
43. }
44. else if (v == mDeleteBtn){
45. delete();
46. }
47.
48. }
49. private void query() {
50. String[] projection = {LilyUser.UserColumns._ID, LilyUser.UserColumns.NAME, LilyUser.UserColumns.PASSWORD};
51. String selection = null;
52. String [] selectionArgs = {"lily"};
53. String sortOrder = null;
54.
55. Cursor cursor = getContentResolver().query(LilyUser.User.CONTENT_URI, projection, LilyUser.UserColumns.NAME +" = ?", selectionArgs, sortOrder);
56. if (cursor.moveToFirst()){
57. Log.i("lily","*********************************************");
58. String id;
59. String name;
60. String password;
61. do{
62. id = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns._ID));
63. Log.i("lily","id = "+id);
64.
65. name = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.NAME));
66. Log.i("lily","name = "+name);
67.
68. password = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.PASSWORD));
69. Log.i("lily","password = "+password);
70.
71. Log.i("lily","*********************************************");
72. }while(cursor.moveToNext());
73. }
74. else{
75. Log.i("lily","no result");
76. }
77. cursor.close();
78. }
79.
80. private void insert() {
81. ContentValues values = new ContentValues();
82. values.put(LilyUser.UserColumns.NAME, "lily");
83. values.put(LilyUser.UserColumns.PASSWORD, "19870528");
84. getContentResolver().insert(LilyUser.User.CONTENT_URI, values);
85. }
86.
87. private void update() {
88. ContentValues values = new ContentValues();
89. values.put(LilyUser.UserColumns.NAME, "lily");
90. values.put(LilyUser.UserColumns.PASSWORD, "ljy19870528");
91. String[] selectionArgs = {"lily"};
92. int num = getContentResolver().update(LilyUser.User.CONTENT_URI, values, LilyUser.UserColumns.NAME +" = ?", selectionArgs);
93. Log.i("lily",num + " rows be updated");
94. }
95.
96. private void delete() {
97. String[] selectionArgs = {"lily"};
98. int num = getContentResolver().delete(LilyUser.User.CONTENT_URI, LilyUser.UserColumns.NAME +" = ?", selectionArgs);
99. Log.i("lily",num+" rows be deleted");
100.
101. }
102. }
一、创建一个ContentProvider必备:
1. Set up a system for storing the data,就是想好你用什么方式存储数据,你可以用任何你喜欢的方式存储,文件存储或SQLite数据库
2. Extend the ContentProvider class to provide access to the data.
3. Declare the content provider in the manifest file for your application (AndroidManifest.xml).就是写上类似这样的东西:
<provider android:name="LilyProvider" android:authorities="com.ianc.lilyprovider" />
二、写一个类继承自ContentProvider,并且使用一个继承自SQLiteOpenHelper的类去管理database以及table的创建。
三、将override所有的unimplemented方法,即:
query()
insert()
update()
delete()
getType()
onCreate()
四、需要写一个供使用者使用的类,这个类中必须公布给使用者用的CONTENT_URI,以及各个表的column名,并且最好用注释写好每个column的类型,以方便Provider的用户使用。例如我就写了一个类:
public class LilyUser {
public static class User{
public static final Uri CONTENT_URI = Uri.parse("content://com.ianc.lilyprovider/" + "customer");
}
public static class UserColumns implements BaseColumns{
public static String NAME = "name";
public static String PASSWORD = "password";
}
}这里面我就将整个类看成是一个database,然后里面User算成是一张表(其实表名是customer,这里名字还是没有命名好,应该一致的),而UserColumn则是这张表的所有column。这样的结构比较清晰易读。
五、在创建table的时候_ID很重要,文档中很明确说明了这一点:
1.Be sure to include an integer column named "_id" (with the constant _ID) for the IDs of the records.
2.假如设置了INTEGER PRIMARY KEY AUTOINCREMENT这个属性,那么不论数据库的数据是否被删除过,系统的id将一直增长,而假如不加AUTOINCREMENT这个属性,那么删除掉一条数据后空出的id,将在下一次新增数据时使用,例如有数据1,2,3条,现在删去第2条,再插入一条,那么新增的这一条id是2,假如设置了AUTOINCREMENT,那么则是4。
六、最后我想到一个方式如何在使用ContentProvider 的query时候去实现多表查询了,我想只要自己定义好uri的格式,然后在Provider的query里面去解析传来的uri,只要满足特定条件,就代表是多表查询就ok,这个方法我会下次试试。
我写了两个工程一个是LilyProvider,这个就是我写的ContentProvider了,另一个是TestLilyProvider,就是使用我写的这个provider啦。
附上主要的代码:
LilyUser.java:供Provider的使用者使用的类
view plaincopy to clipboardprint?
1. package com.ianc.lilyprovider;
2. import android.net.Uri;
3. import android.provider.BaseColumns;
4. public class LilyUser {
5.
6. public static class User{
7. public static final Uri CONTENT_URI = Uri.parse("content://com.ianc.lilyprovider/" + "customer");
8. }
9. public static class UserColumns implements BaseColumns{
10. public static String NAME = "name";
11. public static String PASSWORD = "password";
12. }
13. }
LilyProvider.java:一个简单粗暴的ContentProvider
view plaincopy to clipboardprint?
1. package com.ianc.lilyprovider;
2. import android.content.ContentProvider;
3. import android.content.ContentValues;
4. import android.content.Context;
5. import android.content.UriMatcher;
6. import android.database.Cursor;
7. import android.database.sqlite.SQLiteDatabase;
8. import android.database.sqlite.SQLiteOpenHelper;
9. import android.database.sqlite.SQLiteDatabase.CursorFactory;
10. import android.net.Uri;
11. import android.util.Log;
12. public class LilyProvider extends ContentProvider {
13. final String TABLE_NAME = "customer";
14. private static final String DATABASE_NAME = "lily.db";
15. private String AUTHORITY = "com.ianc.lilyprovider";
16. private static final int DATABASE_VERSION = 1;
17. DatabaseHelper mDbHelper;
18. static UriMatcher sUriMatcher;
19. static{
20. // sUriMatcher.addURI(AUTHORITY, path, code)
21. }
22. class DatabaseHelper extends SQLiteOpenHelper {
23. public DatabaseHelper(Context context) {
24. super(context, DATABASE_NAME, null, DATABASE_VERSION);
25. }
26. @Override
27. public void onCreate(SQLiteDatabase db) {
28. Log.i("lily","LilyProvider-->DatabaseHelper-->onCreate");
29. db.execSQL("Create table " + TABLE_NAME + "( " +
30. LilyUser.UserColumns._ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " +
31. LilyUser.UserColumns._COUNT + " INTEGER,"+
32. LilyUser.UserColumns.NAME + " TEXT," +
33. LilyUser.UserColumns.PASSWORD +" TEXT" +
34. ");");
35. }
36. @Override
37. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
38. Log.i("lily","LilyProvider-->DatabaseHelper-->onUpgrade");
39. db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME+";");
40. onCreate(db);
41. }
42.
43. }
44. @Override
45. public int delete(Uri arg0, String arg1, String[] arg2) {
46. Log.i("lily","LilyProvider-->delete");
47. SQLiteDatabase db = mDbHelper.getWritableDatabase();
48. int rownum = db.delete(TABLE_NAME, arg1, arg2);
49. return rownum;
50. }
51. @Override
52. public String getType(Uri uri) {
53. Log.i("lily","LilyProvider-->getType");
54. return null;
55. }
56. @Override
57. public Uri insert(Uri uri, ContentValues values) {
58. Log.i("lily","LilyProvider-->insert");
59. SQLiteDatabase db = mDbHelper.getWritableDatabase();
60. db.insert(TABLE_NAME, null, values);
61. return null;
62. }
63. @Override
64. public boolean onCreate() {
65. Log.i("lily","LilyProvider-->onCreate");
66. mDbHelper = new DatabaseHelper(this.getContext());
67. return false;
68. }
69. @Override
70. public Cursor query(Uri uri, String[] projection, String selection,
71. String[] selectionArgs, String sortOrder) {
72. Log.i("lily","LilyProvider-->query");
73. SQLiteDatabase db = mDbHelper.getReadableDatabase();
74. Cursor c = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
75. return c;
76. }
77. @Override
78. public int update(Uri uri, ContentValues values, String selection,
79. String[] selectionArgs) {
80. Log.i("lily","LilyProvider-->update");
81. SQLiteDatabase db = mDbHelper.getWritableDatabase();
82. int rownum = db.update(TABLE_NAME, values, selection, selectionArgs);
83. return rownum;
84. }
85. }
TestLilyProvider.java:例举一个简单的使用方法
view plaincopy to clipboardprint?
1. package com.ianc.testlilyprovider;
2. import com.ianc.lilyprovider.LilyUser;
3. import android.app.Activity;
4. import android.content.ContentUris;
5. import android.content.ContentValues;
6. import android.database.Cursor;
7. import android.net.Uri;
8. import android.os.Bundle;
9. import android.util.Log;
10. import android.view.View;
11. import android.view.View.OnClickListener;
12. import android.widget.Button;
13. public class TestLilyProvider extends Activity implements OnClickListener {
14. Button mQueryBtn;
15. Button mInsertBtn;
16. Button mUpdateBtn;
17. Button mDeleteBtn;
18. /** Called when the activity is first created. */
19. @Override
20. public void onCreate(Bundle savedInstanceState) {
21. super.onCreate(savedInstanceState);
22. setContentView(R.layout.main);
23. mQueryBtn = (Button)findViewById(R.id.query);
24. mInsertBtn = (Button)findViewById(R.id.insert);
25. mUpdateBtn = (Button)findViewById(R.id.update);
26. mDeleteBtn = (Button)findViewById(R.id.delete);
27.
28. mQueryBtn.setOnClickListener(this);
29. mInsertBtn.setOnClickListener(this);
30. mUpdateBtn.setOnClickListener(this);
31. mDeleteBtn.setOnClickListener(this);
32. }
33. @Override
34. public void onClick(View v) {
35. if (v == mQueryBtn){
36. query();
37. }
38. else if (v == mInsertBtn){
39. insert();
40. }
41. else if (v == mUpdateBtn){
42. update();
43. }
44. else if (v == mDeleteBtn){
45. delete();
46. }
47.
48. }
49. private void query() {
50. String[] projection = {LilyUser.UserColumns._ID, LilyUser.UserColumns.NAME, LilyUser.UserColumns.PASSWORD};
51. String selection = null;
52. String [] selectionArgs = {"lily"};
53. String sortOrder = null;
54.
55. Cursor cursor = getContentResolver().query(LilyUser.User.CONTENT_URI, projection, LilyUser.UserColumns.NAME +" = ?", selectionArgs, sortOrder);
56. if (cursor.moveToFirst()){
57. Log.i("lily","*********************************************");
58. String id;
59. String name;
60. String password;
61. do{
62. id = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns._ID));
63. Log.i("lily","id = "+id);
64.
65. name = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.NAME));
66. Log.i("lily","name = "+name);
67.
68. password = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.PASSWORD));
69. Log.i("lily","password = "+password);
70.
71. Log.i("lily","*********************************************");
72. }while(cursor.moveToNext());
73. }
74. else{
75. Log.i("lily","no result");
76. }
77. cursor.close();
78. }
79.
80. private void insert() {
81. ContentValues values = new ContentValues();
82. values.put(LilyUser.UserColumns.NAME, "lily");
83. values.put(LilyUser.UserColumns.PASSWORD, "19870528");
84. getContentResolver().insert(LilyUser.User.CONTENT_URI, values);
85. }
86.
87. private void update() {
88. ContentValues values = new ContentValues();
89. values.put(LilyUser.UserColumns.NAME, "lily");
90. values.put(LilyUser.UserColumns.PASSWORD, "ljy19870528");
91. String[] selectionArgs = {"lily"};
92. int num = getContentResolver().update(LilyUser.User.CONTENT_URI, values, LilyUser.UserColumns.NAME +" = ?", selectionArgs);
93. Log.i("lily",num + " rows be updated");
94. }
95.
96. private void delete() {
97. String[] selectionArgs = {"lily"};
98. int num = getContentResolver().delete(LilyUser.User.CONTENT_URI, LilyUser.UserColumns.NAME +" = ?", selectionArgs);
99. Log.i("lily",num+" rows be deleted");
100.
101. }
102. }
发表评论
-
startActivityForResult 简介
2011-03-29 15:55 1284依次打开Activity A1--A2--A3--A4 这时 ... -
startActivityForResult
2011-03-29 15:49 1146startActivityForResult 方法-- ... -
史上最全的Android的Tab与TabHost讲解
2011-03-28 11:22 1591Tab与TabHost 这就是Tab,而盛放Tab的 ... -
Android对话框
2011-03-25 11:21 1125Android 对话框(Dialog)大全 ... -
PreferenceActivity详解
2011-03-25 11:15 1442为了引入这个概率 首先从需求说起 即:现有某Activity专 ... -
TCP/UDP/HTTP
2011-03-25 11:09 1125先来一个讲TCP、UDP和HTTP ... -
9png
2011-03-25 11:08 1914今天学习了用9png图来优化横屏竖屏的UI,使用sdk自带的工 ... -
Notification
2011-03-25 11:07 939Android系统的状态栏(Status Bar)中有一个创新 ... -
一些技巧
2011-03-25 11:03 7871:查看是否有存储卡插入 String status=Envi ... -
布局像素单位
2011-03-25 11:03 827Android的layout文件中有时候可能会指定具体的单位, ... -
使用ActivityGroup来切换Activity和Layout
2011-03-25 11:02 1135在一个主界面中做Activity切换一般都会用TabActiv ... -
activitygroup
2011-03-25 11:01 1730说说tabhost和activitygroup 最近 ... -
线程
2011-03-25 11:01 1014今天在论坛上看到一些关于线程的帖子,我觉得与我理解的有些差异, ... -
类级框架
2011-03-25 11:00 744类集框架:Collection,Map,Iterator,En ... -
Intent打电话
2011-03-25 11:00 1217intent英文意思是意图,pending表示即将发生或来临的 ... -
Intent Uri
2011-03-25 10:59 1068进入联系人页面 1.Intent intent = new I ... -
Service
2011-03-25 10:59 940一、Service的概念 Service是Android程序中 ... -
Broadcast Receiver
2011-03-25 10:56 1948一、Broadcast Receiver简介 Android中 ... -
ContentProvider MIME类型
2011-03-25 10:55 1238Android程序的主要4部分 ... -
ContentProvider-1查询
2011-03-25 10:55 1237今天看了android的官方文档中ContentProvide ...
相关推荐
3. CRUD操作:ContentProvider支持增(Create)、删(Delete)、查(Query)、改(Update)四种基本操作,这些操作通过ContentResolver对象来调用。 二、创建自定义ContentProvider 1. 继承:自定义...
在这个简单的例子中,我们将探讨如何自定义ContentProvider来实现数据共享。 首先,创建一个ContentProvider需要继承`android.content.ContentProvider`类,并重写其中的关键方法: 1. `onCreate()`: 当...
总之,结合 `SharedPreferences` 和 `ContentProvider` 可以实现简单的数据共享,但在实际项目中,根据数据类型和量级,可能需要考虑使用SQLite数据库或更专业的数据存储解决方案。在设计时,应充分权衡性能、效率和...
了解了基本原理后,我们可以通过一个简单的例子来实践创建ContentProvider。假设我们要创建一个存储学生信息的ContentProvider,首先定义Uri,如`content://com.example.provider/students`,然后创建名为`...
在"ContentProvider Demo"项目中,你可能会看到一个具体的ContentProvider实现,它可能模拟了一个简单的数据存储,如联系人或者任务列表。通过查看代码,你可以学习如何将数据存储在SQLite数据库中,然后通过...
它是Android系统提供的一种轻量级的数据存储方式,用于存储简单的键值对数据,如布尔值、整数、浮点数、字符串等。通常,`SharedPreferences`被用于应用内部的数据持久化,但若要跨应用共享数据,就需要借助`...
以下是一个简单的自定义ContentProvider示例: ```java public class MyProvider extends ContentProvider { private static final String AUTHORITY = "com.example.myprovider"; private static final ...
3. **读取图片**:重写`query`方法,通过输入的URI获取到图片的路径,然后使用`ParcelFileDescriptor`打开文件并读取内容。可以使用`BitmapFactory`来解码图片,确保在后台线程执行以避免阻塞UI。 4. **异步加载**...
以下是一个简单的获取所有图片的示例代码: ```java ContentResolver resolver = getContentResolver(); Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Cursor cursor = resolver.query(uri, null, ...
Android基于ContentProvider的音乐播放器,通过读取系统多媒体信息,得到储存在外部...该版本只是完成了一个音乐播放器的最简单功能,界面不炫酷,也没有特殊功能.主要用于参考学习Android系统功能强大的ContentProvider.
以下是一个简单的示例,演示如何获取通讯录中的联系人信息: ```java // 获取ContentResolver实例 ContentResolver resolver = getContentResolver(); // 定义查询的Uri,通常为ContactsContract.Contacts.CONTENT...
接下来,我们详细讲解如何创建一个简单的ContentProvider。 1. **定义Uri**:首先,确定你的ContentProvider要处理的URI模式,例如`content://com.example.myapp.provider/mydata`,其中`...
接下来,我们将创建一个简单的ContentProvider示例: 1. 首先,定义UriMatcher,为不同的操作添加匹配规则,如: ``` UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); matcher.addURI(...
它遵循统一的接口,使得数据操作如同操作SQLite数据库一样简单。在AndroidManifest.xml文件中,我们需要声明ContentProvider,通过`<provider>`标签指定ContentProvider的类名和授权(authority)。 **授权...
Android应用主要由Activity、Intent、Service、BroadcastReceiver和ContentProvider等组件构成。在这个DEMO中,我们关注的是Activity,它是用户界面的主要载体。 1. **布局设计**:登录界面通常包含用户名输入框...
- **简化调用**:通过提供简单的API,开发者无需深入了解ContentProvider底层实现,只需关注业务逻辑。 - **扩展性**:方便添加新的数据表或功能,只需扩展相应的类即可,不会影响原有结构。 4. **如何创建一个...
- **Provider类**:继承自`ContentProvider`抽象类,实现其生命周期方法和数据操作方法,如`query()`, `insert()`, `update()`, `delete()`。 - **UriMatcher**:用于匹配URI,确定要执行的操作。 - **...
ShareInProvider 虽然使用多进程增加了程序的内存空间,但是也有些负面的影响。 比如: 使用很多第三方lib扩展额外...使用ContentProvider传递一些简单的基础变量,重新开辟一条AIDL通道,经测试,确实稳定高效很多。
除此之外,课程设计还会涉及到安卓应用的生命周期、活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)和内容提供者(ContentProvider)这四大组件的使用和管理。学生需要通过实践了解如何在不同的应用...
对于简单的留言板应用,SQLite可能是最合适的,因为它允许我们以结构化方式存储数据,支持查询操作。 4. **SQLite数据库**:在Android中,使用SQLiteOpenHelper子类创建和管理数据库。我们需要创建一个表,包含字段...