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

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

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

 1 package com.example.test_20131218; 2  3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5  6 public class DBAdapter { 7     private static DBAdapter INSTANCE  = null; 8     private DBOpenHelper mHelper = null; 9     private SQLiteDatabase mDB = null;10     private DBAdapter(Context context){11         mHelper = new DBOpenHelper(context);12         mDB = mHelper.getWritableDatabase();13     }14     public static DBAdapter getInstance(Context context){15         if(INSTANCE == null){16             return new DBAdapter(context);17         }18         return INSTANCE;19     }20     public void open(){21         if(mDB == null){22             mDB = mHelper.getWritableDatabase();23         }24     }25     26 }


DBHelper类:

 1 package com.example.test_20131218; 2  3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 import android.database.sqlite.SQLiteOpenHelper; 6 import android.util.Log; 7  8 public class DBOpenHelper extends SQLiteOpenHelper { 9     /***10      * 数据库的版本必须大于0,否则报错:11      * java.lang.RuntimeException: Unable to start activity 12      * ComponentInfo{com.example.test_20131218/13      * com.example.test_20131218.MainActivity}: java.lang.IllegalArgumentException: Version must be >= 1, was 014      */15     public static final int DB_VERSION = 5;16     public static final String DB_NAME = "test20131218.db";17     18     public DBOpenHelper(Context context) {19         super(context, DB_NAME, null, DB_VERSION);20     }21 22     @Override23     public void onCreate(SQLiteDatabase db) {24         /**25          * 这个方法26          * 1、在第一次打开数据库的时候才会走27          * 2、在清除数据之后再次运行-->打开数据库,这个方法会走28          * 3、没有清除数据,不会走这个方法29          * 4、数据库升级的时候这个方法不会走30          */31         Log.i("xinye", "#############数据库创建了##############:" + DB_VERSION);32     }33 34     @Override35     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {36         /**37          * 1、第一次创建数据库的时候,这个方法不会走38          * 2、清除数据后再次运行(相当于第一次创建)这个方法不会走39          * 3、数据库已经存在,而且版本升高的时候,这个方法才会调用40          */41         Log.i("xinye", "#############数据库升级了##############:" + DB_VERSION);42         43     }44     @Override45     public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {46         /**47          * 执行数据库的降级操作48          * 1、只有新版本比旧版本低的时候才会执行49          * 2、如果不执行降级操作,会抛出异常50          */51         Log.i("xinye", "#############数据库降级了##############:" + DB_VERSION);52         super.onDowngrade(db, oldVersion, newVersion);53     }54 55 }


更多内容请参考大牛博客对Android文档的翻译:http://blog.csdn.net/think_soft/article/details/7969122

也可以自行百度,Google!

下面把大牛的博客拷贝过来,以便于以后参考:

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)

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

参数:

enabled:true:启用预写日志,false:禁用预写日志

参照:enableWriteAheadLogging()方法。

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#enableWriteAheadLogging()

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Fragment和Activity之间传值的问题
  3. Android的Activity的启动流程分析
  4. Android(安卓)studio 使用 ImageView 加载 gif 文件
  5. Settings设置页面的Preference使用方法
  6. Android面试题整理(百度)
  7. android greenDao SQLite数据库操作工具类
  8. Android(安卓)源码解析之Adapter和AdapterView与适配器模式
  9. MVP模式的Android(安卓)调用系统拍照,相册,剪裁,适配到7.0,修复拍照

随机推荐

  1. Windows下的Android SDK下载,2.2之前各个
  2. android之Layout(一)
  3. Android Service生命周期及用法
  4. Android 启动页面优化 (白屏 、等待的问题
  5. 演化理解 Android(安卓)异步加载图片
  6. Android中GridView使用
  7. 如何使用命令行编译运行cocos2d-x的andro
  8. Android(安卓)Actionbar(标题栏)的背景设
  9. android JiaoZiVideoPlayer问题整理解析
  10. android EditText不自动弹出软键盘