0
点赞
收藏
分享

微信扫一扫

在Content provider实现中使用SQLiteOpenHelper


 

在前面的​​编写最简单的Content Provider​​的示例是很粗糙的,目的是让读者尽快了解怎样编写和使用Content provider。

其中一个事情是,如果重复启动该应用,会多次插入,产生重复的记录并显示到activity中。在上个例子中没有做处理,比如判断是否存在数据库等等。

Android为SQLite提供了便利的API,方便自动创建新的数据库或者升级数据库。其实本文的示例并不一定要在Content provider使用情况下,是在android sqlite编程下都可以用的。

android提供了这个类:

 



  1. android.database.sqlite.SQLiteOpenHelper


复制代码


有两个抽象方法需要继承以后实现:

 

 


1. public void onCreate(SQLiteDatabase database)
2.
3. public void onUpgrade(SQLiteDatabase database, int oldVersion,
4. int newVersion)


复制代码


其中第一个onCreate方法,在实现代码中要写出怎样创建你需要的数据库和表,以及一些初始数据。这实际上是个回调(callback),android会自动判断是否有该数据库,如果没有,就调用这个方法创建。onUpgrade方法,在这种情况下调用,你的应用中的sqlite数据库升级了,比如,表结构都发生了变化,那么android就会调用这个方法升级数据库。你需要实现这个方法,指出如何升级数据库,在下面示例中,是很简单的一种做法,就是删除就版本数据库,重新创建新版本的数据库。复杂的做法(也是平滑升级的做法)是,把旧数据库中的信息导入到新数据库中。程序依据​​编写最简单的Content Provider​​做了改动,只改动了MyContentProvider的代码:


1. package com.easymorse.cp;
2.
3. import android.content.ContentProvider;
4. import android.content.ContentValues;
5. import android.content.Context;
6. import android.database.Cursor;
7. import android.database.sqlite.SQLiteDatabase;
8. import android.database.sqlite.SQLiteOpenHelper;
9. import android.database.sqlite.SQLiteStatement;
10. import android.database.sqlite.SQLiteDatabase.CursorFactory;
11. import android.net.Uri;
12. import android.util.Log;
13.
14. public class MyContentProvider extends ContentProvider {

15.
16. public static final Uri CONTENT_URI = Uri
17. .parse("content://com.easymorse.cp.mycp");
18.
19. public static final String _ID = "id";
20.
21. public static final String NAME = "name";
22.
23. public static final String DYNASTY = "dynasty";
24.
25. public static final String START_YEAR = "start_year";
26.
27. private static SQLiteDatabase database;
28.
29. private static final int DATABASE_VERSION = 1;
30.
31. @Override
32. public int delete(Uri uri, String selection, String[] selectionArgs) {
33. return 0;
34. }
35.
36. @Override
37. public String getType(Uri uri) {
38. return null;
39. }
40.
41. @Override
42. public Uri insert(Uri uri, ContentValues contentValues) {
43. // TODO Auto-generated method stub
44. return null;
45. }
46.
47. @Override
48. public boolean onCreate() {
49. database = new MyDatabaseHelper(getContext(), "emperors", null,
50. DATABASE_VERSION).getWritableDatabase();
51. return database != null;
52. }
53.
54. @Override
55. public Cursor query(Uri uri, String[] projection, String selection,
56. String[] selectionArgs, String sortOrder) {
57. Cursor cursor = database.rawQuery("select * from emperors", null);
58. return cursor;
59. }
60.
61. @Override
62. public int update(Uri uri, ContentValues contentValues, String selection,
63. String[] selectionArgs) {
64. // TODO Auto-generated method stub
65. return 0;
66. }
67.
68. private static class MyDatabaseHelper extends SQLiteOpenHelper {

69.
70. public MyDatabaseHelper(Context context, String name,
71. CursorFactory factory, int version) {
72. super(context, name, factory, version);
73. }
74.
75. @Override
76. public void onCreate(SQLiteDatabase database) {
77. database.execSQL("create table if not exists emperors("
78. + " id integer primary key autoincrement," + " name text,"
79. + "dynasty text," + "start_year text" + ");");
80.
81. SQLiteStatement statement = database
82. .compileStatement("insert into emperors(name,dynasty,start_year) values(?,?,?)");
83. int index = 1;
84. statement.bindString(index++, "朱元璋");
85. statement.bindString(index++, "明");
86. statement.bindString(index++, "1398");
87. statement.execute();
88.
89. index = 1;
90. statement.bindString(index++, "玄烨");
91. statement.bindString(index++, "清");
92. statement.bindString(index++, "1722");
93. statement.execute();
94.
95. statement.close();
96. }
97.
98. @Override
99. public void onUpgrade(SQLiteDatabase database, int oldVersion,
100. int newVersion) {
101. Log.w("mycp", "updating database from version " + oldVersion
102. + " to " + newVersion);
103. database.execSQL("drop table if exists emperors");
104. onCreate(database);
105. }
106.
107. }
108.
109. }


复制代码


上面提到的bug就解决了。完整源代码见: <ignore_js_op style="word-wrap: break-word; ">

 ​​SQLiteOpenHelper(安卓巴士源码).rar​​ (48.03 KB, 下载次数: 74)

举报

相关推荐

Android 10 Content Provider 工作过程

0 条评论