Android数据库操作
2011-03-09 11:40
232 查看
本文同时发表在自己的博客:月城小馆Android数据库操作
Android采用关系型数据库SQLite3,它是一个支持SQL的轻量级的嵌入式数据库,在嵌入式操作上有很广泛的。
在api,所有数据库相关的接口、类都在android.database和android.database.sqlite两个包下,这两个包中包含的接口和类比较多,特别是android.database包,但我们真正用的到的没有几个,而且我们最经常使用的类或者接口都在android.database.sqlite包中。
最经常使用的是两个类和一个接口:抽象类SQLiteOpenHelper 和SQLiteDatabase,接口Cursor。SQLiteOpenHelper类主要负责创建和打开数据库,产生一个SQLiteDatabase对象;而对数据库的CRUD操作基本都是由SQLiteDatabase类中的方法完成。因此Android数据库操作中我们一般的步骤是:
(1)先使用SQLiteOpenHelper类的继承类来创建数据库并新建我们需要的数据表;
(2)从该类中拿到SQLiteDatabase;
(3)利用SQLiteDatabase对象进行数据的增、删、查、改操作。
下面分别看这些接口和类:
1、android.database.sqlite.SQLiteOpenHelper
这是一个抽象类,所以要使用它就一定是继承它!这个类中方法不多,一看也就能明白,API文档中的摘要如下表:
只有一个构造方法 SQLiteOpenHelper(android.content.Context context, java.lang.String name,android.database.sqlite.SQLiteDatabase.CursorFactory factory, int version);
参数不做过多的解释,CursorFactory一般直接传null就可以。按照前面说的Android数据库操作的一般步骤,就知道常用的方法是下面三个:
public void onCreate(SQLiteDatabase db)
此方法在创建数据库是被调用,所以,应该把创建表的操作放到这个方法里面。
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
从方法名上我们就能知道这个方法是执行更新的,没错,当version改变是系统会调用这个方法,所以在这个方法里应该执行删除现有表,然后手动调用onCreate的操作。
SQLiteDatabase getReadableDatabase()
可读的SQLiteDatabase对象。
SQLiteDatabase getWritableDatabase()
获取可写的SQLiteDatabase对象。
2、android.database.sqlite.SQLiteDatabase
这个类的方法较多。主要都是关于操作数据库的方法(增、删、查、改)。
)]execSQL(String sql, Object[] bindArgs)
和execSQL(String sql) 执行SQL语句,前面一个方法还可以传入绑定的参数。用这两个方法再配合传入的SQL语句可以非常方便的执行增、删、改等数据库常用操作,但是按照API的说法,这两个方法都是执行非查询语句,如果需要查询就不能使用了,因为它们也没有返回值。
ong insert(TABLE_NAME, null, contentValues)添加记录
int delete(TABLE_NAME, where, whereValue)删除记录
int update(TABLE_NAME, contentValues, where, whereValue) 更新记录
Cursor query(TABLE_NAME, null, null, null, null, null, null) 查询记录
除此之外,还有很多方法,如:beginTransaction()开始事务、endTransaction()结束事务等等,有兴趣的可以自己看api。
3、android.database.Cursor
游标(接口),这个很熟悉了吧,Cursor里的方法非常多,常用的有:
boolean moveToPosition(position)将指针移动到某记录
getColumnIndex(Contacts.People.NAME)按列名获取id
int getCount()获取记录总数
boolean requery()重新查询
boolean isAfterLast()指针是否在末尾
boolean isBeforeFirst()时候是开始位置
boolean isFirst()是否是第一条记录
boolean isLast()是否是最后一条记录
还有这几个方法,一看名字就知道是什么意思了,不再多说:boolean moveToFirst(),boolean moveToLast(),boolean moveToNext(),功能与moveToPosition(position)类似。
另外还有一个比较重要的关于游标的适配器类:android.widget.SimpleCursorAdapter。
如果经常使用列表,并且从数据库中读取数据显示在列表上,可以有两种方式,一是先从数据库中读取数据保存到一个List中,然后再用这个List构造列表的适配器;另外一种方式就是直接使用游标适配器了,这个时候这个游标适配器就发挥重要作用了,一般的使用方式为:
SimpleCursorAdapter
adapter = new SimpleCursorAdapter(
this,
R.layout.list,
myCursor,
new String[] {DB.COL1,DB. COL2},
new int[]{ R.id.listItem1,R.id.listItem2}
);
listView.setAdapter(adapter);
从代码看使用方法和一般的List适配器基本类似,一共5个参数,具体如下:
参数1:上下文变量Context
参数2:列表使用的布局
参数3:Cursor游标对象
参数4:显示的字段,传入String[]
参数5:显示字段使用的组件,传入int[],该数组中是TextView组件的id
下面给出一个具体的代码:
/**
*
*/
package com.joyband.android;
import android.app.ListActivity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
/**
* @author admin
*
*/
public class DBDemo extends ListActivity {
private ListView myList;
private LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT);
private DatabaseHelper dbHelper;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myList = new ListView(this);
myList.setLayoutParams(lp);
setContentView(myList);
dbHelper = new DatabaseHelper(this);
Cursor cursor = dbHelper.query();
SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_2,
cursor,
new String[]{"name","email"},
new int[]{android.R.layout.simple_list_item_1,android.R.layout.simple_list_item_2}
);
myList.setAdapter(cursorAdapter);
}
}
class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "myfirstdb.db";
private static final int DB_VERSION = 1;
private static final String TB_NAME = "tab1";
public DatabaseHelper(Context ctx) {
super(ctx, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
StringBuffer sql = new StringBuffer();
sql.append("CREATE TABLE ").append(TB_NAME).append(" (");
sql
.append("id INTEGER DEFAULT '1' NOT NULL PRIMARY KEY AUTOINCREMENT,");
sql.append("name TEXT NOT NULL,");
sql.append("email TEXT NOT NULL,");
sql.append("desc TEXT NOT NULL,");
sql.append("ext1 TEXT NOT NULL").append(")");
db.execSQL(sql.toString());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
StringBuffer sql = new StringBuffer();
sql.append("DROP TABLE IF EXISTS ").append(TB_NAME);
db.execSQL(sql.toString());
onCreate(db);
}
/**
* 成功返回刚刚新增记录的rowId,否则返回-1
*
* @param userInfo
* @return
*/
public long insert(String[] userInfo) {
// db的打开已经实现了缓存
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", userInfo[1]);
values.put("email", userInfo[2]);
values.put("desc", userInfo[3]);
values.put("ext1", userInfo[4]);
return db.insert(TB_NAME, null, values);
}
public void delete(String userId) {
SQLiteDatabase db = getWritableDatabase();
// db.delete(TB_NAME, "id='"+userId+"'", null);
db.delete(TB_NAME, "id=?", new String[] { userId });
}
public void update(String[] userInfo) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", userInfo[1]);
values.put("email", userInfo[2]);
values.put("desc", userInfo[3]);
values.put("ext1", userInfo[4]);
db.update(TB_NAME, values, "id=?", new String[] { userInfo[0] });
}
public Cursor query(String condition, String[] args) {
SQLiteDatabase db = getWritableDatabase();
String[] columns = { "id", "name", "email", "desc" };
Cursor c = db.query(TB_NAME, columns, condition, args, null, null,"id desc");
if(c != null){
c.moveToFirst();
}
return c;
}
public Cursor query() {
SQLiteDatabase db = getWritableDatabase();
String[] columns = { "id", "name", "email", "desc" };
Cursor c = db.query(TB_NAME, columns, null, null, null, null, "id desc");
if(c != null){
c.moveToFirst();
}
return c;
}
}
Android采用关系型数据库SQLite3,它是一个支持SQL的轻量级的嵌入式数据库,在嵌入式操作上有很广泛的。
在api,所有数据库相关的接口、类都在android.database和android.database.sqlite两个包下,这两个包中包含的接口和类比较多,特别是android.database包,但我们真正用的到的没有几个,而且我们最经常使用的类或者接口都在android.database.sqlite包中。
最经常使用的是两个类和一个接口:抽象类SQLiteOpenHelper 和SQLiteDatabase,接口Cursor。SQLiteOpenHelper类主要负责创建和打开数据库,产生一个SQLiteDatabase对象;而对数据库的CRUD操作基本都是由SQLiteDatabase类中的方法完成。因此Android数据库操作中我们一般的步骤是:
(1)先使用SQLiteOpenHelper类的继承类来创建数据库并新建我们需要的数据表;
(2)从该类中拿到SQLiteDatabase;
(3)利用SQLiteDatabase对象进行数据的增、删、查、改操作。
下面分别看这些接口和类:
1、android.database.sqlite.SQLiteOpenHelper
这是一个抽象类,所以要使用它就一定是继承它!这个类中方法不多,一看也就能明白,API文档中的摘要如下表:
Public Constructors | |
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) Create a helper object to create, open, and/or manage a database. | |
Public Methods | |
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. |
参数不做过多的解释,CursorFactory一般直接传null就可以。按照前面说的Android数据库操作的一般步骤,就知道常用的方法是下面三个:
public void onCreate(SQLiteDatabase db)
此方法在创建数据库是被调用,所以,应该把创建表的操作放到这个方法里面。
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
从方法名上我们就能知道这个方法是执行更新的,没错,当version改变是系统会调用这个方法,所以在这个方法里应该执行删除现有表,然后手动调用onCreate的操作。
SQLiteDatabase getReadableDatabase()
可读的SQLiteDatabase对象。
SQLiteDatabase getWritableDatabase()
获取可写的SQLiteDatabase对象。
2、android.database.sqlite.SQLiteDatabase
这个类的方法较多。主要都是关于操作数据库的方法(增、删、查、改)。
)]execSQL(String sql, Object[] bindArgs)
和execSQL(String sql) 执行SQL语句,前面一个方法还可以传入绑定的参数。用这两个方法再配合传入的SQL语句可以非常方便的执行增、删、改等数据库常用操作,但是按照API的说法,这两个方法都是执行非查询语句,如果需要查询就不能使用了,因为它们也没有返回值。
ong insert(TABLE_NAME, null, contentValues)添加记录
int delete(TABLE_NAME, where, whereValue)删除记录
int update(TABLE_NAME, contentValues, where, whereValue) 更新记录
Cursor query(TABLE_NAME, null, null, null, null, null, null) 查询记录
除此之外,还有很多方法,如:beginTransaction()开始事务、endTransaction()结束事务等等,有兴趣的可以自己看api。
3、android.database.Cursor
游标(接口),这个很熟悉了吧,Cursor里的方法非常多,常用的有:
boolean moveToPosition(position)将指针移动到某记录
getColumnIndex(Contacts.People.NAME)按列名获取id
int getCount()获取记录总数
boolean requery()重新查询
boolean isAfterLast()指针是否在末尾
boolean isBeforeFirst()时候是开始位置
boolean isFirst()是否是第一条记录
boolean isLast()是否是最后一条记录
还有这几个方法,一看名字就知道是什么意思了,不再多说:boolean moveToFirst(),boolean moveToLast(),boolean moveToNext(),功能与moveToPosition(position)类似。
另外还有一个比较重要的关于游标的适配器类:android.widget.SimpleCursorAdapter。
如果经常使用列表,并且从数据库中读取数据显示在列表上,可以有两种方式,一是先从数据库中读取数据保存到一个List中,然后再用这个List构造列表的适配器;另外一种方式就是直接使用游标适配器了,这个时候这个游标适配器就发挥重要作用了,一般的使用方式为:
SimpleCursorAdapter
adapter = new SimpleCursorAdapter(
this,
R.layout.list,
myCursor,
new String[] {DB.COL1,DB. COL2},
new int[]{ R.id.listItem1,R.id.listItem2}
);
listView.setAdapter(adapter);
从代码看使用方法和一般的List适配器基本类似,一共5个参数,具体如下:
参数1:上下文变量Context
参数2:列表使用的布局
参数3:Cursor游标对象
参数4:显示的字段,传入String[]
参数5:显示字段使用的组件,传入int[],该数组中是TextView组件的id
下面给出一个具体的代码:
/**
*
*/
package com.joyband.android;
import android.app.ListActivity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
/**
* @author admin
*
*/
public class DBDemo extends ListActivity {
private ListView myList;
private LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT);
private DatabaseHelper dbHelper;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myList = new ListView(this);
myList.setLayoutParams(lp);
setContentView(myList);
dbHelper = new DatabaseHelper(this);
Cursor cursor = dbHelper.query();
SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_2,
cursor,
new String[]{"name","email"},
new int[]{android.R.layout.simple_list_item_1,android.R.layout.simple_list_item_2}
);
myList.setAdapter(cursorAdapter);
}
}
class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "myfirstdb.db";
private static final int DB_VERSION = 1;
private static final String TB_NAME = "tab1";
public DatabaseHelper(Context ctx) {
super(ctx, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
StringBuffer sql = new StringBuffer();
sql.append("CREATE TABLE ").append(TB_NAME).append(" (");
sql
.append("id INTEGER DEFAULT '1' NOT NULL PRIMARY KEY AUTOINCREMENT,");
sql.append("name TEXT NOT NULL,");
sql.append("email TEXT NOT NULL,");
sql.append("desc TEXT NOT NULL,");
sql.append("ext1 TEXT NOT NULL").append(")");
db.execSQL(sql.toString());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
StringBuffer sql = new StringBuffer();
sql.append("DROP TABLE IF EXISTS ").append(TB_NAME);
db.execSQL(sql.toString());
onCreate(db);
}
/**
* 成功返回刚刚新增记录的rowId,否则返回-1
*
* @param userInfo
* @return
*/
public long insert(String[] userInfo) {
// db的打开已经实现了缓存
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", userInfo[1]);
values.put("email", userInfo[2]);
values.put("desc", userInfo[3]);
values.put("ext1", userInfo[4]);
return db.insert(TB_NAME, null, values);
}
public void delete(String userId) {
SQLiteDatabase db = getWritableDatabase();
// db.delete(TB_NAME, "id='"+userId+"'", null);
db.delete(TB_NAME, "id=?", new String[] { userId });
}
public void update(String[] userInfo) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", userInfo[1]);
values.put("email", userInfo[2]);
values.put("desc", userInfo[3]);
values.put("ext1", userInfo[4]);
db.update(TB_NAME, values, "id=?", new String[] { userInfo[0] });
}
public Cursor query(String condition, String[] args) {
SQLiteDatabase db = getWritableDatabase();
String[] columns = { "id", "name", "email", "desc" };
Cursor c = db.query(TB_NAME, columns, condition, args, null, null,"id desc");
if(c != null){
c.moveToFirst();
}
return c;
}
public Cursor query() {
SQLiteDatabase db = getWritableDatabase();
String[] columns = { "id", "name", "email", "desc" };
Cursor c = db.query(TB_NAME, columns, null, null, null, null, "id desc");
if(c != null){
c.moveToFirst();
}
return c;
}
}
相关文章推荐
- android学习 --数据库操作
- 我的android 第15天 -使用SQLiteOpenHelper获取用于操作数据库的SQLiteDatabase实例
- Android数据库LitePal的存储操作
- Android-ContentProvider数据库操作
- 可视化操作android数据库文件
- Android中的数据库操作
- adb、sqlite3操作android数据库
- android 反射来操作数据库
- android数据库操作之直接读取db文件
- android中的数据库操作
- Android 数据库的操作
- android 对apk中已经存在的数据库操作
- Android 数据库操作
- Android数据库操作
- RxAndroid之操作数据库SqlBrite(RXAndroid实现数据库的增、删、改、查)
- android数据库操作
- Android SQLite数据库增删改查操作的使用详解
- Android GreenDao数据库操作之增删改查
- android_数据库操作_LitePal框架
- Android数据库高手秘籍(六)——LitePal的修改和删除操作