当前位置: 代码迷 >> SQL >> 在Content provider兑现中使用SQLiteOpenHelper
  详细解决方案

在Content provider兑现中使用SQLiteOpenHelper

热度:46   发布时间:2016-05-05 12:25:42.0
在Content provider实现中使用SQLiteOpenHelper

来自:http://www.apkbus.com/android-16353-1-1.html

?

在前面的编写最简单的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. import android.content.ContentProvider;?
  3. import android.content.ContentValues;?
  4. import android.content.Context;?
  5. import android.database.Cursor;?
  6. import android.database.sqlite.SQLiteDatabase;?
  7. import android.database.sqlite.SQLiteOpenHelper;?
  8. import android.database.sqlite.SQLiteStatement;?
  9. import android.database.sqlite.SQLiteDatabase.CursorFactory;?
  10. import android.net.Uri;?
  11. import android.util.Log;
  12. public class MyContentProvider extends ContentProvider {
  13. ? ? public static final Uri CONTENT_URI = Uri?
  14. ? ?? ?? ?? ?.parse("content://com.easymorse.cp.mycp");
  15. ? ? public static final String _ID = "id";
  16. ? ? public static final String NAME = "name";
  17. ? ? public static final String DYNASTY = "dynasty";
  18. ? ? public static final String START_YEAR = "start_year";
  19. ? ? private static SQLiteDatabase database;
  20. ? ? private static final int DATABASE_VERSION = 1;
  21. ? ? @Override?
  22. ? ? public int delete(Uri uri, String selection, String[] selectionArgs) {?
  23. ? ?? ???return 0;?
  24. ? ? }
  25. ? ? @Override?
  26. ? ? public String getType(Uri uri) {?
  27. ? ?? ???return null;?
  28. ? ? }
  29. ? ? @Override?
  30. ? ? public Uri insert(Uri uri, ContentValues contentValues) {?
  31. ? ?? ???// TODO Auto-generated method stub?
  32. ? ?? ???return null;?
  33. ? ? }
  34. ? ? @Override?
  35. ? ? public boolean onCreate() {?
  36. ? ?? ???database = new MyDatabaseHelper(getContext(), "emperors", null,?
  37. ? ?? ?? ?? ?? ? DATABASE_VERSION).getWritableDatabase();?
  38. ? ?? ???return database != null;?
  39. ? ? }
  40. ? ? @Override?
  41. ? ? public Cursor query(Uri uri, String[] projection, String selection,?
  42. ? ?? ?? ?? ?String[] selectionArgs, String sortOrder) {?
  43. ? ?? ???Cursor cursor = database.rawQuery("select * from emperors", null);?
  44. ? ?? ???return cursor;?
  45. ? ? }
  46. ? ? @Override?
  47. ? ? public int update(Uri uri, ContentValues contentValues, String selection,?
  48. ? ?? ?? ?? ?String[] selectionArgs) {?
  49. ? ?? ???// TODO Auto-generated method stub?
  50. ? ?? ???return 0;?
  51. ? ? }
  52. ? ? private static class MyDatabaseHelper extends SQLiteOpenHelper {
  53. ? ?? ???public MyDatabaseHelper(Context context, String name,?
  54. ? ?? ?? ?? ?? ? CursorFactory factory, int version) {?
  55. ? ?? ?? ?? ?super(context, name, factory, version);?
  56. ? ?? ???}
  57. ? ?? [email protected]
  58. ? ?? ???public void onCreate(SQLiteDatabase database) {?
  59. ? ?? ?? ?? ?database.execSQL("create table if not exists emperors("?
  60. ? ?? ?? ?? ?? ?? ???+ " id integer primary key autoincrement," + " name text,"?
  61. ? ?? ?? ?? ?? ?? ???+ "dynasty text," + "start_year text" + ");");
  62. ? ?? ?? ?? ?SQLiteStatement statement = database?
  63. ? ?? ?? ?? ?? ?? ???.compileStatement("insert into emperors(name,dynasty,start_year) values(?,?,?)");?
  64. ? ?? ?? ?? ?int index = 1;?
  65. ? ?? ?? ?? ?statement.bindString(index++, "朱元璋");?
  66. ? ?? ?? ?? ?statement.bindString(index++, "明");?
  67. ? ?? ?? ?? ?statement.bindString(index++, "1398");?
  68. ? ?? ?? ?? ?statement.execute();
  69. ? ?? ?? ?? ?index = 1;?
  70. ? ?? ?? ?? ?statement.bindString(index++, "玄烨");?
  71. ? ?? ?? ?? ?statement.bindString(index++, "清");?
  72. ? ?? ?? ?? ?statement.bindString(index++, "1722");?
  73. ? ?? ?? ?? ?statement.execute();
  74. ? ?? ?? ?? ?statement.close();?
  75. ? ?? ???}
  76. ? ?? [email protected]
  77. ? ?? ???public void onUpgrade(SQLiteDatabase database, int oldVersion,?
  78. ? ?? ?? ?? ?? ? int newVersion) {?
  79. ? ?? ?? ?? ?Log.w("mycp", "updating database from version " + oldVersion?
  80. ? ?? ?? ?? ?? ?? ???+ " to " + newVersion);?
  81. ? ?? ?? ?? ?database.execSQL("drop table if exists emperors");?
  82. ? ?? ?? ?? ?onCreate(database);?
  83. ? ?? ???}
  84. ? ? }
  85. }
复制代码

上面提到的bug就解决了。完整源代码见:?<ignore_js_op style="word-wrap: break-word; ">?SQLiteOpenHelper(安卓巴士源码).rar?(48.03 KB, 下载次数: 74)

  相关解决方案