一 android的数据库访问命令:
> sqlite3 jefry --jefry 为数据库名
sqlite> .schema --查看数据库中的表,显示建表语句
二 Java操作数据库主要有两种方法
第1种:execSQL()和rawQuery()方法
package com.sqllite;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DataBaseHelper extends SQLiteOpenHelper{
private static final String name = "jefry"; //数据库名称
private static final int version = 4; //数据库版本
public DataBaseHelper(Context context) {
super(context, name,null,version); // 数据库名称决定是否执行onCreate()方法,数据库的版本决定是否执行onUpgrade()方法
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("DataBaseHelper", "db create...");
db.execSQL("CREATE TABLE IF NOT EXISTS " +
"person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");
for(int i=0;i<20;i++) {
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"emily"+ i, 22});
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS person");
onCreate(db);
}
public void queryPersons(SQLiteDatabase db){
Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"emily%", "22"});
while (cursor.moveToNext()) {
int personid = cursor.getInt(0);
String personname = cursor.getString(1);
int personage = cursor.getInt(2);
if(personid<10) {
Log.i("DataBaseHelper", "[id= "+personid+",name="+personname+" ,age="+personage +"]");
} else {
Log.i("DataBaseHelper", "[id="+personid+",name="+personname+",age="+personage +"]");
}
}
}
}
第2种 insert()、delete()、update()和query()方法
package com.sqllite;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DataBase2Helper extends SQLiteOpenHelper{
private static final String name = "jefry"; //数据库名称
private static final int version = 4; //数据库版本
public DataBase2Helper(Context context) {
super(context, name,null,version);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("DataBaseHelper", "db create...");
db.execSQL("CREATE TABLE IF NOT EXISTS " +
"person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");
for(int i=0;i<20;i++) {
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"emily"+ i, 22});
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS person");
onCreate(db);
}
public long insert(SQLiteDatabase db){
ContentValues values = new ContentValues();
values.put("age", 4);
return db.insert("person", null, values); //第二个参数为空值字段,这里的name=null;select * from person where name is null;
}
/** delete()方法的使用:
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.delete("person", "personid<?", new String[]{"2"});
db.close();
**/
public long delete(SQLiteDatabase db){
return db.delete("person", "personid<?", new String[]{"2"});
}
public long update(SQLiteDatabase db){
ContentValues values = new ContentValues();
values.put("name", "jefry");//key为字段名,value为值
return db.update("person", values, "personid=?", new String[]{"1"});
}
/**
query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各参数的含义:
table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。
columns:要查询出来的列名。相当于select语句select关键字后面的部分。
selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”
selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
groupBy:相当于select语句group by关键字后面的部分
having:相当于select语句having关键字后面的部分
orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;
limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。
*/
public void query(SQLiteDatabase db){
Cursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"%jefry%"}, null, null, "personid desc", "1,2");
while (cursor.moveToNext()) {
int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
String name = cursor.getString(1);//获取第二列的值
int age = cursor.getInt(2);//获取第三列的值
}
cursor.close();
}
}
三 事务与注意:
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
第一次调用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper会缓存当前的SQLiteDatabase实例,SQLiteDatabase实例正常情况下会维持数据库的打开状态,所以在你不再需要SQLiteDatabase实例时,请及时调用close()方法释放资源。一旦SQLiteDatabase实例被缓存,多次调用getWritableDatabase()或getReadableDatabase()方法得到的都是同一实例。
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。使用例子如下: SQLiteDatabase db = ....;
db.beginTransaction();//开始事务
try {
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"jefry", 4});
db.execSQL("update person set name=? where personid=?", new Object[]{"jefry", 1});
db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务
} finally {
db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务
}
db.close();
上面两条SQL语句在同一个事务中执行。