1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tiểu luận: Data Storage in Android

33 484 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 33
Dung lượng 470,6 KB

Nội dung

TRƯỜNG ĐẠI HỌC ÔNG NGHỆ THÔNG TIN................1 KHOA CÔNG NGHỆ PHẦN MỀ ................... 1 Seminar Subject: Dat Storage in Android................1 Giáo viên hướng dẫn: Cáp Phạm Đình Tăng................1 Sinh viên thực hiện:....................... 1 Nguyễn Văn Sinh 10520130....................1 Tôn Ngọc Tẩn 1052013...................... 1 1 Giớ thiệu về cáh lưu trữ ên adroid:.................2 1. Shared Storage:..................... 2 1.1 Tạo và lưu giá trị vào SharePfernces:.............. 3 1.2 Truy xuất giá trị ừ SharePfernces:.............. 4 1.2 Lưu và đọc ác tập tinrong android:................ 4 1.21 Đọc file:...................... 5 1.2 Ghi fle:...................... 6 1.23 Kiểm trahiết bị ngoại v để lưu trữ file:.............. 7 1.3 Cơ sở dữ liệu trong Android:.................. 7 1.31 Giớ thiệu về SQLite:...................8 1.32 Các lớp cơ bản khi sư dụng SQLite:...............8 1.3 Ví dụemo về quản lí thông tin một người.............1 2 Tìm hiều và sử dụng Conte Provider:................23 2.1 Tìm hiều vềConte Provider:.................23 2. Tìm hiểu vềURI:..................... 24 2.3 Sửdụng một Conte Provider cósẵn:............... 25 2.31 Giớ thiệu:..................... 25 2.32 Ví dụ Demo:.....................25 2.4 Xây dựng vàsửdụng một Conte Provider:............. 26 2.41 Mục địch việc xây dựng Conte Provider:............. 26 2.42 Xây dựng Conte Provider:................ 26 2.43 Ví dụ về xây dựng một Conte Provider:.............28 2.4 Sử dụng Conte Provider

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN KHOA CÔNG NGHỆ PHẦN MỀM Seminar Subject: Data Storage in Android Giáo viên hướng dẫn: Cáp Phạm Đình Thăng. Sinh viên thực hiện: Nguyễn Văn Sinh 105020130 Tôn Ngọc Tẩn 10520133 Contents TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN 1 KHOA CÔNG NGHỆ PHẦN MỀM 1 Seminar Subject: Data Storage in Android 1 Giáo viên hướng dẫn: Cáp Phạm Đình Thăng 1 Sinh viên thực hiện: 1 Nguyễn Văn Sinh 105020130 1 Tôn Ngọc Tẩn 10520133 1 1 Giới thiệu về cách lưu trữ trên android: 2 1.1 Shared Storage: 2 1.1.1 Tạo và lưu giá trị vào SharePreferences: 3 1.1.2 Truy xuất giá trị từ SharePreferences: 4 1.2 Lưu và đọc các tập tin trong android: 4 1.2.1 Đọc file: 5 1.2.2 Ghi file: 6 1.2.3 Kiểm tra thiết bị ngoại vi để lưu trữ file: 7 1.3 Cơ sở dữ liệu trong Android: 7 1.3.1 Giới thiệu về SQLite: 8 1.3.2 Các lớp cơ bản khi sư dụng SQLite: 8 1.3.3 Ví dụ demo về quản lí thông tin một người 11 2 Tìm hiều và sử dụng Content Provider: 23 2.1 Tìm hiều về Content Provider: 23 2.2 Tìm hiểu về URI: 24 2.3 Sử dụng một Content Provider có sẵn: 25 2.3.1 Giới thiệu: 25 2.3.2 Ví dụ Demo: 25 2.4 Xây dựng và sử dụng một Content Provider: 26 2.4.1 Mục địch việc xây dựng Content Provider: 26 2.4.2 Xây dựng Content Provider: 26 2.4.3 Ví dụ về xây dựng một Content Provider: 28 2.4.4 Sử dụng Content Provider mới tạo: 32 1 Giới thiệu về cách lưu trữ trên android: Android cung cấp cho bạn một số lựa chọn để lưu trữ dữ liệu của ứng dụng một cách rất bền vững. Các giải pháp lưu trữ tùy thuộc vào phụ thuộc vào sự lựa chọn của bạn và chương trình của bạn đang phát triển.  Shared Storage: Dữ liệu của bạn sẽ được lưu trữ dưới dạng cặp khóa-giá trị, đây là cách lưu trữ truyền thống trên di động. Chúng ta muốn lưu trữ UI state, user preferences hay application setting thì đây là một cơ chế gọn nhẹ để lưu trữ.  File: Android cho phép chúng ta tải và lưu các tệp tin trên thiết bị di động.  SQLite Databases: Lưu trữ dữ liệu dưới dạng một cấu trúc mà bạn xây dựng sẵn trong một cơ sở dữ liệu riêng. Cách này thường được dùng nhiều trong android để xây dưng các ứng dụng  Network Connection: Dữ liệu sẽ được chia sẻ và lưu trữ trên web thông qua máy chủ dữ liệu của bạn.  Ngoài ra, android cung cấp cho bạn một cách để chia sẻ các dữ liệu cá nhân của ứng dụng cho các ứng dụng khác thông qua Content Provider. Chúng ta có thể truy cập Content Provider để sử dụng hệ thống được phép. 1.1 Shared Storage: Lớp Shared Preferences cung cấp một khuôn khổ chung cho phép bạn lưu trữ và lấy cặp giá trị dưới dạng key-value. Bạn có thể sử dụng Shared Preferences để lưu bất kì kiểu dữ liệu mặc định nào: Booleans, floats, ints, longs hoặc strings. Dữ liệu này sẽ tồn tại suốt phiên làm việc của người dùng (ngày cả khi ứng dụng của bạn có bị đóng đi). Ưu điểm:  Dữ liệu lưu trữ chỉ dành riêng cho ứng dụng mà nó được viết ra.  Được coi là một phần thông tin của hệ thống.  Tính bảo mật rất cao. Nhược điểm:  Không thể lấy thông tin dữ liệu dưới dạng file.  Dung lượng bộ nhớ lưu trữ thấp nên chỉ phù hợp với việc lưu trữ thông tin cấu hình. Sử dụng một đối tượng Editor để lưu dữ liệu. Để có được một đối tượng SharedPreferences cho các ứng dụng của bạn, hãy sử dụng một trong hai phương thức:  getSharedPreferences (): Sử dụng nó nếu bạn cần nhiều tập tin tham chiếu được xác định theo tên, mà bạn chỉ định với tham số đầu tiên.  getPreferences () : Sử dụng điều này nếu bạn chỉ cần một tham chiếu đến tập tin cho hoạt động của bạn. Vì có duy nhất một tập tin tham chiếu cho active của bạn, bạn không cần cung cấp tên. //ten cua SharedPreferences private static final String CONFIGURATION_NAME = "NAME_CONFIG"; 1.1.1 Tạo và lưu giá trị vào SharePreferences: Để ghi giá trị vào trong bộ nhớ bạn cần sử dụng một đối tượng editor:  Gọi một editor thông qua SharedPreference.Editor.  Thêm các giá trị vào bộ nhớ đệm bằng các hàm putString(), putInt(), putBoolean().  Đẩy giá trị vào bộ nhớ bằng hàm editor.comit(). Code: btSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //lấy tên của người dùng nhập trong EditText name. String name = edtName.getEditableText().toString().trim(); //lấy id của người dùng nhập trong EditText id. String id = edtID.getEditableText().toString().trim(); //tạo một đối tượng SharedPreferences ở chế độ MODE_PRIVATE. SharedPreferences editPreference = getSharedPreferences(CONFIGURATION_NAME, Activity.MODE_PRIVATE); //lay doi tuong Editor dung de luu du lieu vao bo nho Editor editor = editPreference.edit(); //day du lieu voi cap khoa-gia tri la id-name va bo nho phu editor.putString(id, name); //day du lieu tu bo nho phu vao bo nho thiet bi editor.commit(); } }); 1.1.2 Truy xuất giá trị từ SharePreferences: Để truy cập Shared Preferences thì cũng dùng phương thức getSharedPreferences, đưa vào khóa của dữ liệu trong SharedPreferences mà chúng ta muốn truy cập, dùng phương thức SharedPreferences.getString (),SharedPreferences.getInt(), …để truy xuất giá trị cần thiết. Code: btLoad.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //lay id ma nguoi dung nhap thong qua edtID de lay du lieu ra String id = edtID.getEditableText().toString().trim(); //lay doi tuong SharedPreferences thong qua ten va che do Activity. SharedPreferences editPreference = getSharedPreferences(CONFIGURATION_NAME,Activity.MODE_PRIVATE); //lay du lieu voi 2 tham so la: id va gia tri xuat ra khi khong co roi sau do set cho edtName edtName.setText(editPreference.getString(id,CONFIGURATION_NAME)); } }); Toàn bộ source code và demo nằm trong thư mục DemoSeminar/Seminar_Share 1.2 Lưu và đọc các tập tin trong android: Cũng như các tiêu chuẩn I/O của java thì trong android cũng cung cấp openFileInput và openFileOutput để đơn giản các công việc ghi và đọc trên các dòng hoặc các file. Ưu điềm:  Xử lí trên file đơn giản.  Đọc file và lưu trữ file có thể ở nhiều định dạng.  Dung lượng file không giới hạn như cách lưu trữ SharePreferences Nhược điểm:  Không có tính bảo mật cao.  Có thể bị lỗi khi xung đột file hoặc xung đột luồng đọc file. Các lớp tiện ích để xử lí file nằm trong gói Android.os.Enviroment Để xử lí các thao tác trên file được tốt ta nên xử dụng các lớp nằm trong gói java.os • File: Thao tác xử lí file. • FileInputStream: đọc nội dung file. • FileOutputStream:Ghi nội dung file. 1.2.1 Đọc file: Muốn đọc một file lên ta phải dung lớp FileInputStream để mở file và dùng lớp InputStreamReader để mở một dòng đọc file. Code: private String readFile() throws IOException { //doc ten cua file tu edtFilePath FILE_NAME = edtFilePath.getEditableText().toString().trim(); //mo mot file len de doc FileInputStream ios = openFileInput(FILE_NAME); //mot kenh truu tuong hoa dung de doc cac dinh dang dau vao //trong truong hop nay la file InputStreamReader isr= new InputStreamReader(ios); //tao mot mang dung de doc du lieu nhan duoc tu file char[] data = new char[1024]; //dung StringBuffer de nhan du lieu tu file ra StringBuffer strBuffer = new StringBuffer(); int len = 0; //khi chua ket thuc file thi doc du lieu vao strBuffer while((len = isr.read(data)) != -1) { strBuffer.append(new String(data, 0, len)); } //dong file va dong kenh doc file isr.close(); ios.close(); //tra ve chuoi du lieu trong file return strBuffer.toString(); } 1.2.2 Ghi file: Muốn đọc một file lên ta phải dung lớp FileOutputStream để mở file và dùng lớp OutputStreamWriter để mở một dòng đọc file. Có nhiều chế độ để mở file để ghi là:  Context.MODE_PRIVATE: đọcfile mà dữ liệu cũ của file bị ghi đè bởi dữ liệu mới.  Context.MODE_APPEND: đọcfile mà dữ liệu mới của file được ghi tiếp tục dưới dữ liệu cũ. private void writeFile(String inText) throws IOException { //lay ten file tu edtFilePath FILE_NAME = edtFilePath.getEditableText().toString().trim(); //mo mot file neu co hoac tao mot file moi neu chua co FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE); //mo mot luong(kenh) du lieu de ghi vao files OutputStreamWriter osw = new OutputStreamWriter(fos); //chi viet ra mot bo dem trong thiet bi di dong osw.write(inText + "\n"); //day vao file can luu osw.flush(); //dong file va kenh du lieu osw.close(); fos.close(); } 1.2.3 Kiểm tra thiết bị ngoại vi để lưu trữ file: Android có thể giúp bạn kiểm tra một thiết bị SD-Card có đang được hỗ trợ để lưu dữ liệu hay không. Ta dùng lớp Enviroment để kiểm tra và lấy trạng thái của môi trường. Code: private boolean hasSDCard() { //kiem tra co ho tro the SDCard ben ngoai hay khong //lay trang thai cua bo nho ngoai SDCard, tra ve trang thai duoi dang chuoi String state = Environment.getExternalStorageState(); //kiem tra da duoc dua vao he thong hay chua if(state.equals(Environment.MEDIA_MOUNTED)) { return true; } return false; } Bạn làm việc trên file nên sẽ ném ra các ngoại lệ IOException, ta sẽ xử dụng hàm try catch để bắt lỗi. Tất cả các demo và source code nằm trong DemoSeminar/Seminar_FileDemo. 1.3 Cơ sở dữ liệu trong Android: Android cung cấp đầy đủ các quan hệ cơ sở dữ liệu thông qua thư viện SQLite mà không áp đặt bất kì hạn chế nào lớn. Sử dụng SQLite có thể tạo cơ sở dữ liệu quan hệ độc lập cho mỗi ứng dụng. Tất cả các cơ sở dữ liệu trong android được lưu trong thư mục /data/data/<package_name>/databases để chia sẻ cơ sở dữ liệu qua các ứng dụng ta dùng Context Provider (ở phần sau). 1.3.1 Giới thiệu về SQLite:  SQLite là một bản SQL sever less của SQL database engine.  Nhẹ gọn và linh hoạt với dung lượng khoảng 300kb (chiếu trong kho ứng dụng của thiết bị)  Đa nền tảng và không cần cấu hình mạnh.  Không hỗ trợ một số tính năng ví dự như quản lí user sử dụng, không có khóa ngoại, không có các ràng buộc toàn vẹn…  Lưu trữ tại data/data/<package_name>/database 1.3.2 Các lớp cơ bản khi sư dụng SQLite: 1.3.2.1 Lớp SQLiteOpenHelper: 1.3.2.1.1 Giới thiệu: SQLiteOpenHelper là lớp quản lí việc kết nối, tạo và quản lí cơ sở dữ liệu cũng như phiên bản của cơ sở dữ liệu.  Đối tượng của lớp này cần tham chiếu đến một đối tượng Context. Mỗi database được tạo ra nằm trong một ứng dụng riêng nên để quản lí chúng ta cần phải chuyền vào ngữ cảnh Context đề SQLiteOpenHelper nhận biết và quản lí. Cách tốt nhất đề sử dụng lớp này là chúng ta tạo ra một lớp mới kế thừa các phương thức của SQLiteOpenHelper để dễ sử dụng như ví dụ sau: 1.3.2.1.2 Các phương thức:  Hàm khởi tạo: SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version), gồm có 4 tham số truyền vào là:  Context context : ngữ cảnh Context hiện tại  SQLiteDatabase.CursorFactory factory: dùng để cho phép các lớp con được trả về con trỏ cursor khi gọi câu query  String name: tên của database.  int version: phiên bản của database.  Các phương thức ảo được mặc định kế thừa trong lớp mới: o Void onCreate(SQLiteDatabase db), được gọi khi database được tạo lần đầu tiên với tham số:  SQLiteDatabase db: đối tượng dùng để quản lí các công việc của database. o void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),được gọi khi cần update phiên bản cho database, gồm các tham số sau:  Các phương thức khác:  SQLiteDatabase db: đối tượng quản lí các công việc của database.  int oldVersion: phiên bản cũ của database.  int newVersion: phiên bản mới của database. o onOpen(SQLiteDatabase db), gọi một đối tượng SQLiteDatabase khi cần thiết (ít sử dụng). o close(): đóng đối tượng SQLiteOpenHelper. o String getDatabaseName(): trả về tên của database. o SQLiteDatabase getReadableDatabase() mở database hiện hành để đọc. o SQLiteDatabase getWritableDatabase() mở database hiện hành đề đọc và ghi. 1.3.2.2 Lớp SQLiteDatabase: 1.3.2.2.1 Giới thiệu: Là đối tượng đại diện cho cơ sở dữ liệu mà ta tạo ra bởi đối tượng SQLiteOpenHelper. Tên của database trong một ứng dụng là duy nhất. Là đối tượng trực tiếp để thực thi các câu lệnh SQL và các công việc cần thực hiện trên các table của database. 1.3.2.2.2 Các phương thức:  void execSQL(String sql): thực thi câu lệnh sql thông thường, không trả về kết quả.  Long insert(String table, String nullColumnHack, ContentValues values), chèn dữ liệu vào một table. Tham số: o String table: tên của table cần chèn dữ liệu. o String nullColumnHack: thường để null. o ContentValues values: đối tượng chứa dữ liệu chèn vào.  int delete(String table, String whereClause, String[] whereArgs) : phương thức dùng để xóa các hàng trong cơ sở dữ liệu. Tham số: o String table: tên của table trong cơ sở dữ liệu. [...]... truy vấn query  Int getPosition(): trả về vị trí hiện tại của con trỏ cursor tại dòng nào  Int getType(int columnIndex): trả về kiểu dữ liệu tại cột có chỉ số columIndex  String getColumnName(int columnIndex): trả về tên của cột tại vị trí chỉ định  String[] getColumnNames(): trả về tên của các cột  Int getColumnIndex(String columnName): trả về chỉ số của cột có tên là columnName  Int getColumnCount():... giong nhu khi ta tao bang //ID la kieu int nen chung ta getInt mPeople.setgID(cur.getInt(0)); //tuong tu, cac truong con lai la String nen chung ta getString mPeople.setgName(cur.getString(1).toString().trim()); mPeople.setgEmail(cur.getString(2).toString().trim()); mPeople.setgPhone(cur.getString(3).toString().trim()); mPeople.setgAddress(cur.getString(4).toString().trim()); cur.close(); gdb.close();... ví dụ sau: private private private private private private static static static static static static final final final final final final int int int int int int PEOPLE = 1; PEOPLE_ID = 2; PEOPLE_PHONES = 3; PEOPLE_PHONES_ID = 4; PEOPLE_CONTACTMETHODS = 7; PEOPLE_CONTACTMETHODS_ID = 8; private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { sURIMatcher.addURI("contacts",... nối tới database Đầu tiên bạn cần tạo tên của database, tên của table có trong database, câu lệnh tạo bảng và đối tượng SQLDatabase để sử dụng trong toàn bộ lớp Sau đây là Code phần này: //ten cua database private static String database_name = "INFOPEOPLE"; //ten cua mot bang nam trong database private static String table_name = "PEOPLE"; //cau truc tao ra bang table_name private static String table_create... class DTOPeople { private int gID; private String gName; private String gPhone; private String gEmail; private String gAddress; public int getgID() { return gID; } public void setgID(int gID) { this.gID = gID; } public String getgName() { return gName; } public void setgName(String gName) { this.gName = gName; } public String getgPhone() { return gPhone; } public void setgPhone(String gPhone) { this.gPhone... String mName, String mEmail, String mPhone, String mAddress) { gID = mID; gName = mName; gEmail = mEmail; gPhone = mPhone; gAddress = mAddress; } public String displayPeople() { String temp = ""; temp += String.valueOf(gID).toString().trim() + "\n"; temp += gName.toString().trim() + "\n"; temp += gEmail.toString().trim() + "\n"; temp +=gPhone.toString().trim() + "\n"; temp += gAddress.toString().trim();... static final String sID = "ID"; public static final String sName = "Name";  Sau đó chúng tạo database như ở phần SQLite Đến phần này mình xin khẳng định lại rằng Content Provider không phải là cách lưu trữ dữ liệu nên chúng ta phải sử dụng SQLite để lưu trữ dữ liệu Mọi người có thể dùng các cách khác để lưu trữ, rất tiện lợi: //tao database private SQLiteDatabase gdb; private static final String DATABASE_NAME... "USERDEMO"; private static final String TABLE_NAME = "USER"; private static final int DATABASE_VERSION = 1; private static final String TABLE_CREATE = "CREATE TABLE [" + TABLE_NAME + "] (" +"[ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + "[Name] TEXT NOT NULL)"; //su dung SQLtieOpenHelper de quan li viec luu du lieu private static class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context... else { sb.append("Chua co du lieu"); } ((TextView)this.findViewById(R.id.txtDisplay)).setText(sb.toString()); } Chúng ta cần thêm một số thông tin vào trong hàm AndroidMainfest.xml: trong thẻ application Tất cả source code và demo nằm trong thư mục DemoSeminar/Seminar_CreateContentProvider 2.4.4 Sử dụng Content Provider... + "[ID] INTEGER "[Name] TEXT NOT NULL PRIMARY KEY AUTOINCREMENT," + NOT NULL," + "[Email] TEXT NULL," + "[Phone] TEXT NULL," + "[Address] TEXT NULL)"; //phien ban cua database private static int database_version = 1; //doituong SQLiteDatabase dung de thuc hien cac cau len SQL private SQLiteDatabase gdb; Sau đó bạn cần tạo database, table và tạo hàm update database: //hàm khởi tạo dùng để tạo database

Ngày đăng: 09/07/2015, 09:36

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w