1. 程式人生 > >安卓sqlite之增刪改查(一)

安卓sqlite之增刪改查(一)

在安卓開發中不可避免的會遇到在手機中儲存資料的時候,如果只是小量資料(如儲存設定等)的話,用SharedPreferences是個極好的選擇,它以鍵值對的形式儲存資料,但是如果資料量比較多的話,比如一個鍵對應了一個集合的情況,此時再用SharedPreferences儲存資料就顯得吃力了,如果再需要對資料進行修改刪除的操作,這個儲存資料的方法明顯不適合了,所以安卓本身也內建了sqlite資料庫,對於儲存app裡面的資料已經夠了。

新建安卓工程後新建一個類:DatabaseDBOpenHelper.java,該類繼承自SQLiteOpenHelper,主要用於新建資料庫,新建資料表和更新資料庫:

public class DatabaseDBOpenHelper extends SQLiteOpenHelper {

	/**
	 * 資料庫建立的構造方法  資料庫名稱  text.db ,版本號為1
	 * @param context
	 */
	public DatabaseDBOpenHelper(Context context) {
		super(context, "text.db", null, 1);
	}

	/**
	 * 初始化資料庫的表結構
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table student (id integer primary key autoincrement,name varchar(50),age integer,sex varchar(5),class varchar(50))");
	}

	/**
	 * 資料庫版本升級時呼叫
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		
	}
}
改類中的構造方法用於建立資料庫和初始版本號;onCreate方法用於初始化資料庫的表結構,這裡新建了一個student表,裡面有id(主鍵),name,age,sex和class;onUpgrade方法用於資料庫版本升級時呼叫,此時可以用測試類去測試一下看看新建語法有沒有問題,看看有沒有新建資料庫:在清單檔案中application節點上方新增四行程式碼(第三行要寫自己應用的包名)
 <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.testsqlite" >
    </instrumentation>
然後在application節點中的theme下面新增一行程式碼:<uses-library android:name="android.test.runner" />,接著新建測試類Testsqlite繼承自AndroidTestCase,最後編寫測試程式碼就可以了:
public void testCreateDatabase() {
		DatabaseDao dao = new DatabaseDao(getContext());
	}
右鍵執行該測試方法,如果在左邊的工具欄中JUnit下面的條變綠就表示新建資料庫成功了,此時在File Explorer 的data/data/包名  目錄下就可以看到新建成功的資料庫和表結構,可以匯出來用SQLite Expert Personal 3工具開啟,沒安裝該工具的可以下載,簡單安裝即可使用非常方便:點選開啟連結

接下來就是增加,刪除,修改,查詢資料了,在SQLite Expert Personal 3工具裡也可以先執行sqlite指令對錶資料進行操作,其實在把指令寫進程式碼之前可以先用該工具執行需要進行的指令以驗證sqlite語句是否正確。

OK,現在用Java程式碼實現增刪改查方法:

	 * 向資料庫中新增資料
	 * @param name
	 * @param age
	 * @param sex
	 * @param whichclass
	 */
	public void addStudent(String name, int age, String sex, String whichclass){
		SQLiteDatabase db = helper.getWritableDatabase();
		db.execSQL("insert into student(name,age,sex,class) values(?,?,?,?)",
				new Object[]{name, age, sex, whichclass});
	}
/**
	 * 根據name值刪除資料
	 * @param name
	 */
	public void deleteStudent(String name){
		SQLiteDatabase db = helper.getWritableDatabase();
		db.execSQL("delete from student where name=?",new Object[]{name});
	}
/**
	 * 根據name值修改表中資料
	 * @param name
	 * @param age
	 * @param sex
	 * @param whichclass
	 */
	public void updateStudent(String name, int age, String sex, String whichclass){
		SQLiteDatabase db = helper.getWritableDatabase();
		db.execSQL("update student set age=?, sex=?,class=? where name=?", 
				new Object[]{age, sex, whichclass, name});
	}
/**
	 * 根據name值查詢資料
	 * @param name
	 * @return
	 */
	public StudentInfo findStudent(String name){
		SQLiteDatabase db = helper.getWritableDatabase();
		Cursor cursor = db.rawQuery("select age,sex,class from student where name=?",
				new String[]{name});
		if(cursor.moveToNext()){
			StudentInfo info = new StudentInfo();
			info.setAge(cursor.getInt(0));
			info.setSex(cursor.getString(1));
			info.setWhichclass(cursor.getString(2));
			return info;
		}
		cursor.close();
		return null;
	}
/**
	 * 查詢全部資料
	 * @return
	 */
	public ArrayList<StudentInfo> findAllstudent(){
		SQLiteDatabase db = helper.getWritableDatabase();
		ArrayList<StudentInfo> list = new ArrayList<StudentInfo>();
		Cursor cursor = db.rawQuery("select * from student",null);
		for (int i = 0; i < cursor.getCount(); i++) {
			cursor.moveToNext();
			StudentInfo info = new StudentInfo();
			info.setName(cursor.getString(1));
			info.setAge(cursor.getInt(2));
			info.setSex(cursor.getString(3));
			info.setWhichclass(cursor.getString(4));
			list.add(info);
		}
		cursor.close();
		db.close();
		return list;
	}
/**
	 * 獲取記錄總數
	 * @return
	 */
	public long getCounts(){
		SQLiteDatabase db = helper.getWritableDatabase();
		Cursor cursor = db.query("student",new String[]{"count(*)"},null,null,null,null,null);
		if(cursor.moveToNext()){
			return cursor.getLong(0);
		}
		return 0;
	}

其實安卓除了使用rawQuery()和execSQL()方法操作資料外還有另外一種API可以對資料進行增刪改查:

	 * 向資料庫中新增資料(另一種方法實現)
	 * @param name
	 * @param age
	 * @param sex
	 * @param whichclass
	 */
	public void addStudent1(String name, int age, String sex, String whichclass){
		SQLiteDatabase db = helper.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put("name", name);
		values.put("age", age);
		values.put("sex", sex);
		values.put("class", whichclass);
		db.insert("student", null, values);
		db.close();
	}
/**
	 * 根據name值刪除資料(另一種實現方法)
	 * @param name
	 */
	public void deleteStudent1(String name){
		SQLiteDatabase db = helper.getWritableDatabase();
		db.delete("student", "name=?", new String[]{name});
	}
/**
	 * 根據name值修改表中資料(另一種方法實現)
	 * @param name
	 * @param age
	 * @param sex
	 * @param whichclass
	 */
	public void updateStudent1(String name, int age, String sex, String whichclass){
		SQLiteDatabase db = helper.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put("age", age);
		values.put("sex", sex);
		values.put("class", whichclass);
		db.update("student", values, "name=?", new String[]{name});
	}
/**
	 * 根據name值查詢資料(另一種查詢方法)
	 * @param name
	 * @return
	 */
	public StudentInfo findStudent1(String name){
		SQLiteDatabase db = helper.getWritableDatabase();
		Cursor cursor = db.query("student", new String[]{"name","age","sex","class"},
				"name=?", new String[]{name},null, null, null);
		if(cursor.moveToNext()){
			StudentInfo info = new StudentInfo();
			info.setName(cursor.getString(0));
			info.setAge(cursor.getInt(1));
			info.setSex(cursor.getString(2));
			info.setWhichclass(cursor.getString(3));
			return info;
		}
		cursor.close();
		return null;
	}
剩下的就是在測試類中寫測試程式碼來測試每個方法了,我已經將這些例子寫成demo了,有興趣的朋友可以下載看看共同學習進步,demo下載:點選開啟下載demo 下一篇將會分享分頁查詢(有demo)和事物。