我的理解:其实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. }