`

在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)

分享到:
评论

相关推荐

    content provider实现数据共享demo(内有两个项目)

    在这个"content provider实现数据共享demo"中,很可能会包含SQLite数据库的使用。SQLite是Android内置的关系型数据库,适用于存储应用的结构化数据。每个Content Provider往往与一个或多个数据库表相对应,通过SQL...

    编写content provider

    6. **使用ContentResolver**:在其他应用中,通过ContentResolver对象来与Content Provider交互,它提供了与Content Provider相同的接口,但无需直接实例化Content Provider。 在博客中提到的`BlackListProvider`...

    android content provider示例程序(简单记账)

    7. **使用Content Resolver**:在其他应用中,可以通过Content Resolver来与Content Provider交互,如`ContentResolver.query()`、`ContentResolver.insert()`等。 这个示例程序可以帮助开发者理解Content Provider...

    Android基础 Content Provider

    在Android开发中,Content Provider是一个至关重要的组件,它充当了应用程序间数据共享的桥梁。本文将深入探讨Content Provider的基本概念、创建方法、如何进行CRUD(Create、Read、Update、Delete)操作,以及如何...

    使用Content Provider案例

    4. **在其他应用中使用**:通过ContentResolver对象调用query(), insert(), update(), delete()方法,使用Uri指定Content Provider并进行操作。 通过这个案例,你可以学习到如何创建自己的Content Provider,实现跨...

    content provider 和sqllite用法整理

    4. **使用Content Provider**:在其他应用中,通过ContentResolver对象来与Content Provider交互,使用`query()`、`insert()`、`update()`和`delete()`方法,传递相应的URI来操作数据。 5. **权限控制**:为了保护...

    简单实现自己的Content Provider(一)

    5. **使用ContentResolver**:在其他应用中,通过ContentResolver对象与Content Provider交互。例如,查询数据: ```java ContentResolver resolver = getContentResolver(); Uri uri = Uri.parse("content://...

    Android学习之通过content provider获得联系人

    在Android系统中,Content Provider是一种核心组件,它负责在应用程序之间共享数据。这篇博客"Android学习之通过content provider获得联系人"将引导我们深入理解如何使用Content Provider来访问和操作设备上的联系人...

    android 自定义 Content Provider示例

    通过运行这个测试用例,你可以了解如何在实际项目中使用自定义的Content Provider进行数据交互。 总的来说,自定义Content Provider是Android应用间数据共享的重要方式,它通过标准化的接口使得数据操作变得简单且...

    自定义Content Provider

    本篇文章将详细探讨如何自定义Content Provider,以及它在实现数据共享中的作用。 首先,理解Content Provider的基本结构至关重要。一个Content Provider主要由以下几个部分组成: 1. **Provider类**:这是Content...

    content provider源码

    在Android系统中,Content Provider是四大组件之一,它充当了数据共享的桥梁,使得不同的应用程序之间可以安全地访问和操作彼此的数据。理解Content Provider的源码对于深入学习Android开发至关重要,因为它涉及到...

    Content-Provider-Kotlin

    【Content-Provider-Kotlin】是关于在Android应用中使用Kotlin实现Content Provider的教程或项目。Content Provider是Android系统中的四大组件之一,它主要用于在不同的应用程序之间共享数据。在这个项目中,我们将...

    自定义Provider demo

    这个例子可能包含了创建数据库表、处理Uri请求以及如何在其他应用中使用这个Provider的方法。对于初学者来说,这是一个很好的起点,可以深入理解Content Provider的工作原理以及如何在实际项目中应用。 总的来说,...

    应用源码之29.Content_Providers(1).zip

    你可以为不同的Uri模式注册代码值,然后在Content Provider中使用UriMatcher来解析Uri。 8. **ContentObserver**:ContentObserver允许一个应用监听Content Provider中的数据变化。当数据发生变化时,...

    Android应用源码之30.Content_Providers(2).zip

    7. **使用CursorLoader**:在主线程中直接使用`query()`方法可能会导致ANR(Application Not Responding)异常,因此,推荐在主线程中使用`CursorLoader`异步加载数据。`LoaderManager`和`Loader`框架可以很好地管理...

    应用源码之30.Content_Providers(2).zip

    通过分析和学习这些源码,可以加深对Content Provider工作原理的理解,提升在实际项目中使用Content Provider的能力。同时,了解如何通过Content Provider合理地管理数据,提高数据安全性和应用间的数据交互效率。

    Pro-Android-3 BookProvider SQLiteOpenHelper

    在实现`BookProvider`时,你需要配置AndroidManifest.xml文件,声明你的`Content Provider`,并指定对应的URI和数据表。同时,你还需要确保`BookProvider`正确地处理来自其他应用的请求,这涉及到权限控制,需要在`...

    notes-app-content-provider:使用Content Provider和SQLite数据库的Notes App Android

    通过研究"notes-app-content-provider-master"项目,开发者可以学习到如何在Android中有效地使用Content Provider和SQLite数据库进行数据管理,以及如何使用Kotlin进行Android开发。这个项目对于理解Android数据共享...

    Android应用源码之29.Content_Providers(1).zip

    在Content Provider中,数据通常是存储在SQLite数据库中的,因此你可能还会看到`SQLiteOpenHelper`类的使用,它负责数据库的创建、升级和版本管理。`SQLiteOpenHelper`的子类通常会定义SQL语句来创建表,并提供升级...

    android-simple-content-provider-app:简单的Android Content Provider使用示例

    本示例项目"android-simple-content-provider-app"是专门为初学者设计的,旨在讲解如何在Android应用程序中创建和使用一个基本的Content Provider。让我们深入探讨这个话题。 首先,Content Provider是Android系统...

Global site tag (gtag.js) - Google Analytics