`

SQLiteOpenHelper, SQLiteDatabase, ContentProvider

 
阅读更多
SQLiteOpenHelper SQLiteDatabase ContentProvider三者的关系 http://lzd20021683.iteye.com/blog/1277108
android之sqliteDatabase,sqliteOpenHelper,ContentProvider http://wang7839186.iteye.com/blog/1038880

SQLiteOpenHelper类
synchronized void close()
Close any open database object.
synchronized SQLiteDatabase getReadableDatabase()
Create and/or open a database.
synchronized SQLiteDatabase getWritableDatabase()
Create and/or open a database that will be used for reading and writing.
abstract void onCreate(SQLiteDatabase db)(在派生类中必须被重写)
Called when the database is created for the first time.
void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)
Called when the database needs to be downgraded.
void onOpen(SQLiteDatabase db)
Called when the database has been opened.
abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)(在派生类中必须被重写)
Called when the database needs to be upgraded.



它提供了两个重要的方法,分别是
onCreate(SQLiteDatabase db):用户初次使用软件时生成数据库,一旦数据库存在则不会调用此方法。函数是在第一次创建数据库的时候执行的,仅仅生成DataBaseHelper对象(SQLiteOpenHelper类型)的时候是不会调用该函数的,而只有当调用DataBaseHelper对象的getReadableDataBase时或者是调用了getWritableDataBase时,如果是第一次创建数据库,那么就一定会调用onCreate()函数。

onUpgrade(SQLiteDatabase db,int oldVersion,int vewVersion):用于升级软件时更新数据库表结构,如增加表、列字段等操作。
提示一下,在软件升级前,最好对原有数据进行备份,在新表建好后把数据导入新表中。

实现了这两个方法,就可以用它的getWritableDatabase()和getReadableDatabase()来获得数据库(SQLiteDatabase 对象)。

强调下:当第一次创建数据库时,当实现DataBaseHelper对象的getReadableDataBase时或者是调用了getWritableDataBase时,系统自动调用oncreater()方法(当然程序中也可以调用);
如果用户需要升级数据库表结构,需要主动调用onUpgrade(SQLiteDatabase db,int oldVersion,int vewVersion),传入一个新的版本的号。
继承该类并覆盖onCreate,onUpgrade,onOpen(可选)。我们可以创建或打开数据库,并对其进行升级。通过getReadableDataBase和getWritableDataBase获取SQliteDataBase实例。通过close关闭数据库。
   

SQLiteDatabase 类
SQLiteDatabase是关于数据库操作,封装了管理数据库的各种方法,包括insert 、delete、 update 、query 、执行SQL命令等操作。
beginTransaction(),endTransaction()方法封装了开始及停止一个事务的相关SQL命令,yieldfContended()方法将暂停当前事务的运行已让其它等待线程执行。当该方法返回时,一个未标记为成功的新事务将被创建。
setMaximunSize(long)用于设置数据库文件的最大长度。
compileStatement(String)将一个SQL命令字符串转换为SQliteStatement对象,用于后续管理或执行。query()执行指定的SQL语句进行查询,并返回cursor作为结果。get/setVersion()获取霍设置数据库版本号。
insert(),update(),delete()执行数据库记录插入、更新、删除等工作。
execSQL() 执行一条非查询类型的SQL命令,如:创建表,删除记录等。
setLocal()设置数据库的local。

可惜美中不足的是:
1. 其不支持创建数据库
2. 其不支持版本更新 或者说其不知道如何做 因为具体数据的差异
鉴于以上的缺陷,有一个辅助类可以完成上面功能,那就是:SQLiteOpenHelper

获得了SQLiteDatabase对象以后,我们就可以通过调用SQLiteDatabase的实例方法来对数据库进行操作了(通常,在ContentProvider派生类对象中,有一个SQLiteOpenHelper实例,通过SQLiteOpenHelper实例的getWritableDataBase或getReadableDataBase方法可以得到SQLiteDatabase对象实例)。


ContentProvider类
与Service,BroadcastReceiver等组件一样,继承特定的Interface,在AndroidManifest.xml里声明这个ContentProvider,调用者就可以拿来使用了。
首先我们定义一个ContentProvider:
package test.DB;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.widget.Toast;
public class TestProvider extends ContentProvider {
    private DatabaseHelper mdbHelper = null;
    final static String TABLE_NAME = "test";
 @Override
 public int delete(Uri arg0, String arg1, String[] arg2) {
  mdbHelper.getWritableDatabase().delete(TABLE_NAME, arg1, arg2);
  return 0;
 }
 @Override
 public String getType(Uri uri) {
  // TODO Auto-generated method stub
  return null;
 }
 @Override
 public Uri insert(Uri uri, ContentValues values) {
  // TODO Auto-generated method stub
  mdbHelper.getWritableDatabase().insert(TABLE_NAME, "", values);
  return null;
 }
 @Override
 public boolean onCreate() {
  // TODO Auto-generated method stub
  mdbHelper = new DatabaseHelper(this.getContext(), "dbfile");
  return true;
 }
 @Override
 public Cursor query(Uri uri, String[] projection, String selection,
   String[] selectionArgs, String sortOrder) {
  Cursor cur = mdbHelper.getReadableDatabase().query(TABLE_NAME,projection,selection,null,null,null, null);
  Toast.makeText(this.getContext(), "test Cur!", Toast.LENGTH_SHORT);
  return cur;
 }
 @Override
 public int update(Uri uri, ContentValues values, String selection,
   String[] selectionArgs) {
  mdbHelper.getWritableDatabase().update(TABLE_NAME, values, selection, null);
  return 0;
 }
}

老规矩,AndroidManifest.xml来定义这个Provider
<provider android:label="test_provider" android:authorities="com.my.provider" android:name="TestProvider">
    </provider>

这里的android:authorities = "com.my.provider"是标识这个ContentProvider,调用者可以根据这个标识来找到它,
我们组合一个能找到它的Uri,
public class ProviderConst {
 public static final Uri MY_TEST_URI = Uri.parse("content://com.my.provider/test");
}

content 指的是内容提供者ContentProvider。
//com.my.provider映射到我们已定义的那个ContentProvider标识
/test这个作为一个参数,传给ContentProvider,可以根据这个参数来决定操作目标,比如数据库中的哪张表,文件中的那一部分数据等。

我们来操作这个内容提供者:
 private String getName()
    {
     String name = null;      
     Cursor cur = this.getContentResolver().query(ProviderConst.MY_TEST_URI,new String[]{"id","name"},null, null, null);
     if (cur == null)
      return null;
     cur.moveToFirst();
     do
     {
      name = name  + cur.getString(1)+ "\n";      
      
     } while(cur.moveToNext());      
     
     return name;
    }

我们也可以这样使用:
private String getName()
    {
     String name = null;      
     Cursor cur = this.managedQuery(ProviderConst.MY_TEST_URI,new String[]{"id","name"},null, null, null);
     if (cur == null)
      return null;
     cur.moveToFirst();
     do
     {
      name = name  + cur.getString(1)+ "\n";      
      
     } while(cur.moveToNext());      
     
     return name;
    }

简单的使用方法我们已了解
分享到:
评论

相关推荐

    sqlite&provider&observer

    SQLiteDatabase,SQLiteOpenHelper,ContentProvider,ContentResolver,ContentObserver,ContentObserverable的使用简单使用。

    ContentProviderDemo.zip

    Android 四大件组件之一ContentProvider demo案例,下载...存储数据使用系统自带的数据库SQLIteOpenHelper,自定义ContentProvider,通过ContentResolver访问ContentProvider,实现数据新增、查找、删除、修改等功能。

    ContentProvider

    private SQLiteDatabase sqLiteDatabase; private static final UriMatcher URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH); private final String TAG="provider"; private static final String authority=...

    Android实例代码

    SQLiteOpenHelper; sqlite3 tools; 8.4、手势(Gesture): 8.5、自动朗读(TTS): 8.6、网络存储: 第9章、使用ContentProvider实现数据共享 9.1、数据共享标准:ContentProvider; Uri; ContentResolver; 9.2...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    SQLiteOpenHelper; sqlite3 tools; 8.4、手势(Gesture): 8.5、自动朗读(TTS): 8.6、网络存储: 第9章、使用ContentProvider实现数据共享 9.1、数据共享标准:ContentProvider; Uri; ContentResolver; 9.2...

    疯狂Android讲义源码

     8.3.1 简介SQLiteDatabase 321  8.3.2 创建数据库和表 323  8.3.3 使用SQL语句操作SQLite  数据库 323  8.3.4 使用sqlite3工具 325  8.3.5 使用特定方法操作SQLite  数据库 327  8.3.6 事务 329  8.3.7 ...

    疯狂Android讲义.part2

    8.3.1 简介SQLiteDatabase 321 8.3.2 创建数据库和表 323 8.3.3 使用SQL语句操作SQLite 数据库 323 8.3.4 使用sqlite3工具 325 8.3.5 使用特定方法操作SQLite 数据库 327 8.3.6 事务 329 8.3.7 SQLiteOpenHelper类 ...

    疯狂Android讲义.part1

    8.3.1 简介SQLiteDatabase 321 8.3.2 创建数据库和表 323 8.3.3 使用SQL语句操作SQLite 数据库 323 8.3.4 使用sqlite3工具 325 8.3.5 使用特定方法操作SQLite 数据库 327 8.3.6 事务 329 8.3.7 SQLiteOpenHelper类 ...

Global site tag (gtag.js) - Google Analytics