简介: SQLite 是一款非常流行的嵌入式数据库,它支持 SQL 查询,并且只用很少的内存。Android 在运行时集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。对数熟悉 SQL 的开发人员来时,使用 SQLite 相当简单。可以,由于 JDBC 不适合手机这种内存受限设备,所以 Android 开发人员需要学习新的 API 来使用 SQLite。本文主要讲解 SQLite 在 Android 环境中的基本使用。
SQLite 介绍
SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite.
SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。
SQLite 基本上符合 SQL-92 标准,和其他的主要 SQL 数据库没什么区别。它的优点就是高效,Android 运行时环境包含了完整的 SQLite。
SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite 称这为“弱类型”(manifest typing.)。
此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。
除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。
Android 集成了 SQLite 数据库
Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQLite 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些 API。
数据库存储在 data/< 项目文件夹 >/databases/ 下。
(以上内容摘自网络)
下面我们来学习在Android 开发中如何使用SQLite
我们先来创建一个数据库:
private static class DatabaseHelper extends SQLiteOpenHelper {
private static int version = 1;
public DatabaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
public DatabaseHelper(Context context, String name) {
this(context, name, version);
}
public DatabaseHelper(Context context, String name, int version) {
this(context, name, null, version);
}
//在数据库第一次生成的时候会调用这个方法,一般我们在这个方法里生成数据表
@Override
public void onCreate(SQLiteDatabase db) {
// 创建数据库的SQL
String sql = "CREATE TABLE dbk(title TEXT NO NULL,body TEXT NO NULL)";
Log.i("dbk:createDB", sql);
db.execSQL(sql);
db.close();
}
//当数据库需要升级时,Android系统会自动调用这个方法,一般我们在这里写删除表并创建新表的操作
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
DatabaseHelper是一个辅助类,这个类主要是生成一个数据库,并对数据库进行版本管理,
当在程序中调用这个类的方法getWritableDatabase()和getReadableDatabase()进行写读操作的时候,如果当时没有数据库,那么Android系统会自动创建一个数据库。
我写了个对数据库进行增、删、改、查基本操作的小东西,以此为例,我们来看一下具体的过程:
界面如下:
插入
插入数据的代码如下:
private void insertItem() {
DatabaseHelper databaseHelper = new DatabaseHelper(SQLiteActivity.this,
"dbk");
SQLiteDatabase db = databaseHelper.getWritableDatabase();
String sql1 = "INSERT INTO dbk(title,body) VALUES('第一条数据','Android很有钱途')";
String sql2 = "INSERT INTO dbk(title,body) VALUES('第二条数据','Android开发很有趣')";
try {
Log.i("dbk:sql1", sql1);
Log.i("dbk:sql2", sql2);
db.execSQL(sql1);
db.execSQL(sql2);
setTitle("数据插入成功");
} catch (Exception e) {
setTitle("数据插入失败");
}
db.close();
}
db.close();是对数据库执行关闭操作,如过你用完数据库后,不在很短的时间内进行下次使用,那么建议关掉数据库,以节省资源。
查询
我在查询里面加了对话框来方便理解,
代码如下:
btn2 = (Button) findViewById(R.id.btn2);
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
DatabaseHelper helper = new DatabaseHelper(SQLiteActivity.this,
"dbk");
// 定义读数据库操作
SQLiteDatabase db = helper.getReadableDatabase();
String col[] = { "title", "body" };
/*
* 执行数据库查询功能 第一个参数:表名 第二个参数:要查询的列的信息
* 第三个参数:条件,相当于SQL中的where部分,如果想查询所以则为null
* 第四个参数:如果在第三个参数中有“?”符号,那么第四个参数的字串符会代替第三个的“?”部分
* 第五个参数:定义查询出来的数据是否分组,相当于SQL的GROUP BY,null为不分组
* 第六个参数:相当于SQL的having部分 第七个参数:相当于SQL的ORDEY BY来描述是否排序,为null则不排序
*/
Cursor cusor = db.query("dbk", col, null, null, null, null,
null);
if (cusor.moveToNext()) {
String title = cusor.getString(cusor
.getColumnIndex("title"));
String body = cusor.getString(cusor.getColumnIndex("body"));
final Integer num = cusor.getCount();
setTitle(title);
// 弹出一个对话框,来显示第一条数据
dialog(SQLiteActivity.this, title, body, num).show();
} else {
// 如果数据库中没有数据则提示
new AlertDialog.Builder(SQLiteActivity.this)
.setTitle("数据库中没有数据")
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
}
}).create().show();
}
db.close();
}
});
我写了详细注释,这里就不用解释什么了吧?查询成功的提示框代码这里就不贴出来了,我会在源码中为大家打包。
修改
修改代码如下,注释已经给大家写的很详细了:
btn3 = (Button) findViewById(R.id.btn3);
btn3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ContentValues args = new ContentValues();
args.put("body", "修改后啦!");
String[] title = new String[] { "第二条数据" };
DatabaseHelper helper = new DatabaseHelper(SQLiteActivity.this,
"dbk");
// 定义写数据库操作
SQLiteDatabase db = helper.getWritableDatabase();
/*
* 修改数据库 第一个参数是:数据库表名 第二个参数是:要修改的字段和要更新的内容
* 第三个参数是:条件,相当于SQL中的where部分
* 第四个参数是:如果在第三个参数中有“?”符号,那么第四个参数的字串符会代替第三个的“?”部分
*/
db.update("dbk", args, "title=?", title);
db.close();
}
});
删除
删除操作的代码如下:
btn4 = (Button) findViewById(R.id.btn4);
btn4.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
DatabaseHelper helper = new DatabaseHelper(
SQLiteActivity.this, "dbk");
// 定义写数据库操作
SQLiteDatabase db = helper.getWritableDatabase();
/*
* 删除操作 第一个参数是:数据库表名 第二个参数是:条件,相当于SQL中的where部分
* 第三个参数是:如果在第三个参数中有“?”符号,那么第四个参数的字串符会代替第三个的“?”部分
*/
db.delete("dbk", "title='第二条数据'", null);
setTitle("删除title为第二条数据的记录");
db.close();
} catch (Exception e) {
}
}
});
如果你想做Android开发,就一定会在Android上存储数据,SQLite是一个不错的选择。本文主要介绍了如和操作SQLite数据库,同过本文你可以学会在对Android上SQLite数据库的基本操作,从而更进一步学习Android开发。
大家可以下去试试给修改也加个提示信息?测试一下是不是每次对数据库进行操作都会执行DatabaseHelper里面的onCreate方法?我们可不可以在onCreate里面加上db.execSQL(“DROP TABLE IF EXISTS dbk”);呢?把你的测试结果给大家分享一下?
【下载源码请点这里】