Android中SQlite的使用

sqlite數據庫 是一個開源項目,是一個輕量的關係型數據庫。

如何使用它呢,創建它的代碼如下。

首先創建一個DBOpenHelper的類,繼承SQLiteOpenHelper。

public class MyDBOpenHelper extends SQLiteOpenHelper {

	/**
	 * 
	 * @param context 應用程序上下文
	 * @param name    數據庫的名字
	 * @param factory 查詢數據庫的遊標工廠 一般情況下 用sdk默認的
	 * @param version  數據庫的版本 版本號必須不小1 
	 *  
	 */
	public DBOpenHelper(Context context) {
		super(context, "test.db", null, 5);
	}

	// 在dbOpenHelper 在數據庫第一次被創建的時候  會執行onCreate();
	@Override
	public void onCreate(SQLiteDatabase db) {
		System.out.println("我被調用了 oncreate");
		db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		System.out.println("on update ");
		db.execSQL("ALTER TABLE person ADD phone VARCHAR(12) NULL ");
	}
}

onCreate只會在數據庫第一次創建的時候被執行。

onUpdate方法在數據可版本Version變化是被執行,用語跟新表。

這句代碼就會在test.db中創建一張表TABLE.

		db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))");


在Activity中,使用getReadableDatabase就可得到一個可讀的數據庫了。
		DBHelper  db=new DBHelper(this);
		db.getReadableDatabase();



關於數據庫的增刪該查

public class PersonDAO {
	private DBHelper helper;

	public PersonDAO(Context context) {
		helper = new DBHelper(context);
	}

	/**
	 * 增加一條記錄
	 * */
	public void add(String name) {
		SQLiteDatabase db = helper.getWritableDatabase();
		if (db.isOpen()) {
			/* db.execSQL("insert into person (name) values("+name+")");//寫法一 */
			db.execSQL("insert into person (name) values (?)",
					new Object[] { name });// 寫法二
			db.close();
		}
	}

	/**
	 * 查找一條記錄
	 * */
	public boolean find(String name) {
		boolean result = false;
		SQLiteDatabase db = helper.getReadableDatabase();
		if (db.isOpen()) {
			Cursor cursor = db.rawQuery("select * from person where name=?",
					new String[] { name });
			if (cursor.moveToFirst()) {// 如果遊標能夠移動到第一位
				int index = cursor.getColumnIndex("personid");// 得到name在表中是第幾列
				String id = cursor.getString(index);
				Log.i("TAG", name + "的ID是" + id);
				result = true;
				// 記得關閉掉cursor
				cursor.close();
			}
			result = false;
			db.close();
		}
		return result;

	}

	/***
	 * 刪除一條記錄
	 * 
	 * @param name
	 */
	public void delete(String name) {
		SQLiteDatabase db = helper.getWritableDatabase();
		if (db.isOpen()) {
			db.execSQL("delete from person where name=?", new Object[] { name });
			db.close();
		}
	}

	/**
	 * 跟新一條數據
	 * */
	public boolean update(String oldName, String newName) {
		SQLiteDatabase db = helper.getWritableDatabase();
		if (db.isOpen()) {
			db.execSQL("update person set name=? where name=?", new Object[] {
					newName, oldName });
			db.close();
			return true;
		}
		return false;
	}

}

在Activity中,只要
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		PersonDAO personDAO=new PersonDAO(this);
		personDAO.add("張三");
		
		
	}


}


 

 

 

也可以使用自帶的API來操作數據庫,這樣不用自己寫sql語句。

public class PersonDBDao {
	private Context context;
	MyDBOpenHelper dbOpenHelper;

	public PersonDBDao(Context context) {
		this.context = context;
		dbOpenHelper = new MyDBOpenHelper(context);
	}

	/**
	 * 添加一條記錄
	 */
	public void add(String name, int age) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		if (db.isOpen()) {
			// db.execSQL("insert into person (name,age) values (?,?)",new
			// Object[]{name,age});
			// db.execSQL("insert into person ",null) // 不合法的sql語句
			ContentValues values = new ContentValues();
			values.put("name", name);
			values.put("age", age);
			// 如果 contentvalues爲空
			db.insert("person", null, values); // 組拼sql語句完成的添加的操作
			
			//第二個參數null的意義:如果values爲空則執行 insert into person name values (NULL) ;
			db.close();
		}

	}

	/**
	 * 刪除一條記錄
	 */
	public void delete(String name) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		if (db.isOpen()) {
			db.delete("person", "name=?", new String[] { name });
			db.close();
		}
	}

	/**
	 * 數據庫的更改操作
	 */
	public void update(String name, String newname, int newage) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		if (db.isOpen()) {
			ContentValues values = new ContentValues();
			values.put("name", newname);
			values.put("age", newage);
			db.update("person", values, "name=?", new String[] { name });
			db.close();
		}
	}

	/**
	 * 數據庫的查詢操作
	 */
	public boolean find(String name) {
		boolean result = false;
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		if (db.isOpen()) {
			// select * from person
			Cursor cursor = db.query("person", null, "name=?",
					new String[] { name }, null, null, null);
			if (cursor.moveToFirst()) {
				result = true;
			}
			cursor.close();
			db.close();
		}
		return result;

	}

	/**
	 * 查詢所有信息
	 */
	public List<Person> findAll() {
		List<Person> persons = null;
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		if (db.isOpen()) {
			Cursor cursor = db.query("person", null, null, null, null, null,
					null);
			persons = new ArrayList<Person>();
			while (cursor.moveToNext()) {
				Person person = new Person();
				String name = cursor.getString(cursor.getColumnIndex("name"));
				person.setName(name);
				int age = cursor.getInt(cursor.getColumnIndex("age"));
				person.setAge(age);
				persons.add(person);
			}
			cursor.close();
			db.close();
		}
		return persons;
	}
	/**
	 * 查詢所有信息
	 */
	public Cursor findAllbyCursor() {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		if (db.isOpen()) {
			/*Cursor cursor = db.query("person", null, null, null, null, null,
					null);*/
			Cursor cursor = db.rawQuery("select personid as _id,age,name from person", null);
			
			return cursor;
			// 注意了  一定不要把數據庫 關閉了 
			}
		return null;
		
	}}



 涉及到事務的操作,用一下例子來說明:

/**
	 * 銀行轉賬的方法
	 */
	public void transaction() {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		if (db.isOpen()) {

			try {
				// 開啓數據庫的事務
				db.beginTransaction();
				// 給張三設置1000塊錢的賬戶
				db.execSQL("update person set account=? where name=?",
						new Object[] { 1000, "zhangsan98" });
				// 把張三的賬戶扣除200塊錢
				db.execSQL("update person set account=account-? where name=?",
						new Object[] { 200, "zhangsan98" });
				// 出現了異常
				// 把張三的錢給李四
				//初始化李四賬戶 爲 0
				db.execSQL("update person set account=? where name=?",
						new Object[] { 0, "lisi" });
				db.execSQL("update person set account=account+? where name=?",
						new Object[] { 200, "lisi" });
				db.setTransactionSuccessful();
			}
			// 顯示的設置事務是否成功
			catch (Exception e) {
				// TODO: handle exception
			} finally {
				db.endTransaction();
				db.close();
			}
		}
	}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章