Android学习笔记(42):SQLite数据库

(1)SQLite数据库

先简单介绍一下SQLite数据库:

2000年由D.Richard Hipp发布。

是一款轻型、开源嵌入式关系数据库,占用资源非常低。目前用于很多嵌入式产品中,在嵌入式设备中,SQLite可能只需要几百K的内存就够了。

与Mysql、PostgreSQL这两款开源世界著名的数据库管理系统相比,它的处理速度更快。

在Android平台下,除了可以在Android程序中操作SQLite数据库之外,还可以在命令行模式下进行各种数据库的操作,包括表的各种操作,对数据的增加、删除、修改、查询。

(2)使用命令行操作SQLite

我们先来介绍如何使用命令行管理数据库,这里我们需要用到Android SDK的platform-tools目录下的sqlite3.exe文件,这是一个简单的SQLite数据库管理工具,类似于MySQL提供的命令行窗口,操作数据库的语句与SQL标准大致相同。

使用命令行操作SQLite的步骤:

1. 运行Android模拟器或连接真机。

2. cmd输入命令adb shell,登录到设备的shell(需要取得设备的root权限,提示字符为#)。

3. 输入命令sqlite3 data/data/<package name>/databases_name打开数据库。

4. 打开数据库后,可以使用各种命令来操作数据库。

5. 对数据库的操作完毕后,输入.exit退出sqlite3,关闭数据库的访问。

当然我们也可以把数据库文件导出到电脑上,再用命令行对该文件进行操作。

当我们需用从文件(如一堆txt文件)中提取信息,可以写C++或Java程序来创建和编辑数据库。

命令行操作SQLite的具体内容就不深入讲解了,了解SQL语句的话,这不会很难。

(3)使用代码操作SQLite数据库

为了方便使用,Android将对SQLite数据库的操作封装到两个类中。通过类实现对数据库的操作。这两个类就是SQLiteOpenHelper、SQLiteDatabase。

1. SQLiteOpenHelper

帮助类,用于创建数据库和数据库版本管理。使用该类,必须创建一个子类并实现下列方法:onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase, int, int)。

onCreate(SQLiteDatabase db):用于初次使用软件时生成数据库表。只在生成数据库时调用。

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):用于升级软件时更新数据库。创建SQLiteOpenHelper对象时传入的version参数表示数据库的版本号,再次创建SQLiteOpenHelper时如果版本号高于旧的版本号,就会触发这个方法。

SQLiteOpenHelper用于打开和创建数据库的方法如下:

SQLiteDatabase getReadableDatabase():以读写的方式打开SQLiteDatabase对象。磁盘空间满时以只读的方式打开。

SQLiteDatabase getWritableDatabase():以写的方式打开SQLiteDatabase对象。磁盘空间满时会出错。

void close():关闭所有打开的SQLiteDatabase对象。

2. SQLiteDatabase

SQLiteDatabase自身提供了一些静态方法来打开和创建数据库,但并不是推荐使用的:

static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags):打开path文件所代表的数据库。

static SQLiteDatabase openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory):打开path文件所代表的数据库,如果不存在就创建。

static SQLiteDatabase openOrCreateDatabase(File file, SQLiteDatabase.CursorFactory factory):

打开file文件所代表的数据库,如果不存在就创建。

获取了SQLiteDatabase对象后,供我们对数据库进行操作的常用方法:

事务处理:

事务处理可以帮助我们提高大批量处理数据的效率。

使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction()方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful()方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful()方法则回滚事务。

void beginTransaction():开始事务。

void endTransaction():结束事务。

boolean inTransaction():判断是否处于事务中。

看下面这个例子:

public void payment() {
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
db.beginTransaction();//开始事务
try {
db.execSQL("update person set amount=amount-10 where personid=2");
db.execSQL("update person set amount=amount+10 where personid=5");
db.setTransactionSuccessful();// 设置事务的标志为true,调用此方法会在执行到endTransaction()方法是提交事务,若没有调用此方法会在执行到endTransaction()方法回滚事务。
} catch (SQLException e) {
} finally {
db.endTransaction();
}
// 结束事务,有两种情况:commit,rollback,
// 事务的提交或回滚是由事务的标志决定的,如果事务的标志为true就会提交,否则回滚,默认情况下事务的标志为false
}

int delete(String table, String whereClause, String[] whereArgs):删除指定表中的指定数据。table表示想删除的表名,whereClause表示满足该子句的记录将被删除,whereArgs为whereClause传入参数。

long insert(String table, String nullColumnHack, ContentValues values):向指定表中插入数据。table表示表名,nullColumnHack表示插入null的列的列名,value表示一行记录的数据。

int update(String table, ContentValues values, String whereClause, String[] whereArgs):更新指定表中的指定数据。table表示表名,values表示想更新的数据,whereClause表示满足该子句的记录会被更新,whereArgs为whereClause子句传入参数。

void execSQL(String sql):执行SQL语句。

void execSQL(String sql, Object[] bindArgs):执行带占位符的SQL语句。

Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy):对指定表执行查询。columns表示要查询出来的列名,selection查询条件子句,selectionArgs为selection传入参数,groupBy控制分组,having对分组进行过滤,orderBy对记录进行排序。

Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit):对指定表执行查询。Limit参数指定最多查询几条记录。

Cursor query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit):对指定表执行查询,第一个参数控制是否去除重复值。

Cursor rawQuery(String sql, String[] selectionArgs):执行带占位符的SQL查询。

查询方法返回的都是一个Cursor对象,我们可以把Cursor看做一个查询结果的集合。Cursor提供了如下的方法供我们移动查询结果的记录指针。

boolean move(int offset):将记录指针向上或向下移动指定的行数,offset正数为向下移动。

boolean moveToFirst():将记录指针移动到第一行。

boolean moveToLast():将记录指针移动到最后一行。

boolean moveToNext():将记录指针移动到下一行。

boolean moveToPosition(int position):将记录指针移动到指定的行。

boolean moveToPrevious():将记录指针移动到上一行。

上述方法,移动成功返回true。

使用SQLiteDatabase操作数据库的步骤可以总结如下:

<1> 获取SQLiteDatabase对象。

<2> 调用特定方法操作数据库。

<3> 关闭SQLiteDatabase,回收资源。

(4)可视化工具

SQLiteSpy就挺好的。

时间: 2024-10-27 05:59:47

Android学习笔记(42):SQLite数据库的相关文章

Android学习笔记之SQLite数据库的使用及常用的增删改查方法、无sql语句的DRUD方法汇总

(1)目录结构如下: (2)链接数据库的文件:DBHelper.java要继承SQLiteOpenHelper类 package com.lc.sqlite_demo1.db; import android.content.Context; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLit

Android学习笔记(SQLite的简单使用)

1.SQLite介绍 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 2.SQLiteOpenHelper的使用方法 常用方法    1.getReadableDatabase():得到可读的数据库,返回一个SQLiteDatabase对象,提供一些管理数据库的方法 

android学习之通过sqlite数据库实现记事本

最近学习了数据库,于是写了一个记事本来体验了一下数据库因为最近的事情比较多,所以界面或者有些设计不是那么完美,但是作为一个可扩展的笔记本demo也已经是足够了,这个例子实现的是,可以注册多个用户,然后每个用户都对应有一个记事本记录,ok,代码: package com.example.logindemo2; import com.jk.dao.SqlistBase; import android.os.Bundle; import android.provider.ContactsContrac

Android学习笔记(四一):SQLite的使用

SQLite是非常流行的嵌入式关系型数据库,轻载,速度快,而且是开源.在Android中,runtime提供SQLite,所以我们可以使用SQLite,而且是全集的SQLite.SQLite提供SQL接口,和一般的数据库一样.但是Android的API不采用JDBC,JDBC消耗太多的资源. SQLite支持绝大部分SQL-92标准,不支持:FOREIGN KEY constraints, nested transactions, RIGHT OUTER JOIN, FULL OUTER JOI

Android学习笔记(四二):SQLite、ListView、ContextMenu

继续上一个例子,结合ListView中对SQLite进行操作. 通过CursorAdapter在ListView中的数据呈现 在上一个例子中,我们可以对SQLite中的数据库进行增删改查,将数据读到游标Cursor中,然后一一读出.在Android中可以通过CursorAdapter直接将数据映射到ListView中,如下处理: public class Chapter22Test1 extends ListActivity{    private SQLiteDatabase  db = nu

Android学习笔记(四七):Content Provider初谈和Android联系人信息

Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据的增.删.改.查的操作.Android并不提供所有应用共享的数据存储,采用content Provider,提供简单便捷的接口来保持和获取数据,也可以实现跨应用的数据访问.简单地说,Android通过content Provider从数据的封装中获取信息. Content provider使用Uri

Android学习笔记(四三):文件访问

之前我们学习了通过preference和SQLite数据库进行数据存储,也可以通过文件方式.文件可以是在应用打包时预置,也可以是应用所生成. 文件访问有两种方式:一:静态数据的文件可以防止在res/raw中,这些文件是只读的,只有在应用版本升级的时候进行修改,或者我们先读出这些数据,通过 reference的方式来处理,这样以后可以进行修订,但是这种方式,会有两份数据保存.二:另一种方式是通过URL访问文件,动态数据的读取也可以采用SQLite3的方式. res/raw/下静态文件的读取 在re

Android学习笔记(四八):提供自己的Content Provider

在上一次的学习中,采用了原生的内容提供者Contact,Contact有多层映射关系,比较复杂,并非作为小例子的好选择,在本次学习中,我们将学习如何建立Content Provider,并通过Uri进行增删改查.如果应用的数据只需自己使用,并不需要content provider,相反避免这样做,可直接访问数据:但是若希望数据可以被其他应用访问,创建content provider就是常规手段. 再谈Content Provider的Uri 在上一次学习中,我们谈到了Uri的格式.现在已cont

Android学习笔记(四九):通过Content Provider访问数据

在上次笔记中,我们编写了自己的Provider,这次笔记,我们将通过Content Provider的Uri接口对数据进行访问,重写Android学习笔记(四二)中例子.在这里我们不在充分描述相关UI如何编写,可以到笔记(四二)中详细查看,重点讲述如何实现数据的访问. 读取信息 读取信息方式,在笔记(四七)中已经介绍,代码如下 private voidread(){     /* 通过managedQuery读取,第1参数表示URI, 第2参数表示所需读取的信息,第3个参数是限制条件,类似SQL