读书人

ContentProvider-3最容易的

发布时间: 2012-09-21 15:47:26 作者: rapoo

ContentProvider-3最简单的
看完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. }??

读书人网 >移动开发

热点推荐