深入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()方法
    }

  @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语句在同一个事务中执行。

你可能感兴趣的:(sql,android,sqlite)