Jefry 发表于 2013-1-30 01:05:49

深入android数据库操作

一 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()方法    }@Overridepublic 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", "");    } else {    Log.i("DataBaseHelper", "");    }    }   }}
第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);    }@Overridepublic 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语句在同一个事务中执行。
页: [1]
查看完整版本: 深入android数据库操作