`
Leif_冬
  • 浏览: 47891 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

android数据库

阅读更多

Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())的注意点

以下内容可以作为面试官在面试的时候的问题,感觉比较好,是比较常用的知识点,可以用来考察基础是否扎实。

也可以程序猿学习、开发中的注意点。因为稍微不注意,就有可能导致数据库不能用。

DBAdapter.java是一个简单的类,主要用来进行数据库操作。
复制代码

 

package com.example.test_20131218; 
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
public class DBAdapter {
     private static DBAdapter INSTANCE  = null;
     private DBOpenHelper mHelper = null;
     private SQLiteDatabase mDB = null;
     private DBAdapter(Context context){
         mHelper = new DBOpenHelper(context);
         mDB = mHelper.getWritableDatabase();
     }
     public static DBAdapter getInstance(Context context){
         if(INSTANCE == null){
             return new DBAdapter(context);
         }
         return INSTANCE;
     }
     public void open(){
         if(mDB == null){
             mDB = mHelper.getWritableDatabase();
         }
     }     
}

 

DBHelper类:
 

package com.example.test_20131218;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; 
public class DBOpenHelper extends SQLiteOpenHelper {
     /***
      * 数据库的版本必须大于0,否则报错:
      * java.lang.RuntimeException: Unable to start activity 
      * ComponentInfo{com.example.test_20131218/
      * com.example.test_20131218.MainActivity}: java.lang.IllegalArgumentException: Version must be >= 1, was 0
      */
     public static final int DB_VERSION = 5;
     public static final String DB_NAME = "test20131218.db";    
     public DBOpenHelper(Context context) {
         super(context, DB_NAME, null, DB_VERSION);
     } 
     @Override
     public void onCreate(SQLiteDatabase db) {
         /**
          * 这个方法
          * 1、在第一次打开数据库的时候才会走
          * 2、在清除数据之后再次运行-->打开数据库,这个方法会走
          * 3、没有清除数据,不会走这个方法
          * 4、数据库升级的时候这个方法不会走
          */
         Log.i("xinye", "#############数据库创建了##############:" + DB_VERSION);
     } 
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         /**
          * 1、第一次创建数据库的时候,这个方法不会走
          * 2、清除数据后再次运行(相当于第一次创建)这个方法不会走
          * 3、数据库已经存在,而且版本升高的时候,这个方法才会调用
          */
         Log.i("xinye", "#############数据库升级了##############:" + DB_VERSION);
         
     }
     @Override
     public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         /**
          * 执行数据库的降级操作
          * 1、只有新版本比旧版本低的时候才会执行
          * 2、如果不执行降级操作,会抛出异常
          */
         Log.i("xinye", "#############数据库降级了##############:" + DB_VERSION);
         super.onDowngrade(db, oldVersion, newVersion);
     } 
}

 
Android类参考---SQLiteOpenHelper

public 抽象类

SQLiteOpenHelper

继承关系

java.lang.Object

   |____android.database.sqlite.SQLiteOpenHelper

类概要

这是一个辅助类,用来管理数据库的创建和数据库的版本。

你要创建一个这个类的子类来实现onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)方法,以及可选的onOpen(SQLiteDatabase)方法,并且这个类要管理数据库的状态,如果数据库存在,就打开数据库,否则就创建数据库,并且在需要的时候也会更新数据库。使用事务来确保数据库始终在正确的状态中。

这个类让ContentProvider的实现变的容易,它把数据库的打开和升级延迟到第一次使用,从而避免了因升级数据库的长时间运行而造成的应用程序阻塞。

注意:这个类假设用递增的版本号来升级。

Public构造器

public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CuresorFactory factory, int version)

   创建一个辅助对象,用来创建、打开、管理数据库。这个方法始终是快速返回的。在getWriteableDatabase()或getReadableDatabase()方法被调用之前,这个数据库不会实际的被创建。

   参数说明:

   context:用于打开或创建数据库;

   name:指定数据库的文件名,null指定一个内存中的数据库

   factory:用于创建游标对象,或默认的null;

   version:指定数据库的版本号(从1开始);如果数据库比较旧,onUpgrade(SQLiteDatabase, int, int)方法将用于升级数据库。如果数据库比较新,onDowngrade(SQLiteDatabase, int, int)方法会被用于降级数据库。



public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler)

   创建一个辅助对象,用来创建、打开、管理数据库。这个方法始终是快速返回的。在getWriteableDatabase()或getReadableDatabase()方法被调用之前,这个数据库不会实际的被创建。

   接收输入参数:一个具体的DatabaseErrorHandler示例,用于处理SQLite报告的数据库错误。

   参数说明:

   context:用于打开或创建数据库;

   name:指定数据库的文件名,null指定一个内存中的数据库

   factory:用于创建游标对象,或默认的null;

   version:指定数据库的版本号(从1开始);如果数据库比较旧,onUpgrade(SQLiteDatabase, int, int)方法将用于升级数据库。如果数据库比较新,onDowngrade(SQLiteDatabase, int, int)方法会被用于降级数据库。

   errorHandler:该参数被用于SQLite报告数据库错误,或者是null,使用默认错误处理器。



Public方法

public synchronized void close()

关闭打开的数据库对象。



public String getDatabaseName()

返回由构造器传递进来的,正在打开的SQLite数据的名称。



public SQLiteDatabase getReadableDatabase()

创建并(或)打开一个数据库,除非因为某些问题,否则这个方法返回的对象会与getWritableDatabase()方法相同,如在磁盘空间不足的情况下,就会要求数据库以只读的方式被打开,在这种情况下,会返回一个只读的数据库。如果问题被修正,继续调用getWritableDatabase()方法也可以成功,这时只读的数据库对象会被关闭,并且会返回一个读写对象。

getWritableDatabase()方法可能需要很长时间才能返回,因此不应该在应用程序的主线程中调用它,包括ContentProvider.onCreate()方法。

返回值:返回一个数据库对象,直到getWritableDatabase()或close()方法被调用之前,这个对象都是有效的。

异常:如果数据不能够被打开,会抛出SQLiteException异常。



public SQLiteDatabase getWritableDatabase()

创建并(或)打开一个用于读写的数据库。如果是首次调用这个方法,那么该数据将会被打开,并且onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int)和(或)onOpen(SQLiteDatabase)方法会被调用。

数据库一旦被打开,该数据库就会被缓存,因此在每次需要写数据库时,你都能够调用这个方法。(在不在需要该数据库时,要确保调用close()方法)。诸如没有授权或没有磁盘空间等错误可能会导致这个方法调用失败,但如果这些问题被修正,这个方法就会被调用成功。

注意:数据库升级可能需要很长时间,因此不要在应用程序的主线程中调用这个方法,包括ContentProvider.onCreate()。

返回值:一个读写的数据库对象,直到close()方法被调用才失效。

异常:如果该数据库不能为写入而打开,就会抛出SQLiteException异常。



public void onConfigure()

在配置数据连接时会调用这个方法,确保预写日志或外键支持等功能可用。

这个方法在onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int),onDowngrade(SQLiteDatabase, int, int)或onOpen(SQLiteDatabase)方法被调用之前被调用。除了配置必要的数据库连接之外,它不应该编辑数据库。

这个方法只应该调用配置数据库连接参数的方法,如enableWriteAheadLogging(),setForeignKeyConstraintsEnabled(boolean),setLocale(Locale),setMaximumSize(long),或者执行PRAGMA语句。

参数:

db:被配置的数据库对象



public abstract void onCreate(SQLiteDatabase db)

数据库被首次创建时,会调用这个方法。这时创建数据库表和表初始化的地方。

参数:

db:要创建的数据库。



public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)

当数据库需要被降级时,调用这个方法。这个方法与onUpgrade(SQLiteDatabase, int, int)方法非常相似,但是它是在当前版本比请求的版本新的时候,才会被调用。但是这个方法不是抽象的,因此它不是强制要求客户实现它的。如果这个方法没有被重写,默认的实现会拒绝降级处理,并抛出SQLiteException异常。

这个方法是在事务中执行的。如果有异常被抛出,所有的改变都会被回滚。

参数:

db:指定要降级的数据库

oldVersion:旧的数据库版本

newVersion:新的数据库版本



public void onOpen(SQLiteDatabase db)

数据库被打开时,会调用这个方法。在升级数据库之前,这个方法的实现应该检查数据库是否是只读的(调用isReadOnly()方法)。

数据库连接被配置且数据库策略被创建、升级或必要的降级之后,这个方法会被调用。如果数据库连接必须在策略被创建、升级或降级前做某些设置,那么就要在onConfigure(SQLiteDatabase)方法中来做这些事情。

参数:

db:被打开的数据库。



public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

当数据库需要升级时,会调用这个方法。应该使用这个方法来实现删除表、添加表或者做一些需要升级新的策略版本的事情。

SQLite ALTER TABLE的文档可以在以下网址中找到:

http://sqlite.org/lang_altertable.html

如果要给表添加一个新列,那么使用使用ALTER TABLE能够把新列插入到表中。如果要重命名或删除列,那么你能够使用ALTER TABLE能够重命名旧表,然后,创建一个新表,并把旧表中内容复制到新表中。

这个方法是事务中执行的,如果有异常被抛出,所有的改变都会被自动的回滚。

参数:

db:指定要降级的数据库

oldVersion:旧的数据库版本

newVersion:新的数据库版本



public void setWriteAheadLoggingEnabled(boolean enabled)

启用或禁用数据库的预写日志。预写日志不能被用于只读的数据库,因此如果数据是以只读的方式被打开,这个标记值会被忽略。

 

分享到:
评论

相关推荐

    Android数据库ORM封装

    总结来说,Android数据库ORM封装使得数据库操作更加简便,通过Room框架,我们可以以声明式的方式定义数据库操作,同时保持代码的清晰和可维护性。`DataBaseDemo`项目则提供了具体的实现示例,有助于你在实际项目中...

    android数据库应用实例

    下面我们将深入讨论Android数据库应用的相关知识点。 1. SQLite数据库介绍 SQLite是一个开源的数据库系统,它被集成到Android操作系统中,无需额外安装任何软件。它的优点包括小巧、快速、可靠,以及支持SQL标准,...

    android数据库操作封装

    "android数据库操作封装"主要是为了提高代码的可读性、可维护性和复用性,通过创建自定义的数据访问对象(DAO)层和数据库帮助类来实现。 1. 数据库Helper类: 在Android中,我们通常会创建一个继承自`...

    《Android数据库程序设计》 PDF

    《Android数据库程序设计》详细阐述了与Android数据库程序设计相关的基本解决方案,主要包括在Android系统中存储数据、使用SQLite数据库、SQLite查询、使用Content Providers、表查询操作、UI关联、Android数据库...

    android 数据库代码和资料

    本资源包提供了完整的Android数据库代码示例和详细的讲解资料,非常适合开发者深入学习和理解Android数据库的使用。 首先,我们来了解一下Android中主要使用的数据库系统——SQLite。SQLite是一个轻量级、嵌入式的...

    android数据库实例.pdf

    Android数据库实例 Android数据库实例是指在Android应用程序中使用的数据库系统,用于存储和管理应用程序的数据。在Android系统中, SQLite数据库是最常用的数据库管理系统,它提供了一个轻量级的关系数据库管理...

    android数据库快速开发

    android数据库快速开发框架,使用简单

    Android数据库完美框架和示例

    在Android开发中,数据库是应用数据持久化的重要方式。Android提供了SQLite数据库系统...在`DemoDateBase`压缩包中,应该包含了这个框架的实现代码,你可以下载并参考其中的细节,进一步学习和实践Android数据库操作。

    你想要Android数据库操作精华(安全、并发、单例等)

    本Demo——"你想要的Android数据库操作精华(安全、并发、单例等)",旨在深入探讨如何在Android Studio环境下进行高效且安全的数据库操作,包括使用数据库框架、数据库加密、并发控制以及单例模式的应用。...

    Android数据库示例源码

    这个“Android数据库示例源码”很可能是为了展示如何在Android平台上使用SQLite数据库进行数据操作。SQLite是一种轻量级、开源的SQL数据库,它嵌入到Android系统中,为每个应用程序提供独立的数据库。 首先,让我们...

    android数据库增删改查工具

    这个“android数据库增删改查工具”是一个自定义的解决方案,旨在简化Android应用程序中SQLite数据库的操作。开发者通常会遇到处理用户数据、成员信息等需求,这时一个方便的数据库管理工具就显得尤为重要。 首先,...

    Android数据库查看APP.zip

    "Android数据库查看APP.zip" 提供了一个工具,即"aSQLiteManager_数据库查看.apk",用于帮助开发者和用户方便地查看和管理Android设备上的SQLite数据库。这款应用能够协助我们深入理解Android应用的数据存储机制,对...

    android 数据库orm框架依赖库

    本篇文章将详细探讨Android数据库ORM框架,特别是关于"ormlite"库的使用。 首先,ORMlite是一个轻量级的Java ORM库,它同样适用于Android平台。这个框架允许开发者通过简单的Java对象(POJOs)来操作数据库,而无需...

    Android数据库内容变化的监听

    Android 数据库内容变化的监听 Android 数据库内容变化的监听是 Android 系统中一种重要的机制,用于监听数据库中的内容变化。这种机制基于 Uri 的内容监测,通过 ContentResolver 类提供了三个方法来实现监听功能...

    Android数据库SQLite详解

    在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的、开源的、嵌入式的SQL数据库引擎,被广泛用于存储和管理应用程序中的数据。SQLite具有高效、可靠且易于集成的特点,使得它成为Android应用数据...

    Android-一个用于调试android数据库和sharedpreferences的库

    **Android数据库调试** 在Android开发中,SQLite数据库是最常见的本地数据存储方式。通常,开发者需要通过adb命令行工具或者使用像Android Studio这样的IDE内置功能来查看和操作SQLite数据库。然而,`Android-Debug...

    android数据库开发

    ### Android数据库开发详解 #### 一、概述 在Android应用开发过程中,数据持久化是非常重要的一个环节。Android提供了多种方式来存储数据,包括文件存储、SharedPreferences、SQLite数据库以及网络存储等。其中,...

    android数据库例子(create,query,upgrade)

    在给定的`TestActivity`文件中,你可以找到具体的代码实现,通过阅读和分析这些代码,你可以更深入地理解Android数据库操作的细节。记住,实践是最好的老师,动手尝试编写和运行这些示例,将有助于你更好地掌握...

    Android数据库SQLite手动建库适合小白学习的代码清晰易懂

    Android数据库SQLite手动建库的代码页,适合小白学习分析Android代码。即便是刚刚接触的Android的学生,看里面的两行注释也能明白。 程序运行效果,在File Explore里面的Date/Date/<packageName>/database下会看到...

Global site tag (gtag.js) - Google Analytics