目录
- SQLiteDatabase简介
- 创建数据库和表
- 使用SQL语句操作SQLite数据库
- 使用sqlite3工具
- 使用特定方法操作SQLite数据库
- 事务
- SQLiteOpenHelper类
- 英文生词本
一 对SQLite数据库的理解
- 它是android系统集成的一个轻量级的数据库
- 是一个嵌入式的数据库引擎??
- 适用于资源有限的设备上适量数据的存取
- 它只是一个文件
- SQLite的操作方式只是一种更为便捷的文件操作
- 当应用程序创建或打开一个SQLite数据库时,其实只是打开一个文件准备读写
二 SQLiteDatabase的理解
- android提供SQLiteDatabase代表一个数据库(底层是一个数据库文件)
- 通过SQLiteDatabase对象来管理操作数据库
- SQLiteDatabase提供了如下静态方法来打开一个文件对应的数据库
//1 打开path文件所代表的SQLite数据库
static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CursorFactory factory,int flags)
//2 打开或创建(如果不存在)file文件所代表的SQLite数据库
static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabase.CursorFactory factory)
//3 打开或创建(如果不存在)path文件所代表的SQLite数据库
static SQLiteDatabase openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)
- 在程序中获取SQLiteDatabase对象之后,就可以调用以下的方法来操作数据库了
//1 执行带占位符的sql语句
execSQL(String sql,Object[] bindArgs)
//2 执行sql语句
execSQL(String sql)
//3 向指定的表中插入数据
insert(String table,String nullColumnHack,ContentValues values)
//4 更新指定表中的特定数据
update(String table,ContentValues values,String whereClause,String[] whereArgs)
//5 删除指定表中的特定数据
delete(String table,String whereClause,String[] whereArgs)
//6.1 对指定数据表进行查询
Cursor query(String table,String[] columns,String whereClause,String[] whereArgs,String groupBy,String having,String OrderBy)
//6.2 limit控制最多查询几条记录
Cursor query(String table,String[] columns,String whereClause,String[] whereArgs,String groupBy,String having,String OrderBy,String limit)
//6.3 第一个参数控制是否去除重复值
Cursor query(boolean distinct,String table,String[] columns,String whereClause,String[] whereArgs,String groupBy,String having,String OrderBy,String limit)
//7 执行带占位符的sql查询
rawQuery(String sql,String[] selectionArgs)
//8 开始事务
beginTransaction()
//9 结束事务
endTransaction()
三 Cursor的理解
- Cursor提供以下的方法来移动查询结果的记录指针
//1 将记录指针向上或向下移动指定的行数,offset为正是向下移动,为负是向上移动
move(int offset)
//2 将记录指针移动到第一行,如果成功就返回true
boolean moveToFirst()
//3 将记录指针移动到最后一行,如果成功就返回true
boolean moveToLast()
//4 将记录指针移动到下一行,如果成功就返回true
boolean moveToNext()
//5 将记录指针移动到指定行,成功就返回true
boolean moveToPosition()
//6 将记录指针移动到上一行,成功返回true
boolean moveToPrevious()
- 一旦记录指针移动到指定行后,就可以调用Cursor的getXxx()方法获取该行的指定列的数据了
四 创建数据库和表
- 创建数据库
前面已经说过了,使用SQLiteDatabase的静态方法就可以打开或创建数据库,ex:
//如果有temp.db3就打开,没有就创建,这里没有指定SQLieDatabase.CursorFactory参数,该参数是一个用于返回Cursor的工厂,如果是null,就表示用默认的工厂,这行代码就可以返回一个SQLiteDatabase对象
SQLiteDatabase.openOrCreateDatabase("/mnt/db/temp.db3",null)
- 创建数据表
创建过SQLiteDatabase对象之后,该对象的execSQL()方法可以执行任意的sql语句,自然可以创建表
//定义创建表的语句
sql = "create table user_inf(user_id integer primary key,user_name varchar(255),user_pass varchar(255))"
//执行sql语句,db就是SQLiteDatabase
db.execSQL(sql);
五 使用SQL语句操作SQLite数据库
- SQLiteDatabase的execSQL()方法可以执行任意的SQL语句,包括带占位符的,但是该方法没有返回值,如果使用查询语句,可以调用rawQuery(String sql,String[] selectionArgs) 方法
ex:执行插入语句
db.insert("insert table tb_info values(null,?,?)",String[]{title,content});
- 以下程序示范如何在Android应用中操作数据库
package com.example.sqlshj;
import android.app.Activity;
import android.database.Cursor;
import android.database.SQLException;
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.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends Activity {
private SQLiteDatabase db;
private EditText title, content;
private String s_title, s_content;
private Button insert;
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建数据库
db = SQLiteDatabase.openOrCreateDatabase(getFilesDir() + "/temp.db3",
null);
initComponent();
setListener();
}
private void initData() {
s_title = title.getText().toString();
s_content = content.getText().toString();
}
private void setListener() {
insert.setOnClickListener(btListener);
}
private void initComponent() {
title = (EditText) findViewById(R.id.et_title);
content = (EditText) findViewById(R.id.et_content);
insert = (Button) findViewById(R.id.bt_insert);
lv = (ListView) findViewById(R.id.lv);
}
private OnClickListener btListener = new OnClickListener() {
@Override
public void onClick(View arg0) {
initData();
// 点击就插入数据到数据库,并查询数据库,将数据显示在listview中
try {
insertData(db, s_title, s_content);
Cursor cursor = db.rawQuery("select * from shj", null);
inflateList(cursor);
} catch (SQLException e) {
//创建表,表的主键列的列名必须是_id,因为SimpleCursorAdapter只能识别_id的主键
db.execSQL("create table shj (_id integer primary key autoincrement,table_title varchar(50),table_content varchar(255))");
insertData(db, s_title, s_content);
Cursor cursor = db.rawQuery("select * from shj", null);
inflateList(cursor);
}
}
private void inflateList(Cursor cursor) {
lv.setAdapter(new SimpleCursorAdapter(MainActivity.this,
R.layout.lv_item, cursor, new String[] { "table_title",
"table_content" }, new int[] { R.id.tv_title,
R.id.tv_content }));
}
private void insertData(SQLiteDatabase db, String s_title,
String s_content) {
db.execSQL("insert into shj values(null,?,?)", new String[] {
s_title, s_content });
}
};
//记得要关闭db,否则会资源泄露
protected void onDestroy() {
super.onDestroy();
if (db != null && db.isOpen()) {
db.close();
}
};
}
总结使用SQLiteDatabase操作数据库的步骤如下
- 获取SQListDatabase对象,他代表与数据库的连接
- 调用SQLiteDatabase的方法来执行SQL语句
- 操作SQL语句的执行结果,如用SimpleCursorAdapter来封装Cursor
- 关闭SQLiteDatabase,回收资源
六 SQLiteOpenHelper
- 对SQLiteOpenHelper类的理解
在上一个程序中,我们为了判断底层数据库是否包含shj数据表,采用以下方法:
try {
insertData(db, s_title, s_content);
Cursor cursor = db.rawQuery("select * from shj", null);
inflateList(cursor);
} catch (SQLException e) {
//创建表,表的主键列的列名必须是_id,因为SimpleCursorAdapter只能识别_id的主键
db.execSQL("create table shj (_id integer primary key autoincrement,table_title varchar(50),table_content varchar(255))");
insertData(db, s_title, s_content);
Cursor cursor = db.rawQuery("select * from shj", null);
inflateList(cursor);
}
程序先尝试向shj中插入数据,如果异常,在异常捕获的catch块中创建shj数据表,然后在插入记录。———–SQLiteOpenHelper可以处理这个问题
SQLiteOpenHelper是Android提供的用于管理数据库的工具类,管理数据库的创建与版本更新
SQLiteOpenHelper的用法:创建子类继承SQLiteOpenHelper,再重写onCreate(),onUpgrade()方法
- SQLiteOpenHelper的常用方法
//1 以读写的方式打开数据库对应的SQLiteDatabase对象
- synchronized SQLiteDatabase getReadableDatabase():
//2 以写的方式打开数据库对应的SQLiteDatabase对象
- synchronized SQLiteDatabase getWritableDatabase():
//3 当第一次创建数据库时回调
- abstract void onCreate(SQLiteDatabase db):
//4 当数据库版本更新是回调该方法
- abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion):
//关闭所有打开的SQLiteDatabase对象
- synchronized void close()
//构造方法?
super(Context context,String db_name,null,int version)
方法分析:
- 打开数据库连接:getReadableDatabase(),getWritabaleDatabase()
- 关闭数据库连接:close()
- 开发者要做的就是重新两个抽象方法onCreate(),onUpgrade()
- onCreate(SQLiteDatabase db):用于初次使用时生成数据库表。当调用SQLiteOpenHelper的getWritableDatabase(),或者getReadableDatabase()方法获取操作数据库的SQLiteDatabase实例时,如果数据库不存在,Android会自动生成一个数据库,接着会调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用。重写onCreate()方法时,可以生成数据表结构,以添加应用使用到的一些初始化数据。
- onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion):升级软件时更新数据库的表结构。在创建SQLiteOpenHelper对象时,必须指定一个version参数,这个参数就是版本号。提示:当应用程序升级表结构时,可能因为已有的数据导致升级失败,解决方案:先对数据进行转储,清空数据表中的记录,接着更新数据表,在将数据保存回来。
- 两个打开数据库方法的比较:
- getWritableDatabase():以写的方式打开数据库,当数据库磁盘满了,数据库就只能读,不能写,这时候,使用它打开数据库就会出错
- getReadabaleDatabase():以读写的方式打开数据库,但磁盘满了,就会打开失败,但是会尝试用只读的方式打开数据库。
疑问
- 什么是SQLiteDatabase? 数据库
- 怎样创建数据库和表
- sql语句的使用
- sqlite3工具如何使用
- 什么是事务
- SQLiteOpenHelper类的作用
- 什么事jdbc编程