首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

ContentProvider-四多表

2013-11-08 
ContentProvider-4多表我的理解:其实ContentProvider的机制很随意,它就类似于一个服务器一样,你把uri传来,

ContentProvider-4多表
我的理解:其实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. }??

热点排行