Android入门笔记之Sqlite
<1>简介
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。
SQLite由以下几个部分组成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),是调试、修改和扩展SQLite的内核变得更加方便。所有SQL语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。
值得一提的是,袖珍型的SQLite竟然可以支持高达2TB大小的数据库,每个数据库都是以单个文件的形式存在,这些数据都是以B-Tree的数据结构形式存储在磁盘上。
在事务处理方面,SQLite通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程想数据库执行写操作之前,必须获得独占锁。在获得独占锁之后,其他的读或写操作将不会再发生。
SQLite采用动态数据类型,当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储,SQLite称这为“弱类型”。但有一个特例,如果是INTEGER PRIMARY KEY,则其他类型不会被转换,会报一个“datatype missmatch”的错误。
概括来讲,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型,分别代表空值、整型值、浮点值、字符串文本、二进制对象。
<2>关键步骤
一、 创建数据库
通过openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)方法创建数据库。
iteDatabase db=this.openOrCreateDatabase("test_db.db",
Context.MODE_PRIVATE, null);
或者SQLiteDatabasedb2 =
SQLiteDatabase.openOrCreateDatabase("/data/data/com.test/databases/test_db2.db3",null);
如上两种方式均能创建数据库,this.openOrCreateDatabase是对SQLiteDatabase.openOrCreateDatabase而来,如代码所见,原生的SQLiteDatabase.openOrCreateDatabase()方法第一参数要求输入绝对路劲,而所有的数据库都是储存于“data/data/应用报名/databases”目录下,所以输入完全的绝对路劲是一件重复且繁杂的工作。采用this.openOrCreateDatabase则省去了此操作。
另外还可以通过写一个继承SQLiteOpenHelper类的方式创建数据库,此种方式是一种更加进阶的创建方式。
SQLiteOpenHelper的使用方法
SQLiteOpenHelper是一个辅助类来管理数据库的创建和版本。
可以通过继承这个类,实现它的一些方法来对数据库进行一些操作。
所有继承了这个类的类都必须实现下面这样的一个构造方法:
public DatabaseHelper(Context context, Stringname, CursorFactory factory, int version)
第一个参数:Context类型,上下文对象。
第二个参数:String类型,数据库的名称
第三个参数:CursorFactory类型
第四个参数:int类型,数据库版本
下面是这个类的几个方法:
方法名 返回类型 描述 备注
getReadableDatabase() synchronized SQLiteDatabase 创建或打开一个数据库可以通过这两个方法返回的SQLiteDatabase对象对数据库进行一系列的操作,如新建一个表,插入一条数据等
getWritableDatabase() synchronized SQLiteDatabase 创建或打开一个可以读写的数据库
onCreate(SQLiteDatabase db) abstract void 第一次创建的时候调用
onOpen(SQLiteDatabase db) void 打开数据库
onUpgrade(SQLiteDatabase db,int oldVersion,intnewVersion) abstract void 升级数据库
close() synchronized void 关闭所有打开的数据库对象
<3>出现的问题
可从DDMS中导出db文件。
<4>代码及解释
Activity_sqlite.xml:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/dbcreate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="create" />
<Button
android:id="@+id/dbupgrade"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="upgrade" />
<Button
android:id="@+id/dbinsert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="insert" />
<Button
android:id="@+id/dbdelete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="delete" />
<Button
android:id="@+id/dbselect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="select" />
<Button
android:id="@+id/dbupdate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="update" />
<TextView
android:id="@+id/dbview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="view" />
</LinearLayout>
SqliteActivity.java:
package com.func;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import com.test.R;
public class SqliteActivity extends Activity{
/**
* @ProjectName: [androidtest]
* @Package: [com.func.SqliteActivity.java]
* @ClassName: [SqliteActivity]
* @Description:
* @Author: [gmj]
* @CreateDate: [2013-9-7 下午8:00:49]
* @Version: [v1.0]
*/
private Button createDatabaseButton = null;
private Button updateDatabaseButton = null;
private Button insertButton = null;
private Button updateButton = null;
private Button selectButton = null;
private Button deleteButton = null;
private TextView tv = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite);
createDatabaseButton = (Button) findViewById(R.id.dbcreate);
updateDatabaseButton = (Button) findViewById(R.id.dbupgrade);
insertButton = (Button) findViewById(R.id.dbinsert);
updateButton = (Button) findViewById(R.id.dbupdate);
selectButton = (Button) findViewById(R.id.dbselect);
deleteButton = (Button) findViewById(R.id.dbdelete);
tv = (TextView) findViewById(R.id.dbview);
createDatabaseButton.setOnClickListener(new CreateDatabaseOnClickListener());
updateDatabaseButton.setOnClickListener(new UpdateDatabaseOnClickListener());
insertButton.setOnClickListener(new InsertOnClickListener());
updateButton.setOnClickListener(new UpdateOnClickListener());
selectButton.setOnClickListener(new SelectOnClickListener());
deleteButton.setOnClickListener(new DeleteOnClickListener());
}
class CreateDatabaseOnClickListener implements OnClickListener {
public void onClick(View v) {
// 创建了一个DatabaseHelper对象,只执行这句话是不会创建或打开连接的
SqliteHelper dbHelper = new SqliteHelper(SqliteActivity.this , "test_db");
SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();
}
}
// updateDatabaseButton点击事件监听器
class UpdateDatabaseOnClickListener implements OnClickListener {
public void onClick(View v) {
// TODO Auto-generated method stub
SqliteHelper dbHelper = new SqliteHelper(SqliteActivity.this , "test_db" , 2);
// 得到一个只读的SQLiteDatabase对象
SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();
}
}
// insertButton点击事件监听器
class InsertOnClickListener implements OnClickListener {
public void onClick(View v) {
// 创建ContentValues对象
ContentValues values = new ContentValues();
// 向该对象中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致
values.put("id", 1);
values.put("name", "abc");
// 创建DatabaseHelper对象
SqliteHelper dbHelper = new SqliteHelper(SqliteActivity.this , "test_db" , 2);
// 得到一个可写的SQLiteDatabase对象
SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
// 调用insert方法,就可以将数据插入到数据库当中
// 第一个参数:表名称
// 第二个参数:SQl不允许一个空列,如果ContentValues是空的,那么这一列被明确的指明为NULL值
// 第三个参数:ContentValues对象
sqliteDatabase.insert("user", null, values);
}
}
// updateButton点击事件监听器
class UpdateOnClickListener implements OnClickListener {
public void onClick(View v) {
// 创建一个DatabaseHelper对象
SqliteHelper dbHelper = new SqliteHelper(SqliteActivity.this , "test_db" , 2);
// 得到一个可写的SQLiteDatabase对象
SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
// 创建一个ContentValues对象
ContentValues values = new ContentValues();
values.put("name", "ggg");
// 调用update方法
// 第一个参数String:表名
// 第二个参数ContentValues:ContentValues对象
// 第三个参数String:where字句,相当于sql语句where后面的语句,?号是占位符
// 第四个参数String[]:占位符的值
sqliteDatabase.update("user", values, "id=?", new String[] { "1" });
System.out.println("-----------update------------");
}
}
// selectButton点击事件监听器
class SelectOnClickListener implements OnClickListener {
public void onClick(View v) {
String id = null;
String name = null;
//创建DatabaseHelper对象
SqliteHelper dbHelper = new SqliteHelper(SqliteActivity.this , "test_db" , 2);
// 得到一个只读的SQLiteDatabase对象
SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();
// 调用SQLiteDatabase对象的query方法进行查询,返回一个Cursor对象:由数据库查询返回的结果集对象
// 第一个参数String:表名
// 第二个参数String[]:要查询的列名
// 第三个参数String:查询条件
// 第四个参数String[]:查询条件的参数
// 第五个参数String:对查询的结果进行分组
// 第六个参数String:对分组的结果进行限制
// 第七个参数String:对查询的结果进行排序
Cursor cursor = sqliteDatabase.query("user", new String[] { "id",
"name" }, "id=?", new String[] { "1" }, null, null, null);
// 将光标移动到下一行,从而判断该结果集是否还有下一条数据,如果有则返回true,没有则返回false
while (cursor.moveToNext()) {
id = cursor.getString(cursor.getColumnIndex("id"));
name = cursor.getString(cursor.getColumnIndex("name"));
}
tv.setText("id: "+id + "\nname: "+name);
System.out.println("-------------select------------");
System.out.println("id: "+id);
System.out.println("name: "+name);
}
}
// deleteButton点击事件监听器
class DeleteOnClickListener implements OnClickListener {
public void onClick(View v) {
//创建DatabaseHelper对象
SqliteHelper dbHelper = new SqliteHelper(SqliteActivity.this , "test_db" , 2);
//获得可写的SQLiteDatabase对象
SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
//调用SQLiteDatabase对象的delete方法进行删除操作
//第一个参数String:表名
//第二个参数String:条件语句
//第三个参数String[]:条件值
sqliteDatabase.delete("user", "id=?", new String[]{"1"});
System.out.println("----------delete----------");
}
}
}
SqliteHelper.java:
package com.func;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
public class SqliteHelper extends SQLiteOpenHelper{
public SqliteHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
public SqliteHelper(Context context, String name, int version){
this(context,name,null,version);
}
public SqliteHelper(Context context, String name){
this(context,name,1);
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
System.out.println("create a db");
arg0.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("upgrade a db");
}
}