Android基礎與應用 資料儲存與訪問

Walter Sun發表於2018-04-29

一、實驗目的

1. 掌握SharedPreferences的使用方法;

2. 掌握各種檔案儲存的區別與適用情況;

3. 瞭解SQLite資料庫的特點和體系結構;

4. 掌握SQLite資料庫的建立和操作方法;

5. 理解ContentProvider的用途和原理;

6. 掌握ContentProvider的建立與使用方法。

 

二、實驗過程

1、簡單儲存

使用SharedPreferences方式在程式關閉時儲存使用者在圖1.1的介面上輸入的資料,並在程式重新啟動時自動恢復這些資料。

onStart()函式中呼叫loadSharePreferences()函式,讀取儲存的資訊,在onStop()函式中呼叫saveSharePreferences()函式,在關閉時儲存介面上的資訊。

程式碼如下:

public static final String PREFERENCE_NAME = "SaveSetting";

public static int MODE = Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE;

@Override

protected void onStart() {

super.onStart();

loadSharePreferences();

}

private void loadSharePreferences() {

SharedPreferences share = getSharedPreferences(PREFERENCE_NAME, MODE);

String name = share.getString("name", "趙明");

    . . . . . .

e1.setText(name);

   . . . . . .

}

 

@Override

protected void onStop() {

super.onStop();

saveSharePreferences();

}

 

private void saveSharePreferences() {

SharedPreferences share = getSharedPreferences(PREFERENCE_NAME, MODE);

SharedPreferences.Editor editor = share.edit();

editor.putString("name", e1.getText().toString());

. . . . . . .

editor.commit();

}

效果如圖4.1所示

 

4.1 簡單儲存

 

 

 

2、建立儲存設定介面

為圖1.2設定選單項新增一個儲存設定子選單項

res->menu佈局檔案下建立子選單,效果如圖4.2所示。

 

 

4.2 設定子選單

 

建立新的Blank ActivityActivity NameLayout Name修改為有實際含義的名稱,其中資料庫儲存是預設選擇項。

Activity NameSaveActivity   Layout Nameactivity_save

如圖4.3所示:


4.3 儲存設定介面

 

當點選圖4.2儲存設定子選單項時,則啟動圖4.3的儲存設定介面。

程式碼如下:

int SUB1;

if(id==R.id.item2){

Intent intent = new Intent(MainActivity.this,SaveActivity.class);startActivityForResult(intent,SUB1);

}

 

當點選圖4.3確定按鈕則採用選擇的儲存方式儲存資料,同時返回到圖1.1的介面。

程式碼如下:

Button choose = (Button) findViewById(R.id.button1);

choose.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if(radio0.isChecked()) Saveway = "sql";

else if(radio1.isChecked()) Saveway = "inside";

else if(radio2.isChecked()) Saveway = "outside";

Uri data = Uri.parse(Saveway);

Intent result = new Intent(null,data);

setResult(RESULT_OK,result);

finish();

}

});

}

3、檔案儲存

當在圖4.2的儲存設定介面選擇內部儲存時,點選圖1.1介面上的新增按鈕則將介面上輸入的資料以檔案形式儲存在內部儲存器上。

當在圖4.2的儲存設定介面選擇外部儲存時,點選圖1.1介面上的新增按鈕則將介面上輸入的資料以檔案形式儲存在外部儲存器上。

 

4、資料庫儲存

當在圖4.2的儲存設定介面選擇資料庫儲存時,將圖1.1和圖2.2的介面上的相關資料儲存在SQLite資料庫中。

(1) MainActivity中的onActivityResult()函式中獲取從SaveActivity中獲取的代表儲存方式的變數Saveway

if(requestCode==SUB1){

if(resultCode==Activity.RESULT_OK){

Saveway = data.getData().toString();

}

}

 

2)在新增按鈕的點選事件上選擇儲存方式,其中StudentsqlSave()

inSideSave()outSideSave()分別為資料庫儲存,內部儲存,外部儲存的函式。

程式碼如下:

if(Saveway.equals("sql")){

dbadapter.open();

StudentsqlSave();

}

else if(Saveway.equals("inside")){

inSideSave();

}

else if(Saveway.equals("outside")){

outSideSave();//需要註冊

}else{

Toast.makeText(getApplicationContext(),"未設定儲存方式", Toast.LENGTH_LONG).show();

}

 

效果如圖4.44.54.6所示:

 

4.4 資料庫儲存        圖4.5 內部儲存        圖4.6 外部儲存

 

4.1 建立資料庫

建立SQLite資料庫,資料庫名稱自定義,並建立基本資訊表(BaseInfo)和專業資訊表(MajorInfo在完成建立資料庫的工作後,程式設計實現基本的資料庫操作功能,包括資料的新增、刪除、更新和查詢。

1)新建People

2)通過程式碼建庫,在DBAdapter類中封裝資料庫的建立、開啟和關閉等操作。

 

4.2 基本資訊表的操作

1)新增按鈕

在圖1.1的介面上新增刪除按鈕

點選新增按鈕,則把相關資料加入基本資訊表中,新增成功應當給出相應提示資訊,新增不成功要給出不成功原因的提示資訊。新增資料的同時要呼叫實驗三中的服務計算BMI指數。

1.在儲存時為People的體質項獲取服務中計算BMI的函式:

p.health =myservice.gettizhi(Double.valueOf(e3.getText().toString()),Double.valueOf(e2.getText().toString()));;

 2.在開啟基本資訊表的快捷選單檢視按鈕的點選事件中增加:

data.putString("name",p.toString());
     3.在子Activity中接受該資訊:

String msg = intent.getStringExtra("name");

 

點選刪除按鈕,則把基本資訊表中全部資料刪除,刪除操作前要給出相應提示資訊,確定是否刪除。

程式碼如下:

delete.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

new AlertDialog.Builder(MainActivity.this)

.setMessage("是否確定刪除?")

.setPositiveButton("確定",new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dbadapter.deleteALLDataStudent();

}

})

.setNegativeButton("取消", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

}

}).show();

}

效果如圖4.7所示:


4.7 刪除提示

2)新增快捷選單項

在圖1.4已有的快捷選單基礎上為4.3介面上的ListView控制元件對應的快捷選單新增修改刪除兩個選單項。

@Override

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {

menu.add(0, CONTEXT_MENU_1, 0, "檢視");

menu.add(0, CONTEXT_MENU_2, 1, "修改");

menu.add(0, CONTEXT_MENU_3, 2, "刪除");

}

效果如圖4.8所示:


4.8 快捷選單

 

點選檢視選單項則會啟動圖3.2的資訊顯示介面,此時該介面上應該顯示出所選擇檢視項的所有欄位資訊。

點選修改選單項則會根據介面上中輸入的內容修改所選擇項的相關資料庫記錄,同時更新下面的ListView控制元件列表,修改成功,則要給出相應提示,如果修改不成功,也要給出不成功原因的提示資訊。

程式碼如下:

if(item.getItemId()==CONTEXT_MENU_2){

People people = new People();

people.name = e1.getText().toString();

people.height = . . . . . .

.  . . . . . .. . . . . .. . . .. . . .. . . .. . . . .. . .

long id = am.position;

long count = dbadapter.updataOneDataStudent(id, people);

if (count == -1 ){

Toast.makeText(getApplicationContext(), "修改失敗", Toast.LENGTH_LONG).show();

} else {

Toast.makeText(getApplicationContext(), "修改成功", Toast.LENGTH_LONG).show();

}

list1.set(am.position, e1.getText().toString());

adapter.notifyDataSetChanged();

}

效果如圖4.9所示:


4.9 修改

 

點選刪除選單項則會刪除所選擇項的資料庫記錄,同時更新下面的ListView控制元件列表。

程式碼如下:

if(item.getItemId()==CONTEXT_MENU_3){

dbadapter.deleteOneDataStduent(am.position);

Toast.makeText(getApplicationContext(), "刪除成功", Toast.LENGTH_LONG).show();

list1.remove(am.position);

adapter.notifyDataSetChanged();

}

效果如圖4.10所示:

 

4.10  刪除

 

4.3 專業資訊表的操作

當點選專業設定選單項時,則會啟動專業設定介面,此時專業設定介面上應當將專業資訊表中的所有專業列出來。

點選新增按鈕則把EditText控制元件中輸入的專業名稱加入專業資訊表,同時更新下面的ListView控制元件列表,如果EditText控制元件為空,則要給出相應提示。

b1.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if(equals(e1.getText().toString())==false){

People people = new People();

people.major = e1.getText().toString();

dbadapter.insertMajor(people);

list1.add(e1.getText().toString());

adapter.notifyDataSetChanged();

}

else{

Toast.makeText(getApplicationContext(),"輸入為空", Toast.LENGTH_LONG).show();

}

}

});

 

長按專業設定介面上的ListView控制元件將啟動對應的快捷選單。

點選修改選單項則會根據EditText控制元件中輸入的內容修改所選擇項的相關資料庫記錄,同時更新下面的ListView控制元件列表,如果EditText控制元件為空,則要給出相應提示。

onContextItemSelected()加入如下程式碼:

case CONTEXT_MENU_01:

if(e1.getText().toString()!=null){

People people = new People();

people.major = e1.getText().toString();

dbadapter.updataOneDataMajor(a.position, people);

list1.set(a.position, e1.getText().toString());

adapter.notifyDataSetChanged();

}else

{

Toast.makeText(getApplicationContext(),"無替換內容", Toast.LENGTH_LONG).show();

}

 

 

點選刪除選單項則刪除所選擇項的資料庫記錄同時更新下面的ListView控制元件列表

case CONTEXT_MENU_02:

dbadapter.deleteOneDataMajor(a.position);

list1.remove(a.position);

adapter.notifyDataSetChanged();

break;

 

 

效果如圖4.114.124.13所示:

  

4.11 新增              圖4.12 刪除               圖4.13 修改

 

 

5、資料共享

在主介面上新增一個通訊錄選項選單。點選通訊錄選單項則利用ContentProvider元件獲取Android系統內建通訊錄裡的一條聯絡人資訊,將該條記錄的聯絡人姓名的姓名輸入框,然後將該聯絡人新增到基本資訊表中,同時更新介面上的ListView控制元件列表。

1)在res->meun中新建一個名為通訊錄的選項選單。

2)在模擬器的通訊錄中新建一個聯絡人。

3)在onOptionsItemSelected()中為選項選單新增事件,獲取新建聯絡人的姓名。

程式碼如下:

if(id==R.id.contentprovider){//通訊錄

String  result1 = null ;  

        ContentResolver cr = getContentResolver();       

        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

       if(cursor.moveToFirst())     

        {                

           result1 = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));      

        } else{

        result1 ="沒有聯絡人";        

        }

e1.setText(result1);

StudentsqlSave();

list1.add(e1.getText().toString());

adapter1.notifyDataSetChanged();

}

相關文章