在Content provider实现中使用SQLiteOpenHelper

33
回复
616000
查看
[复制链接]

206

主题

1622

帖子

2721

安币

Android大神

Rank: 6Rank: 6

发表于 2011-11-10 10:40:31 | 显示全部楼层 |阅读模式

在前面的编写最简单的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. public void onUpgrade(SQLiteDatabase database, int oldVersion,
  3.                 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.         @Override
  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.         @Override
  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就解决了。完整源代码见:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

0

主题

22

帖子

20

安币

初级码农

Rank: 1

发表于 2012-4-16 15:10:38 | 显示全部楼层
顶个先

0

主题

39

帖子

32

安币

程序猿

Rank: 2

发表于 2012-5-24 20:04:33 | 显示全部楼层
顶{:soso_e100:}

0

主题

54

帖子

33

安币

初级码农

Rank: 1

发表于 2012-5-25 11:52:42 | 显示全部楼层
我要顶起来

0

主题

54

帖子

33

安币

初级码农

Rank: 1

发表于 2012-5-25 12:11:32 | 显示全部楼层
这个导入后没效果啊

0

主题

54

帖子

-1

安币

限制会员

发表于 2012-5-28 14:42:00 | 显示全部楼层
支持{:4_136:}

2

主题

35

帖子

36

安币

程序猿

Rank: 2

发表于 2012-6-23 18:19:57 | 显示全部楼层
{:soso__18271301420761994125_1:}

0

主题

251

帖子

33

安币

初级码农

Rank: 1

发表于 2012-6-29 23:46:21 | 显示全部楼层
学习一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )