文档章节

Android SQLite 详解(一)

w
 whhos
发布于 2016/05/07 00:00
字数 3107
阅读 41
收藏 0

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.





© 著作权归作者所有

w
粉丝 3
博文 19
码字总数 30479
作品 0
周口
私信 提问
手机开发-如何查看android数据文件和数据库

在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看。android项目中的sqlite数据库位于/data/data/项目包/databases中。 工具/原料 doc命令adb工具,ecl...

娶到笨笨
2014/03/14
378
0
Android 开发中使用 SQLite 数据库

SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都...

红薯
2010/08/22
67.5K
32
Android读写SQLite数据库并导出SQLite数据写入到Excel表中

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/86083376 Android读写SQLite数据库并导出SQLite数据写入到Excel表中 需要先引入Apach...

zhangphil
01/21
0
0
Android:SharedPreferences解析和实现记住用户名

SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,它提供了Android平台常规的Long长整形、Int整形、String字符串型的保存。S...

岑浩源
2012/11/28
2.8K
0
SQLite命令行访问Android数据库

登录Android Shell D:android-sdk-windowsplatform-toolsadb shell 应该出现#提示,如果是$提示,请按照上面链接获取ROOT权限。 sqlite命令 sqlite3 /data/data/com.easymorse.demo/files/my......

xiahuawuyu
2013/01/06
223
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
10
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
1K
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部