Android SQLite 详解(一)

SQLite简介:

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。

官方网站:https://www.sqlite.org/

在安卓中的应用:

如何创建或者打开数据库:

方法一:通过SQLiteDatebase创建,方法如下

public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory) 
Added in API level 1Equivalent to openDatabase(path, factory, CREATE_IF_NECESSARY). 
public static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory) 
Added in API level 1Equivalent to openDatabase(file.getPath(), factory, CREATE_IF_NECESSARY).

此方法会打开一个SQLite数据库,如果没有,会先创建。

需要两个参数:第一个参数:数据库路径名或数据库文件,第二个参数可以传入null

方法二:通过SQLiteOpenHelper创建:

Android为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。既然有好东西可以直接使用,那我们自然要尝试一下了,下面我就将对SQLiteOpenHelper的基本用法进行介绍。

首先你要知道SQLiteOpenHelper是一个抽象类,这意味着如果我们想要使用它的话,就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper中有两个抽象方法,分别是onCreate()onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。

SQLiteOpenHelper中还有两个非常重要的实例方法,getReadableDatabase()getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。

SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数少一点的那个构造方法即可。这个构造方法中接收四个参数,第一个参数是Context,这个没什么好说的,必须要有它才能对数据库进行操作。第二个参数是数据库名,创建数据库时使用的就是这里指定的名称。第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null。第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。构建出SQLiteOpenHelper的实例之后,再调用它的getReadableDatabase()getWritableDatabase()方法就能够创建数据库了,数据库文件会存放在/data/data/<package name>/databases/目录下。此时,重写的onCreate()方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。

Public Constructors 

 SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 
Create a helper object to create, open, and/or manage a database.  
 SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) 
Create a helper object to create, open, and/or manage a database.

Public Methods 

synchronized void  close() 
Close any open database object.  
String  getDatabaseName() 
Return the name of the SQLite database being opened, as given to the constructor.  
SQLiteDatabase  getReadableDatabase() 
Create and/or open a database.  
SQLiteDatabase  getWritableDatabase() 
Create and/or open a database that will be used for reading and writing.  
void  onConfigure(SQLiteDatabase db) 
Called when the database connection is being configured, to enable features such as write-ahead logging or foreign key support.  
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.  
void  setWriteAheadLoggingEnabled(boolean enabled) 
Enables or disables the use of write-ahead logging for the database.

 

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()方法。

继承SQLiteOpenDatebase需要重写的方法:

void  onConfigure(SQLiteDatabase db) 
Called when the database connection is being configured, to enable features such as write-ahead logging or foreign key support.  

abstract void  onCreate(SQLiteDatabase db) 
 * 这个方法       
 * 1、在第一次打开数据库的时候才会走         
 * 2、在清除数据之后再次运行-->打开数据库,这个方法会走        
 * 3、没有清除数据,不会走这个方法         
 * 4、数据库升级的时候这个方法不会走         
Called when the database is created for the first time.  

void  onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) 
 * 执行数据库的降级操作        
 * 1、只有新版本比旧版本低的时候才会执行     
 * 2、如果不执行降级操作,会抛出异常
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)
* 1、第一次创建数据库的时候,这个方法不会走         
* 2、清除数据后再次运行(相当于第一次创建)这个方法不会走       
* 3、数据库已经存在,而且版本升高的时候,这个方法才会调用         
Called when the database needs to be upgraded.





转载于:https://my.oschina.net/whhos/blog/671115

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值