`

在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.         @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就解决了。完整源代码见: <ignore_js_op style="word-wrap: break-word; "> SQLiteOpenHelper(安卓巴士源码).rar (48.03 KB, 下载次数: 74)

分享到:
评论

相关推荐

    android-content-provider-sample:实施Android内容提供商的示例

    android-content-provider-sample 这是一个Android示例应用程序,显示了如何使用内容提供程序。 它管理着一个简单的人名数据库。 PeopleActivity在ListView中显示所有名称,而EditPersonActivity允许您编辑一个人...

    ContentProvider

    &lt;provider android:name=".provider" android:authorities="com.example.tigongzhe.provider" android:multiprocess="true" android:exported="true" android:permission="com.example.tigongzhe.permission" ...

    Android开发与应用——张荣,原书配套课件

    6.5.1 使用Content Provider发布数据 6.5.2 使用Content Resolver获取数据 6.6 小结 练习 第7章 多线程及消息处理 7.1 Android多线程概述 7.1.1 创建线程 7.1.2 操作线程 7.2 UI线程与非UI线程 7.3...

    OPhone应用开发权威指南(黄晓庆)

    6.4.4 Content Provider更新的通知机制 267 6.4.5 DAO接口及实现 269 6.4.6 在新线程内处理数据 270 6.5 小结 273 第7章 移动多媒体编程 274 7.1 多媒体文件格式与编码 274 7.1.1 多媒体文件格式 274 7.1.2 编码 275...

    Android移动平台的客户关系管理系统

    通过这个项目的学习,使学员掌握Android平台中的ListView、Activity、 Activity的跳转、Button、TextView、EditView、Adatper和...SQLiteOpenHelper和Content Provider等技术,并能掌握adb等Android调试 工具的使用。

    Android移动平台语音导航系统

    通过这个项目学习,使学员掌握Android平台中的MapActivity、Menu 、 Button、TextView、EditView、Adatper和Dialog等有关UI技术,GPS...SQLiteOpenHelper和Content Provider等技术。掌握adb等Android调试工具 的使用。

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    5.5 自制日历手机数据库——实现SQLiteOpenHelper 5.6 手机震动的节奏——Vibrator对象及周期运用 5.7 图文可视化提醒——Toast与LinearLayoutView 5.8 状态栏的图标与文字提醒——NotificationManager与...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    5.5 自制日历手机数据库——实现SQLiteOpenHelper 5.6 手机震动的节奏——Vibrator对象及周期运用 5.7 图文可视化提醒——Toast与LinearLayoutView 5.8 状态栏的图标与文字提醒——NotificationManager与...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    5.5 自制日历手机数据库——实现SQLiteOpenHelper 5.6 手机震动的节奏——Vibrator对象及周期运用 5.7 图文可视化提醒——Toast与LinearLayoutView 5.8 状态栏的图标与文字提醒——NotificationManager与...

    Google Android SDK开发范例大全(完整版附部分源码).pdf

    5.5 自制日历手机数据库——实现SQLiteOpenHelper 5.6 手机震动的节奏——Vibrator对象及周期运用 5.7 图文可视化提醒——Toast与LinearLayoutView 5.8 状态栏的图标与文字提醒——NotificationManager与...

    Google Android SDK开发范例大全的目录

    5.5 自制日历手机数据库——实现SQLiteOpenHelper 5.6 手机震动的节奏——Vibrator对象及周期运用 5.7 图文可视化提醒——Toast与LinearLayoutView 5.8 状态栏的图标与文字提醒——NotificationManager与...

    Google+Android+SDK开发范例大全

    拨打电话——Intent.ACTION.CALL的使用 5.3 自制发送短信程序——SmsManager与PendingIntent对象 5.4 自制发送Email程序——Intent在Email上的使用 5.5 自制日历手机数据库——实现SQLiteOpenHelper 5.6 手机震动的...

    Google Android sdk 开发范例大全 部分章节代码

    5.5 自制日历手机数据库——实现SQLiteOpenHelper 5.6 手机震动的节奏——Vibrator对象及周期运用 5.7 图文可视化提醒——Toast与LinearLayoutView 5.8 状态栏的图标与文字提醒——NotificationManager与...

    Google Android SDK 开发范例大全01

    5.5 自制日历手机数据库——实现SQLiteOpenHelper 5.6 手机震动的节奏——Vibrator对象及周期运用 5.7 图文可视化提醒——Toast与LinearLayoutView 5.8 状态栏的图标与文字提醒——NotificationManager与...

    Google Android SDK 开发范例大全02

    5.5 自制日历手机数据库——实现SQLiteOpenHelper 5.6 手机震动的节奏——Vibrator对象及周期运用 5.7 图文可视化提醒——Toast与LinearLayoutView 5.8 状态栏的图标与文字提醒——NotificationManager与...

    Google Android SDK开发范例大全(完整版)

    5.5 自制日历手机数据库——实现SQLiteOpenHelper 5.6 手机震动的节奏——Vibrator对象及周期运用 5.7 图文可视化提醒——Toast与LinearLayoutView 5.8 状态栏的图标与文字提醒——NotificationManager与...

    安卓数据库操作案例

    android database example, such as ContentProvider, AsyncQueryHandler, SQLiteOpenHelper, etc.

Global site tag (gtag.js) - Google Analytics