安卓存儲數據和文件系列3:SQLite數據庫方式

在android手機中使用SQLite數據庫方式進行數據的存儲,是一種常見的使用方式,可以存放文件,是以文件或內容的形式保存在android手機上的,訪問的時候不能跨應用。其中對數據庫進行增刪改查有兩種方式,一種是sql語句的方法,一種是使用系統自帶的輔助方式,這兩種方式達到的效果的相同的,因個人的喜好進行選擇。

整體思路:首先創建一個繼承SQLiteOpenHelper的DbOpenHelper類,在這個類中聲明數據庫的名字和版本,在類中的onCreate方法中寫創建表的語句,以·完成對數據庫中表的創建,在onUpgrade方法中,是用於對數據庫進行升級的,如執行一些sql語句用於做一些刪除表、添加表、添加一些字段或升級的事情,這方法當數據庫的版本發生變化的時候調用,而當版本發生變化的時候,不調用onCreate方法,而只調用onUpgrade方法。定義一個PersonService接口,在這個接口中定義增加、刪除、修改、查詢單條、查詢所有的操作的方法,然後創建一個PersonDao類,實現這個PersonService接口,並重寫裏面的各個方法。最後創建一個繼承AndroidTestCase的單元測試類MyTest,在這個類中,定義createDb方法,用於實例化DbOpenHelper這個類,並創建這個數據庫中的表,定義insertDb方法、deleteDb方法、updateDb方法、viewDb方法、listDb方法,分別完成增加、刪除、修改、查詢單條、查詢所有的操作。注意:在清單文件AndroidManifest.xml中註冊單元測試。兩種使用方式的本質不同是操作數據的方式不同,前者使用寫sql語句的形式進行對數據庫的操作,後者使用調用系統中已經封裝好的增刪改查的方式對數據庫進行操作,由於這樣的不同也會導致其他類的寫法略有不同,但是DbOpenHelper類的寫法是完全相同的。

DbOpenHelper.java文件:

public class DbOpenHelper extends SQLiteOpenHelper {

	private static String name="mydb.db";//表示數據庫的名稱
	private static int version=2;//表示數據庫的版本號碼   由1改爲2
	public DbOpenHelper(Context context) {
		super(context, name, null, version);
		// TODO Auto-generated constructor stub
	}

//	當數據庫被創建的時候第一次執行,完成對數據庫的表的創建
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
//	       支持的數據類型:整型數據、字符串類型、日期類型、二進制的數據類型
       String sql="create table person(id integer primary key autoincrement,name varchar(64),address varchar(64))";
       db.execSQL(sql);//完成數據庫的創建
	}

//	數據庫的升級,如某些字段太短了,存儲不了那麼多的內容或者缺少某些字段,我們可以完成對數據庫的升級,而不會損害原來的數據
//	刪除表、添加表或者做一些升級的事情
//	使用ALTER TABLE,添加一列,或者對列進行重命名
//	最後兩個參數是兩個版本號嗎:新的版本要比老的版本號碼大
//	如果把版本從1改爲2的話,不會執行onCreate方法,而是執行onUpgrade方法
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
        String sql="alter table person add sex varchar(8)";
        db.execSQL(sql);//使用這個方法來執行sql語句
	}

}

PersonService.java文件:

public interface PersonService {

//	分別爲:增加、刪除、修改、查詢單條、查詢所有的操作     第一種方式
	
	public boolean addPerson(Object[] parmas);
	
	public boolean deletePerson(Object[] parmas);
	
	public boolean updatePerson(Object[] parmas);
	
	public Map<String, String> viewPerson(String[] selectionArgs);
	
	public List<Map<String, String>> listPerson(String[] selectionArgs);
	
	
}
PersonService2.java文件:

public interface PersonService2 {

//	分別爲:增加、刪除、修改、查詢單條、查詢所有的操作     第二種方式
	
	public boolean addPerson(ContentValues values);
	
	public boolean deletePerson(String whereClause,String[] whereArgs);
	
	public boolean updatePerson(ContentValues values,String whereClause,String[] whereArgs);
	
	public Map<String, String> viewPerson(String selection,String[] selectionArgs);
	
	public List<Map<String, String>> listPerson(String selection,String[] selectionArgs);
	
	
}
PersonDao.java文件:

//實現PersonService接口,完成以下分別爲:增加、刪除、修改、查詢單條、查詢所有的功能     第一種方式
public class PersonDao implements PersonService {

	private DbOpenHelper helper=null;
	public PersonDao(Context context){
		helper=new DbOpenHelper(context);
	}
	@Override
	public boolean addPerson(Object[] parmas) {
		// TODO Auto-generated method stub
		boolean flag=false;
		SQLiteDatabase database=null;
		try {
			String sql="insert into person(name,address,sex) values (?,?,?)";
			database=helper.getWritableDatabase();//實現對數據庫的寫入的操作
			database.execSQL(sql,parmas);
			flag=true;
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return flag;
	}

	@Override
	public boolean deletePerson(Object[] parmas) {
		// TODO Auto-generated method stub
		boolean flag=false;
		SQLiteDatabase database=null;
		try {
			String sql="delete from person where id = ?";
			database=helper.getWritableDatabase();
			database.execSQL(sql,parmas);
			flag=true;
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return flag;
	}

	@Override
	public boolean updatePerson(Object[] parmas) {
		// TODO Auto-generated method stub
		boolean flag=false;
		SQLiteDatabase database=null;
		try {
			String sql="update person set name= ?,address= ?,sex= ? where id= ? ";
			database=helper.getWritableDatabase();
			database.execSQL(sql, parmas);
			flag=true;
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return flag;
	}

	@Override
	public Map<String, String> viewPerson(String[] selectionArgs) {
		// TODO Auto-generated method stub
		Map<String,String> map=new HashMap<String, String>();
		SQLiteDatabase database=null;
		try {
			String sql="select * from person where id = ?";
			database=helper.getReadableDatabase();//執行讀數據庫的操作
			Cursor cursor=database.rawQuery(sql, selectionArgs);//執行行(hang)查詢的操作,返回一個遊標
//			獲得數據庫列的個數
			int colums=cursor.getColumnCount();
			while (cursor.moveToNext()) {//如果有下一個位置的話
				for (int i = 0; i < colums; i++) {
					String cols_name=cursor.getColumnName(i);
					String cols_value=cursor.getString(cursor.getColumnIndex(cols_name));
					if(cols_value==null){
						cols_value="";
					}
					map.put(cols_name, cols_value);
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return map;
	}

	@Override
	public List<Map<String, String>> listPerson(String[] selectionArgs) {
		// TODO Auto-generated method stub
		List<Map<String, String>> list=new ArrayList<Map<String,String>>();
		SQLiteDatabase database=null;
		try {
			String sql="select * from person";
			database=helper.getReadableDatabase();
			Cursor cursor=database.rawQuery(sql, selectionArgs);//返回一個遊標
			int colums=cursor.getColumnCount();//獲取列的長度
			while (cursor.moveToNext()) {//循環遍歷這個遊標
				Map<String, String> map=new HashMap<String, String>();
				for (int i = 0; i < colums; i++) {
					String cols_name=cursor.getColumnName(i);
					String cols_value=cursor.getString(cursor.getColumnIndex(cols_name));
					if(cols_value==null){
						cols_value="";
					}
					map.put(cols_name, cols_value);
				}
				list.add(map);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return list;
	}

}
PersonDao2.java文件:

public class PersonDao2 implements PersonService2 {

	private DbOpenHelper helper = null;

	public PersonDao2(Context context) {
		helper = new DbOpenHelper(context);
	}

	@Override
	public boolean addPerson(ContentValues values) {
		// TODO Auto-generated method stub
		boolean flag = false;
		SQLiteDatabase database = null;
		long id = -1;
		try {
			database = helper.getWritableDatabase();
			id = database.insert("person", null, values);// 返回一個long類型的變量
			flag = (id != -1 ? true : false);
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (database != null) {
				database.close();
			}
		}
		return flag;
	}

	@Override
	public boolean deletePerson(String whereClause, String[] whereArgs) {
		// TODO Auto-generated method stub
		boolean flag = false;
		SQLiteDatabase database = null;
		int count = 0;
		try {
			database = helper.getWritableDatabase();
			count = database.delete("person", whereClause, whereArgs);// 返回影響的行數
			flag = (count > 0 ? true : false);
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (database != null) {
				database.close();
			}
		}
		return flag;
	}

	@Override
	public boolean updatePerson(ContentValues values, String whereClause,
			String[] whereArgs) {
		// TODO Auto-generated method stub
		boolean flag = false;
		SQLiteDatabase database = null;
		int count = 0;
		try {
			database = helper.getWritableDatabase();
			count = database.update("person", values, whereClause, whereArgs);// 返回影響的行數
			flag = (count > 0 ? true : false);
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (database != null) {
				database.close();
			}
		}
		return flag;
	}

	@Override
	public Map<String, String> viewPerson(String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		// select 返回的列名稱(投影查詢) from
		SQLiteDatabase database = null;
		Cursor cursor = null;
		Map<String, String> map = new HashMap<String, String>();
		try {
			database = helper.getReadableDatabase();
			// 第一個參數爲true,表示返回的結果是唯一的(查詢的是單條記錄),第二個參數是表名,第三個參數爲null,表示查詢所有的列值,
			cursor = database.query(true, "person", null, selection,
					selectionArgs, null, null, null, null);// 返回的結果是一個遊標
			int cols_len = cursor.getColumnCount();
			while (cursor.moveToNext()) {
				for (int i = 0; i < cols_len; i++) {
					String cols_name = cursor.getColumnName(i);
					String cols_value = cursor.getString(cursor
							.getColumnIndex(cols_name));
					if (cols_value == null) {
						cols_value = "";
					}
					map.put(cols_name, cols_value);
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			if (database != null) {
				database.close();
			}
		}
		return map;
	}

	@Override
	public List<Map<String, String>> listPerson(String selection,String[] selectionArgs) {
		// TODO Auto-generated method stub
		SQLiteDatabase database = null;
		Cursor cursor = null;
		List<Map<String, String>> list = new ArrayList<Map<String, String>>();
		try {
			database = helper.getReadableDatabase();
//			第一個參數爲false,表示查詢的爲多條記錄,
			cursor=database.query(false, "person", null, selection, selectionArgs,
					null, null, null, null);
			int cols_len = cursor.getColumnCount();
			while (cursor.moveToNext()) {
				Map<String, String> map=new HashMap<String, String>();
				for (int i = 0; i < cols_len; i++) {
					String cols_name = cursor.getColumnName(i);
					String cols_value = cursor.getString(cursor
							.getColumnIndex(cols_name));
					if (cols_value == null) {
						cols_value = "";
					}
					map.put(cols_name, cols_value);
				}
				list.add(map);
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			if (database != null) {
				database.close();
			}
		}
		return list;
	}
}
MyTest.java文件:

//測試創建數據庫並進行增加、刪除、修改、查詢單條、查詢所有的第一種方式的測試單元,直接在方法名上右鍵運行測試該方法,
//一個方法一個方法的測試
public class MyTest extends AndroidTestCase {

	public MyTest() {
		// TODO Auto-generated constructor stub
	}
	
	public void createDb(){
		DbOpenHelper helper=new DbOpenHelper(getContext());
		helper.getWritableDatabase();//只有調用這個方法的時候才真的創建了數據庫
	}
	
	public void insertDb(){
		PersonService service=new PersonDao(getContext());
//		Object[] parmas={"張三","北京","男"};
		Object[] parmas={"李四","上海","女"};
		boolean flag=service.addPerson(parmas);
		System.out.println("-->"+flag);
	}
	
	public void deleteDb(){
		PersonService service=new PersonDao(getContext());
		Object[] parmas={1};
		boolean flag=service.deletePerson(parmas);
		System.out.println("-->"+flag);
	}
	
	public void updateDb(){
		PersonService service=new PersonDao(getContext());
		Object[] parmas={"王五","曼谷","人妖","3"};
		service.updatePerson(parmas);
	}
	
	public void viewDb(){
		PersonService service=new PersonDao(getContext());
		String[] selectionArgs={"3"};
		Map<String, String> map = service.viewPerson(selectionArgs);
		Log.i("MyTest", "-->"+map.toString());
	}
	
	public void listDb(){
		PersonService service=new PersonDao(getContext());
		List<Map<String, String>> list = service.listPerson(null);//查詢所有記錄,不需要傳參數
		Log.i("MyTest", "-->"+list.toString());
	}


}
MyTest2.java文件:
//測試創建數據庫並進行增加、刪除、修改、查詢單條、查詢所有的第二種方式的測試單元,直接在方法名上右鍵運行測試該方法,
//一個方法一個方法的測試
public class MyTest2 extends AndroidTestCase {

	public MyTest2() {
		// TODO Auto-generated constructor stub
	}

	public void addPerson(){
		PersonService2 service2=new PersonDao2(getContext());
		ContentValues values=new ContentValues();//類似map的屬性
		values.put("name", "傑克");
		values.put("address", "天津");
		values.put("sex", "男");
		boolean flag=service2.addPerson(values);
		System.out.println("-->>"+flag);//輸出返回的結果
	}
	
	public void deletePerson(){
		PersonService2 service2=new PersonDao2(getContext());
//		標準的sql語句的寫法:delete from person where id=?  注意:寫下面這句代碼的時候不包含where關鍵字
		boolean flag=service2.deletePerson("id = ?", new String[]{"4"});
		System.out.println("-->>"+flag);//輸出返回的結果
	}
	
	public void updatePerson(){
		PersonService2 service2=new PersonDao2(getContext());
		ContentValues values=new ContentValues();//類似map的屬性
		values.put("name", "小羅志祥");
		values.put("address", "臺灣");
		values.put("sex", "女");
		boolean flag=service2.updatePerson(values, "id = ?", new String[]{"2"});
		System.out.println("-->>"+flag);//輸出返回的結果
	}
	
	public void viewPerson(){
		PersonService2 service2=new PersonDao2(getContext());
		Map<String, String> map=service2.viewPerson(" id=? ", new String[]{"2"});
		System.out.println("-->>"+map.toString());//輸出返回的結果
	}
	
	public void listPerson(){
		PersonService2 service2=new PersonDao2(getContext());
//		下面一句代碼等同於select *from person
		List<Map<String, String>> list=service2.listPerson(null, null);
		System.out.println("-->>"+list.toString());//輸出返回的結果
	}
	
}
AndroidManifest.xml文件:

 <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.android_db" >
    </instrumentation>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <uses-library android:name="android.test.runner"/>
        <activity
            android:name="com.example.android_db.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>



發佈了97 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章