SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。SQLite3支持 NULL、INTEGER、REAL(浮点数字)、 TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3也接受varchar(n)、 char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。例如:可以在Integer字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段中保存除整数以外的数据时,将会产生错误。另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息。
SQLite特性:
1. ACID事务 2. 零配置 – 无需安装和管理配置 3. 储存在单一磁盘文件中的一个完整的数据库
4. 数据库文件可以在不同字节顺序的机器间自由的共享 5. 支持数据库大小至2TB 6. 足够小, 大致3万行C代码, 250K 7. 比一些流行的数据库在大部分普通数据库操作要快 8. 简单, 轻松的API 9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定 10. 良好注释的源代码, 并且有着90%以上的测试覆盖率 11. 独立: 没有额外依赖 12. Source完全的Open, 你可以用于任何用途, 包括出售它 13. 支持多种开发语言,C, PHP, Perl, Java, ASP .NET,Python。
SQLiteOpenHelper:
SQLiteOpenHelper是一个很好的辅助类,简化了数据库的操作。按照Android SDK文档中的说明,可以通过继承此类、改写其接口的方法来实现对数据库的操作,SQLiteOpenHelper主要方法如下:
synchronized void | close() Close any open database object. |
synchronized SQLiteDatabase | getReadableDatabase() Create and/or open a database. |
synchronized SQLiteDatabase | getWritableDatabase() Create and/or open a database that will be used for reading and writing. |
abstract void | onCreate(SQLiteDatabase db) Called when the database is created for the first time. |
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. |
SQLiteDatabase:
Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加 (Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对 SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。 execSQL()方法可以执行insert、 delete、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法可以执行select语句。其主要方法如下:
|
|
|
insert(String table, String nullColumnHack, ContentValues values)Convenience method for inserting a row into the database.
|
|
delete(String table, String whereClause, String[] whereArgs)Convenience method for deleting rows in the database.
|
|
query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)Query the given table, returning a Cursor over the result set.
|
|
update(String table, ContentValues values, String whereClause, String[] whereArgs)Convenience method for updating rows in the database.
|
下面是一个简单的例子:
DatabaseHelper为SQLite的工具类,SQLiteActivity为具体数据操作的Activity类,mian.xml布局文件有六个按钮,增删改查以及表创建与更新。
-------------------------DatabaseHelper-------------------------
package cn.com.pan.DB;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;
//在SQLiteOepnHelper的子类当中,必须有该构造函数
public DatabaseHelper(Context context, String name, CursorFactory factory,
int version) {
//必须通过super调用父类当中的构造函数
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
public DatabaseHelper(Context context,String name){
this(context,name,VERSION);
}
public DatabaseHelper(Context context,String name,int version){
this(context, name,null,version);
}
//该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
System.out.println("create a Database");
//execSQL函数用于执行SQL语句
db.execSQL("create table user(id int,name varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
//这里简单处理下,只打印了一句话,用作测试。
System.out.println("update a Database");
}
}
----------------------------------SQLiteActivity-------------------------------
package cn.com.pan;
import cn.com.pan.DB.DatabaseHelper;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class SQLiteActivity extends Activity {
private Button createButton;
private Button insertButton;
private Button updateButton;
private Button updateRecordButton;
private Button queryButton;
private Button deleteButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
createButton = (Button)findViewById(R.id.createDatabase);
updateButton = (Button)findViewById(R.id.updateDatabase);
insertButton = (Button)findViewById(R.id.insert);
updateRecordButton = (Button)findViewById(R.id.update);
deleteButton = (Button)findViewById(R.id.delete);
queryButton = (Button)findViewById(R.id.query);
createButton.setOnClickListener(new CreateListener());
updateButton.setOnClickListener(new UpdateListener());
insertButton.setOnClickListener(new InsertListener());
updateRecordButton.setOnClickListener(new UpdateRecordListener());
queryButton.setOnClickListener(new QueryListener());
deleteButton.setOnClickListener(new DeleteListener());
}
class CreateListener implements OnClickListener{
@Override
public void onClick(View v) {
Toast.makeText(SQLiteActivity.this,"创建一个DatabaseHelper对象", Toast.LENGTH_SHORT).show();
//创建一个DatabaseHelper对象
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_db");
//只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库
SQLiteDatabase db = dbHelper.getReadableDatabase();
}
}
class UpdateListener implements OnClickListener{
@Override
public void onClick(View v) {
Toast.makeText(SQLiteActivity.this,"更新DatabaseHelper对象", Toast.LENGTH_SHORT).show();
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_db",2);
SQLiteDatabase db = dbHelper.getReadableDatabase();
}
}
class InsertListener implements OnClickListener{
@Override
public void onClick(View v) {
Toast.makeText(SQLiteActivity.this,"插入数据", Toast.LENGTH_SHORT).show();
//生成ContentValues对象
ContentValues values = new ContentValues();
//想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致
values.put("id", 1);
values.put("name","pan");
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_db",2);
SQLiteDatabase db = dbHelper.getWritableDatabase();
//调用insert方法,就可以将数据插入到数据库当中
db.insert("user", null, values);
}
}
//更新操作就相当于执行SQL语句当中的update语句
class UpdateRecordListener implements OnClickListener{
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Toast.makeText(SQLiteActivity.this,"更新数据", Toast.LENGTH_SHORT).show();
//得到一个可写的SQLiteDatabase对象
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_db");
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "zhangsan");
//第一个参数是要更新的表名
//第二个参数是一个ContentValeus对象
//第三个参数是where子句
db.update("user", values, "id=?", new String[]{"1"});
}
}
class QueryListener implements OnClickListener{
@Override
public void onClick(View v) {
System.out.println("--------query----------");
Log.d("myDebug", "myFirstDebugMsg");
Toast.makeText(SQLiteActivity.this,"查询数据", Toast.LENGTH_SHORT).show();
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_db");
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null);
while(cursor.moveToNext()){
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
System.out.println("id---" +id+" name---" + name);
}
}
}
class DeleteListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println("----delete---");
Toast.makeText(SQLiteActivity.this,"删除数据", Toast.LENGTH_SHORT).show();
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_db");
SQLiteDatabase db = dbHelper.getWritableDatabase();
//删除记录
db.delete("user","id=?", new String[]{"1"});
}
}
}
------------------------------------main.xml---------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello" />
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:layout_weight="1">
<TableRow>
<Button android:id="@+id/createDatabase" android:layout_width="150dip"
android:layout_height="wrap_content" android:text="创建数据库" />
<Button android:id="@+id/updateDatabase" android:layout_width="150dip"
android:layout_height="wrap_content" android:text="更新数据库" />
</TableRow>
<TableRow>
<Button android:id="@+id/insert" android:layout_width="150dip"
android:layout_height="wrap_content" android:text="插入" />
<Button android:id="@+id/update" android:layout_width="150dip"
android:layout_height="wrap_content" android:text="更新" />
</TableRow>
<TableRow>
<Button android:id="@+id/query" android:layout_width="150dip"
android:layout_height="wrap_content" android:text="查询" />
<Button android:id="@+id/delete" android:layout_width="150dip"
android:layout_height="wrap_content" android:text="删除" />
</TableRow>
</TableLayout>
</LinearLayout>