(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就挺好的。