我的理解:其实ContentProvider的机制很随意,它就类似于一个服务器一样,你把uri传来,只要按照特定的方式,它就能给你特定的功能,我觉得这个机制自由又方便。
其实这两个功能主要通过修改query就可以,完整的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.net.Uri;
10. import android.util.Log;
11. public class LilyProvider extends ContentProvider {
12. final static String TABLE_NAME = "customer";
13. final static String PRODUCT_TABLE = "shoplist";
14. private static final String DATABASE_NAME = "lily.db";
15. private static String AUTHORITY = "com.ianc.lilyprovider";
16. private static final int DATABASE_VERSION = 1;
17.
18. DatabaseHelper mDbHelper;
19. static UriMatcher sUriMatcher;
20. private static final int USER = 1;
21. private static final int USER_NAME = 2;
22. private static final int MULITABLE = 3;
23. private static final int SHOPLIST = 4;
// 传入匹配码如果大于0表示匹配根路径或传入-1,即常量UriMatcher.NO_MATCH表示不匹配根路径
// addURI()方法是用来增加其他URI匹配路径的:
// 第一个参数代表传入标识ContentProvider的AUTHORITY字符串
// 第二个参数是要匹配的路径,#代表任意数字,另外还可以用*来匹配任意文本
// 第三个参数必须传入一个大于零的匹配码,用于match()方法对相匹配的URI返回相对应的匹配码
24. static{
25. sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
26. sUriMatcher.addURI(AUTHORITY, TABLE_NAME, USER);
27. sUriMatcher.addURI(AUTHORITY, PRODUCT_TABLE, SHOPLIST);
28. sUriMatcher.addURI(AUTHORITY, TABLE_NAME+"/"+LilyUser.UserColumns.NAME+"/*", USER_NAME);//search special user by name
29. sUriMatcher.addURI(AUTHORITY, TABLE_NAME+"/*", MULITABLE);
30. }
31. //内部类
32. class DatabaseHelper extends SQLiteOpenHelper {
33. public DatabaseHelper(Context context) {
34. super(context, DATABASE_NAME, null, DATABASE_VERSION);
35. }
36. @Override
37. public void onCreate(SQLiteDatabase db) {
38. Log.i("lily","LilyProvider-->DatabaseHelper-->onCreate");
39. db.execSQL("Create table " + TABLE_NAME + "( " +
40. LilyUser.UserColumns._ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " +
41. LilyUser.UserColumns._COUNT + " INTEGER,"+
42. LilyUser.UserColumns.NAME + " TEXT," +
43. LilyUser.UserColumns.PASSWORD +" TEXT" +
44. ");");
45. db.execSQL("Create table " + PRODUCT_TABLE + "( " +
46. LilyUser.ShopListColumns._ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " +
47. LilyUser.ShopListColumns._COUNT + " INTEGER,"+
48. LilyUser.ShopListColumns.USER_ID+" INTEGER,"+
49. LilyUser.ShopListColumns.PRODUCT + " TEXT," +
50. LilyUser.ShopListColumns.DATE +" TEXT" +
51. ");");
52. }
53. @Override
54. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
55. Log.i("lily","LilyProvider-->DatabaseHelper-->onUpgrade");
56. db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME+";");
57. db.execSQL("DROP TABLE IF EXISTS "+PRODUCT_TABLE+";");
58. onCreate(db);
59. }
60.
61. }
62. @Override
63. public int delete(Uri arg0, String arg1, String[] arg2) {
64. Log.i("lily","LilyProvider-->delete");
65. SQLiteDatabase db = mDbHelper.getWritableDatabase();
66. int rownum = db.delete(TABLE_NAME, arg1, arg2);
67. return rownum;
68. }
69. @Override
70. public String getType(Uri uri) {
71. Log.i("lily","LilyProvider-->getType");
72. return null;
73. }
74. @Override
75. public Uri insert(Uri uri, ContentValues values) {
76. Log.i("lily","LilyProvider-->insert");
77. if (sUriMatcher.match(uri) == USER){
78. SQLiteDatabase db = mDbHelper.getWritableDatabase();
79. db.insert(TABLE_NAME, null, values);
80. }
81. else if (sUriMatcher.match(uri) == SHOPLIST){
82. SQLiteDatabase db = mDbHelper.getWritableDatabase();
83. db.insert(PRODUCT_TABLE, null, values);
84. }
85.
86. return null;
87. }
88. @Override
89. public boolean onCreate() {
90. Log.i("lily","LilyProvider-->onCreate");
91. mDbHelper = new DatabaseHelper(this.getContext());
92. return false;
93. }
94. @Override
95. public Cursor query(Uri uri, String[] projection, String selection,
96. String[] selectionArgs, String sortOrder) {
97. Log.i("lily","LilyProvider-->query");
98. Log.i("lily","uri = "+uri);
99. Log.i("lily","sUriMatcher.match(uri)="+sUriMatcher.match(uri));
100. Cursor c = null;
101. if (sUriMatcher.match(uri) == USER){
102. SQLiteDatabase db = mDbHelper.getReadableDatabase();
103. c = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
104. }else if (sUriMatcher.match(uri) == USER_NAME){
105.
106. // format:authority/table/column/value-->0:table 1:column 2:value
107. String name = uri.getPathSegments().get(2);// get name value
108. Log.i("lily","query table:"+uri.getPathSegments().get(0)+" column:"+uri.getPathSegments().get(1)+" value:"+uri.getPathSegments().get(2));
109. SQLiteDatabase db = mDbHelper.getReadableDatabase();
110. if (selection != null){
111. if (selection.length()>0){
112. selection += "AND "+LilyUser.UserColumns.NAME+" like "+name;
113. }
114. }
115. c = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
116. }else if (sUriMatcher.match(uri) == MULITABLE){
117. // format:authority/table1/table2 *******
118. String table1 = uri.getPathSegments().get(0);
119. String table2 = uri.getPathSegments().get(1);
120.
121. Log.i("lily","table1 = "+table1);
122. Log.i("lily","table2 = "+table2);
123.
124. if (table1.equalsIgnoreCase(TABLE_NAME)){
125. if (table2.equals(PRODUCT_TABLE)){
126. SQLiteDatabase db = mDbHelper.getReadableDatabase();
127. if (selection != null){
128. if (selection.length()>0){
129. selection += "AND "+LilyUser.UserColumns._ID+" = "+LilyUser.ShopListColumns.USER_ID;
130. }
131. else{
132. selection = LilyUser.UserColumns._ID+" = "+LilyUser.ShopListColumns.USER_ID;
133. }
134. }
135. else
136. {
137. selection = TABLE_NAME + "." +LilyUser.UserColumns._ID+" = "+PRODUCT_TABLE + "." + LilyUser.ShopListColumns.USER_ID;
138. }
139. c = db.query(table1+" cross join "+table2, projection, null, selectionArgs, null, null, sortOrder);
140. }
141. }
142. }
143.
144. return c;
145. }
146. @Override
147. public int update(Uri uri, ContentValues values, String selection,
148. String[] selectionArgs) {
149. Log.i("lily","LilyProvider-->update");
150. SQLiteDatabase db = mDbHelper.getWritableDatabase();
151. int rownum = db.update(TABLE_NAME, values, selection, selectionArgs);
152. return rownum;
153. }
154. }
这个里面定义Uri格式的时候一定要小心,不然出错了死都查不出来。
下面是使用查询的方法:
view plaincopy to clipboardprint?
1. private void queryNameUri() {
2. Uri uri = Uri.withAppendedPath(LilyUser.User.CONTENT_URI, "name/lily");//content://com.ianc.lilyprovider/customer/name/lily
3. String[] projection = {LilyUser.UserColumns._ID, LilyUser.UserColumns.NAME, LilyUser.UserColumns.PASSWORD};
4. String selection = null;
5. String [] selectionArgs = null;
6. String sortOrder = null;
7. Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
8. if (cursor == null){
9. Log.i("lily","cursor == null");
10. return;
11. }
12. if (cursor.moveToFirst()){
13. Log.i("lily","*********************************************");
14. String id;
15. String name;
16. String password;
17. do{
18. id = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns._ID));
19. Log.i("lily","id = "+id);
20.
21. name = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.NAME));
22. Log.i("lily","name = "+name);
23.
24. password = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.PASSWORD));
25. Log.i("lily","password = "+password);
26.
27. Log.i("lily","*********************************************");
28. }while(cursor.moveToNext());
29. }
30. else{
31. Log.i("lily","no result");
32. }
33. cursor.close();
34. }
多表查询:
view plaincopy to clipboardprint?
1. private void queryMultiTable() {
2. String[] projection = {"customer."+LilyUser.UserColumns._ID, "customer."+LilyUser.UserColumns.NAME, "customer."+LilyUser.UserColumns.PASSWORD,
3. "shoplist."+LilyUser.ShopListColumns.USER_ID, "shoplist."+LilyUser.ShopListColumns.PRODUCT, "shoplist."+LilyUser.ShopListColumns.DATE};
4. String selection = null;
5. String [] selectionArgs = null;
6. String sortOrder = null;
7. Uri uri = Uri.withAppendedPath(LilyUser.User.CONTENT_URI, "shoplist");
8. Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
9. if (cursor == null){
10. Log.i("lily","queryMultiTable()-->cursor == null");
11. return;
12. }
13. if (cursor.moveToFirst()){
14. Log.i("lily","*********************************************");
15. String id;
16. String name;
17. String password;
18. String user_id;
19. String product;
20. String date;
21. do{
22. id = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns._ID));
23. Log.i("lily","id = "+id);
24.
25. name = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.NAME));
26. Log.i("lily","name = "+name);
27.
28. password = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.PASSWORD));
29. Log.i("lily","password = "+password);
30.
31. user_id = cursor.getString(cursor.getColumnIndex(LilyUser.ShopListColumns.USER_ID));
32. Log.i("lily","user_id = "+user_id);
33.
34. product = cursor.getString(cursor.getColumnIndex(LilyUser.ShopListColumns.PRODUCT));
35. Log.i("lily","product = " + product);
36.
37. date = cursor.getString(cursor.getColumnIndex(LilyUser.ShopListColumns.DATE));
38. Log.i("lily","date = " + date);
39.
40. Log.i("lily","*********************************************");
41. }while(cursor.moveToNext());
42. }
43. else{
44. Log.i("lily","no result");
45. }
46. cursor.close();
47. }
接下来是LilyUser这个说明类的代码:
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.
14. public static class ShopList{
15. public static final Uri CONTENT_URI = Uri.parse("content://com.ianc.lilyprovider/" + "shoplist");
16. }
17. public static class ShopListColumns implements BaseColumns{
18. public static String USER_ID = "user_id";
19. public static String PRODUCT = "product";
20. public static String DATE = "date";
21. }
22. }
其实这两个功能主要通过修改query就可以,完整的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.net.Uri;
10. import android.util.Log;
11. public class LilyProvider extends ContentProvider {
12. final static String TABLE_NAME = "customer";
13. final static String PRODUCT_TABLE = "shoplist";
14. private static final String DATABASE_NAME = "lily.db";
15. private static String AUTHORITY = "com.ianc.lilyprovider";
16. private static final int DATABASE_VERSION = 1;
17.
18. DatabaseHelper mDbHelper;
19. static UriMatcher sUriMatcher;
20. private static final int USER = 1;
21. private static final int USER_NAME = 2;
22. private static final int MULITABLE = 3;
23. private static final int SHOPLIST = 4;
// 传入匹配码如果大于0表示匹配根路径或传入-1,即常量UriMatcher.NO_MATCH表示不匹配根路径
// addURI()方法是用来增加其他URI匹配路径的:
// 第一个参数代表传入标识ContentProvider的AUTHORITY字符串
// 第二个参数是要匹配的路径,#代表任意数字,另外还可以用*来匹配任意文本
// 第三个参数必须传入一个大于零的匹配码,用于match()方法对相匹配的URI返回相对应的匹配码
24. static{
25. sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
26. sUriMatcher.addURI(AUTHORITY, TABLE_NAME, USER);
27. sUriMatcher.addURI(AUTHORITY, PRODUCT_TABLE, SHOPLIST);
28. sUriMatcher.addURI(AUTHORITY, TABLE_NAME+"/"+LilyUser.UserColumns.NAME+"/*", USER_NAME);//search special user by name
29. sUriMatcher.addURI(AUTHORITY, TABLE_NAME+"/*", MULITABLE);
30. }
31. //内部类
32. class DatabaseHelper extends SQLiteOpenHelper {
33. public DatabaseHelper(Context context) {
34. super(context, DATABASE_NAME, null, DATABASE_VERSION);
35. }
36. @Override
37. public void onCreate(SQLiteDatabase db) {
38. Log.i("lily","LilyProvider-->DatabaseHelper-->onCreate");
39. db.execSQL("Create table " + TABLE_NAME + "( " +
40. LilyUser.UserColumns._ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " +
41. LilyUser.UserColumns._COUNT + " INTEGER,"+
42. LilyUser.UserColumns.NAME + " TEXT," +
43. LilyUser.UserColumns.PASSWORD +" TEXT" +
44. ");");
45. db.execSQL("Create table " + PRODUCT_TABLE + "( " +
46. LilyUser.ShopListColumns._ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " +
47. LilyUser.ShopListColumns._COUNT + " INTEGER,"+
48. LilyUser.ShopListColumns.USER_ID+" INTEGER,"+
49. LilyUser.ShopListColumns.PRODUCT + " TEXT," +
50. LilyUser.ShopListColumns.DATE +" TEXT" +
51. ");");
52. }
53. @Override
54. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
55. Log.i("lily","LilyProvider-->DatabaseHelper-->onUpgrade");
56. db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME+";");
57. db.execSQL("DROP TABLE IF EXISTS "+PRODUCT_TABLE+";");
58. onCreate(db);
59. }
60.
61. }
62. @Override
63. public int delete(Uri arg0, String arg1, String[] arg2) {
64. Log.i("lily","LilyProvider-->delete");
65. SQLiteDatabase db = mDbHelper.getWritableDatabase();
66. int rownum = db.delete(TABLE_NAME, arg1, arg2);
67. return rownum;
68. }
69. @Override
70. public String getType(Uri uri) {
71. Log.i("lily","LilyProvider-->getType");
72. return null;
73. }
74. @Override
75. public Uri insert(Uri uri, ContentValues values) {
76. Log.i("lily","LilyProvider-->insert");
77. if (sUriMatcher.match(uri) == USER){
78. SQLiteDatabase db = mDbHelper.getWritableDatabase();
79. db.insert(TABLE_NAME, null, values);
80. }
81. else if (sUriMatcher.match(uri) == SHOPLIST){
82. SQLiteDatabase db = mDbHelper.getWritableDatabase();
83. db.insert(PRODUCT_TABLE, null, values);
84. }
85.
86. return null;
87. }
88. @Override
89. public boolean onCreate() {
90. Log.i("lily","LilyProvider-->onCreate");
91. mDbHelper = new DatabaseHelper(this.getContext());
92. return false;
93. }
94. @Override
95. public Cursor query(Uri uri, String[] projection, String selection,
96. String[] selectionArgs, String sortOrder) {
97. Log.i("lily","LilyProvider-->query");
98. Log.i("lily","uri = "+uri);
99. Log.i("lily","sUriMatcher.match(uri)="+sUriMatcher.match(uri));
100. Cursor c = null;
101. if (sUriMatcher.match(uri) == USER){
102. SQLiteDatabase db = mDbHelper.getReadableDatabase();
103. c = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
104. }else if (sUriMatcher.match(uri) == USER_NAME){
105.
106. // format:authority/table/column/value-->0:table 1:column 2:value
107. String name = uri.getPathSegments().get(2);// get name value
108. Log.i("lily","query table:"+uri.getPathSegments().get(0)+" column:"+uri.getPathSegments().get(1)+" value:"+uri.getPathSegments().get(2));
109. SQLiteDatabase db = mDbHelper.getReadableDatabase();
110. if (selection != null){
111. if (selection.length()>0){
112. selection += "AND "+LilyUser.UserColumns.NAME+" like "+name;
113. }
114. }
115. c = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
116. }else if (sUriMatcher.match(uri) == MULITABLE){
117. // format:authority/table1/table2 *******
118. String table1 = uri.getPathSegments().get(0);
119. String table2 = uri.getPathSegments().get(1);
120.
121. Log.i("lily","table1 = "+table1);
122. Log.i("lily","table2 = "+table2);
123.
124. if (table1.equalsIgnoreCase(TABLE_NAME)){
125. if (table2.equals(PRODUCT_TABLE)){
126. SQLiteDatabase db = mDbHelper.getReadableDatabase();
127. if (selection != null){
128. if (selection.length()>0){
129. selection += "AND "+LilyUser.UserColumns._ID+" = "+LilyUser.ShopListColumns.USER_ID;
130. }
131. else{
132. selection = LilyUser.UserColumns._ID+" = "+LilyUser.ShopListColumns.USER_ID;
133. }
134. }
135. else
136. {
137. selection = TABLE_NAME + "." +LilyUser.UserColumns._ID+" = "+PRODUCT_TABLE + "." + LilyUser.ShopListColumns.USER_ID;
138. }
139. c = db.query(table1+" cross join "+table2, projection, null, selectionArgs, null, null, sortOrder);
140. }
141. }
142. }
143.
144. return c;
145. }
146. @Override
147. public int update(Uri uri, ContentValues values, String selection,
148. String[] selectionArgs) {
149. Log.i("lily","LilyProvider-->update");
150. SQLiteDatabase db = mDbHelper.getWritableDatabase();
151. int rownum = db.update(TABLE_NAME, values, selection, selectionArgs);
152. return rownum;
153. }
154. }
这个里面定义Uri格式的时候一定要小心,不然出错了死都查不出来。
下面是使用查询的方法:
view plaincopy to clipboardprint?
1. private void queryNameUri() {
2. Uri uri = Uri.withAppendedPath(LilyUser.User.CONTENT_URI, "name/lily");//content://com.ianc.lilyprovider/customer/name/lily
3. String[] projection = {LilyUser.UserColumns._ID, LilyUser.UserColumns.NAME, LilyUser.UserColumns.PASSWORD};
4. String selection = null;
5. String [] selectionArgs = null;
6. String sortOrder = null;
7. Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
8. if (cursor == null){
9. Log.i("lily","cursor == null");
10. return;
11. }
12. if (cursor.moveToFirst()){
13. Log.i("lily","*********************************************");
14. String id;
15. String name;
16. String password;
17. do{
18. id = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns._ID));
19. Log.i("lily","id = "+id);
20.
21. name = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.NAME));
22. Log.i("lily","name = "+name);
23.
24. password = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.PASSWORD));
25. Log.i("lily","password = "+password);
26.
27. Log.i("lily","*********************************************");
28. }while(cursor.moveToNext());
29. }
30. else{
31. Log.i("lily","no result");
32. }
33. cursor.close();
34. }
多表查询:
view plaincopy to clipboardprint?
1. private void queryMultiTable() {
2. String[] projection = {"customer."+LilyUser.UserColumns._ID, "customer."+LilyUser.UserColumns.NAME, "customer."+LilyUser.UserColumns.PASSWORD,
3. "shoplist."+LilyUser.ShopListColumns.USER_ID, "shoplist."+LilyUser.ShopListColumns.PRODUCT, "shoplist."+LilyUser.ShopListColumns.DATE};
4. String selection = null;
5. String [] selectionArgs = null;
6. String sortOrder = null;
7. Uri uri = Uri.withAppendedPath(LilyUser.User.CONTENT_URI, "shoplist");
8. Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
9. if (cursor == null){
10. Log.i("lily","queryMultiTable()-->cursor == null");
11. return;
12. }
13. if (cursor.moveToFirst()){
14. Log.i("lily","*********************************************");
15. String id;
16. String name;
17. String password;
18. String user_id;
19. String product;
20. String date;
21. do{
22. id = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns._ID));
23. Log.i("lily","id = "+id);
24.
25. name = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.NAME));
26. Log.i("lily","name = "+name);
27.
28. password = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.PASSWORD));
29. Log.i("lily","password = "+password);
30.
31. user_id = cursor.getString(cursor.getColumnIndex(LilyUser.ShopListColumns.USER_ID));
32. Log.i("lily","user_id = "+user_id);
33.
34. product = cursor.getString(cursor.getColumnIndex(LilyUser.ShopListColumns.PRODUCT));
35. Log.i("lily","product = " + product);
36.
37. date = cursor.getString(cursor.getColumnIndex(LilyUser.ShopListColumns.DATE));
38. Log.i("lily","date = " + date);
39.
40. Log.i("lily","*********************************************");
41. }while(cursor.moveToNext());
42. }
43. else{
44. Log.i("lily","no result");
45. }
46. cursor.close();
47. }
接下来是LilyUser这个说明类的代码:
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.
14. public static class ShopList{
15. public static final Uri CONTENT_URI = Uri.parse("content://com.ianc.lilyprovider/" + "shoplist");
16. }
17. public static class ShopListColumns implements BaseColumns{
18. public static String USER_ID = "user_id";
19. public static String PRODUCT = "product";
20. public static String DATE = "date";
21. }
22. }
发表评论
-
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 ...
相关推荐
4. **权限管理** - 因为涉及到敏感数据,读取和写入联系人信息通常需要申请相应的权限,如`<uses-permission android:name="android.permission.READ_CONTACTS" />`和`<uses-permission android:name="android....
4. **权限控制**:为了保护数据的安全性,可以通过在AndroidManifest.xml中设置权限,限制其他应用对ContentProvider的访问。 在本Demo中,我们假设有一个简单的任务列表应用,数据存储在SQLite数据库中,我们将...
#### 4. 文件I/O操作 除了上述机制,Android还提供了基本的文件I/O操作,如读写文件。这主要通过`FileInputStream`和`FileOutputStream`类实现。开发者可以通过`Context`对象的`openFileInput()`和`openFileOutput...
总结,创建一个支持多表的ContentProvider,需要设计好数据库结构,实现SQLiteOpenHelper子类,注册ContentProvider,定义URI模式,并在ContentProvider中处理多表的CRUD操作。同时,利用ContentResolver进行数据...
ContentProvider通常会有一个或多个Uri来表示不同类型的数据。 6. **CursorLoader和LoaderManager**:在异步加载数据时,Loader和LoaderManager是非常有用的工具。它们可以处理数据的加载和更新,避免阻塞主线程,...
本示例着重讲解如何创建一个针对单一数据库表的ContentProvider,帮助初学者理解其工作原理和使用方法。 首先,我们要明白ContentProvider的基本结构。ContentProvider继承自android.content.ContentProvider类,...
本教程将深入讲解ContentProvider的使用方法,包括基础操作、多ContentProvider管理和多表操作。 首先,基础的ContentProvider用法涉及以下几个步骤: 1. **定义Uri匹配规则**:ContentProvider通过Uri(统一资源...
4. ContentProvider ContentProvider 是 Android 中的一种机制,用于在不同的应用程序之间共享数据。ContentProvider 提供了一个统一的接口,用于访问和操作数据,使得不同的应用程序可以访问和操作同一份数据。 *...
4. 权限控制: - 如果ContentProvider需要特定权限才能访问,可以在AndroidManifest.xml中添加 `<permission>` 和 `<uses-permission>` 标签来设定和请求权限。 - 当ContentProvider设置为 exported=true 时,其他...
4. **权限控制**:为了保护数据安全,可以通过在AndroidManifest.xml中为ContentProvider设置权限,限制只有具有特定权限的应用才能访问。例如,`<provider>`标签中的`android:exported`属性决定是否允许其他应用...
在上述代码中,`User`是数据库中的一个表,`UserDao`定义了操作用户数据的方法,`AppDatabase`是数据库的抽象类,Room会根据这个类自动生成SQLite数据库。 接下来,我们谈谈ContentProvider。ContentProvider是...
4. **ContentResolver与ContentProvider的交互** - 应用程序通过ContentResolver与ContentProvider进行交互,无需直接实例化ContentProvider。 - 使用`ContentResolver.query(Uri uri, String[] projection, ...
4. ContentProvider 将数据返回给请求方 ContentProvider 的优点 ------------------------- 使用 ContentProvider 有以下几个优点: * 实现跨程序共享数据 * 保证数据安全性 * 提高应用程序之间的数据共享效率 ...
2. **ID 字段**:为了支持更高效的数据定位和操作,ContentProvider 建议在数据表中包含一个 `_id` 字段,该字段通常被定义为 `INTEGER PRIMARY KEY AUTOINCREMENT` 类型,以自动生成唯一的标识符。 3. **多进程...
同时,合理利用ContentProvider,可以提高应用间的协同能力和用户体验,尤其是在需要在多个应用间共享同一数据源的情况下。但要注意,ContentProvider的使用也需谨慎,避免过度暴露数据,确保应用的安全性。
4. **使用ContentResolver**:在需要访问数据的地方,通过ContentResolver调用上述ContentProvider中的方法。ContentResolver是应用与ContentProvider之间的桥梁,它封装了与ContentProvider交互的细节。 在...
4. **使用ContentProvider步骤** - **注册ContentProvider**:在AndroidManifest.xml中添加provider标签,设置authority和对应的类。 - **定义UriMatcher**:创建UriMatcher对象,用于匹配不同的Uri请求,返回对应...
4. 示例代码展示了如何在其他应用中通过ContentResolver访问ContentProvider提供的文件。 通过学习和实践这个案例,你可以更好地理解ContentProvider在文件操作和跨应用通信中的应用。同时,也可以根据需求扩展...
2. **定义URI**:ContentProvider通过URI来识别数据,因此需要定义一个或多个URI模式。通常,使用`UriMatcher`工具类来匹配不同的URI请求。 3. **实现数据操作**:在重写的`query()`、`insert()`、`update()`、`...
ContentProvider是Android系统中...总的来说,掌握ContentProvider是开发Android应用不可或缺的一部分,尤其是当你需要在多个应用间共享数据时。这个视频教程将帮助你深入了解这一关键组件,提升你的Android开发技能。