SharedPreferences dùng để lưu trạng thái của ứng dụng, dạng file xml. Lớp
SharedPreferences cung cấp một framework giúp bạn có thể lưu trữ và đọc lên
những cặp key-value liên tục dữ liệu đơn giản. Có thể dùng SharedPreferences với
những kiểu dữ liệu như: booleans, floats, ints, longs, strings.
10 trang |
Chia sẻ: tieuaka001 | Lượt xem: 823 | Lượt tải: 0
Nội dung tài liệu Lập trình di động - Lab07: Data Storage, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Ver 1.0 – 2016, FIT - HCMUP Lab 07: Data Storage
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 1
1 Thao tác dữ liệu với SharedPreferences
SharedPreferences dùng để lưu trạng thái của ứng dụng, dạng file xml. Lớp
SharedPreferences cung cấp một framework giúp bạn có thể lưu trữ và đọc lên
những cặp key-value liên tục dữ liệu đơn giản. Có thể dùng SharedPreferences với
những kiểu dữ liệu như: booleans, floats, ints, longs, strings.
1.1 Thao tác đọc/ghi
1.1.1 Ghi dữ liệu
//Tạo đối tượng SharedPreferences
SharedPreferences sp = getSharedPreferences(fileName, MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
//Lưu dữ liệu
editor.putX(key, value); //X là kiểu dữ liệu
//Ví dụ kiểu string
editor.putString(“ten”,”kylh”);
//Hoàn thành
editor.commit();
1.1.2 Đọc dữ liệu
//Tạo đối tượng SharedPreferences
SharedPreferences sp = getSharedPreferences(fileName, MODE_PRIVATE);
//Đọc dữ liệu
sp.getX(key, default); //X là kiểu dữ liệu
//Ví dụ kiểu string
String t = sp.getString(“ten”, “”);
Ver 1.0 – 2016, FIT - HCMUP Lab 07: Data Storage
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 2
1.2 Thiết kế giao diện
1.3 Xử lý code đọc/ghi
Nếu người dùng check chọn ghi nhớ:
Tiến hành kiểm tra đăng nhập thành công (nếu có), lưu thông tin và mở màn hình
(Activity) cá nhân.
Ver 1.0 – 2016, FIT - HCMUP Lab 07: Data Storage
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 3
private void restoringPreferences() {
SharedPreferences pre = this.getSharedPreferences(prefname,
Context.MODE_PRIVATE);
if(pre != null) {
//lấy giá trị checked ra, nếu không thấy thì giá trị mặc định là false
boolean bchk = pre.getBoolean("checked", false);
if (bchk) {
//lấy user, pwd, nếu không thấy giá trị mặc định là rỗng
String user = pre.getString("user", "admin");
String pwd = pre.getString("pwd", "123");
txtUser.setText(user);
txtPass.setText(pwd);
}
chkGhiNho.setChecked(bchk);
}
}
private void savingPreferences(){
//tạo đối tượng getSharedPreferences
SharedPreferences pre = this.getSharedPreferences(prefname,
Context.MODE_PRIVATE);
//tạo đối tượng Editor để lưu thay đổi
SharedPreferences.Editor editor = pre.edit();
//Lưu trữ dữ liệu dạng key/value
String user = txtUser.getText().toString();
String pwd = txtPass.getText().toString();
boolean bchk = chkGhiNho.isChecked();
if(!bchk)
{
//xóa mọi lưu trữ trước đó
editor.clear();
}
Ver 1.0 – 2016, FIT - HCMUP Lab 07: Data Storage
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 4
else
{
//lưu vào editor
editor.putString("user", user);
editor.putString("pwd", pwd);
editor.putBoolean("checked", bchk);
}
//chấp nhận lưu xuống file
editor.commit();
}
1.4 Gắn code cho các sự kiện
1.4.1 Xử lý cho LoginActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
btnDangNhap = (Button)findViewById(R.id.btnDangNhap);
txtUser = (TextView)findViewById(R.id.txtUser);
txtPass = (TextView)findViewById(R.id.txtPass);
chkGhiNho = (CheckBox)findViewById(R.id.chkGhiNho);
btnDangNhap.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//luu trang thai
savingPreferences();
finish();//đóng màn hình hiện tại
Intent mh = new Intent(LoginActivity.this, LoginSuccessActivity.class);
//truyền dữ liệu qua màn hình mới
mh.putExtra("user", txtUser.getText().toString());
startActivity(mh);//mở màn hình mới
}
});
}
@Override
protected void onPause() {
Ver 1.0 – 2016, FIT - HCMUP Lab 07: Data Storage
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 5
super.onPause();
//gọi hàm lưu trạng thái
savingPreferences();
}
@Override
protected void onResume() {
super.onResume();
//gọi hàm đọc trạng thái ở đây
restoringPreferences();
}
1.4.2 LoginSuccessActivity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_success);
txtMsg=(TextView) findViewById(R.id.txtmsg);
btnThoat=(Button) findViewById(R.id.btnThoat);
btnThoat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
finish();
}
});
Intent i = getIntent();
txtMsg.setText("Hello : " + i.getStringExtra("user"));
}
Ver 1.0 – 2016, FIT - HCMUP Lab 07: Data Storage
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 6
1.5 Nơi lưu file
Mở cửa sổ Android Device Monitor. Chọn thiết bị, mở Tab File Explorer; thư mục
data/data//shared_prefs
2 Đọc ghi file Internal Storage – Bộ nhớ trong
Android Internal Storage: Lưu trữ các dữ liệu cá nhân của từng ứng dụng và chỉ sử dụng
cho riêng ứng dụng đó, các ứng dụng khác không thể truy cập vào được. Thông thường khi
ứng dụng bị gỡ bỏ khỏi thiết bị Android, các file dữ liệu liên quan cũng bị xóa bỏ theo.
2.1 Mô tả kịch bản
Ver 1.0 – 2016, FIT - HCMUP Lab 07: Data Storage
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 7
Bấm nút Write sẽ ghi thông tin xuống file ở bộ nhớ trong.
Bấm nút Read sẽ đọc thông tin từ file ở bộ nhớ trong hiển thị ra.
2.2 Thiết kế màn hình
2.3 Xử lý nút Read
btnReadIS.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
FileInputStream fis = openFileInput("data.txt");
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
String data = new String(buffer);
tvIS.setText(data);
fis.close();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
2.4 Xử lý nút Write
btnWriteIS.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Ver 1.0 – 2016, FIT - HCMUP Lab 07: Data Storage
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 8
FileOutputStream fos = openFileOutput("data.txt", MODE_PRIVATE);
fos.write((editText.getText() + "").getBytes());
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
2.5 Một số lưu ý
2.5.1 Các chế độ ghi
Chế độ tạo file Mô tả
MODE_PRIVATE
Đây là chế độ mặc định, file ghi ra chỉ được sử dụng
bởi ứng dụng tạo ra nó, hoặc chia sẻ với cùng User ID.
MODE_APPEND Chế độ nối thêm dữ liệu vào file nếu nó đã tồn tại.
MODE_WORLD_READABLE
Các chế độ này rất nguy hiểm, nó giống như một lỗ
hổng bảo mật trong Android, tốt nhất không nên sử
dụng, bạn có thể sử dụng các kỹ thuật khác thay thế
như:
ContentProvider
BroadcastReceiver
Service
MODE_WORLD_WRITEABLE
MODE_MULTI_PROCESS
Chế độ cho phép nhiều tiến trình (process) có thể ghi
vào file. Tuy nhiên khuyến nghị không sử dụng chế độ
này vì nó không làm việc trên một số phiên bản của
Android. Bạn có thể sử dụng kỹ thuật khác để thay thế,
chẳng hạn:
ContentProvider
2.5.2 File đã tạo nằm ở đâu
Vào menu Tool Android Android Device Monitor.
Ver 1.0 – 2016, FIT - HCMUP Lab 07: Data Storage
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 9
Sau đó chọn thiết bị tương ứng (nếu có nhiều thiết bị)
Ở cửa sổ File Explorer, chọn thư mục data/data//files
3 AutoComplete
Bổ sung thêm control dạng AutoCompleteTextView.
Thiết lập nguồn dữ liệu cho AutoCompleteTextView.
txtAuto = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView);
Ver 1.0 – 2016, FIT - HCMUP Lab 07: Data Storage
Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 10
//set dữ liệu cho AutoCompleteTextView
String[] dulieu = {"Quang Nam", "Quang Ngai", "Quang Binh",
"Quang Tri", "Phan Rang", "Phu Quoc", "Binh Thuan", "Binh Thanh", "Binh Dai"};
ArrayAdapter adapter = new ArrayAdapter(
MainActivity.this,
android.R.layout.simple_list_item_1,
dulieu
);
txtAuto.setAdapter(adapter);
Chạy thử ứng dụng:
Bổ sung sự kiện TextChanged:
txtAuto.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
txtDoc.setText(txtAuto.getText().toString());
}
});
Các file đính kèm theo tài liệu này:
- mad_lab07_datastorage_992.pdf