Android cung cấp một số tùy chọn giúp bạn lưu trữ dữ liệu trong ứng dụng một cách toàn diện. Các tùy chọn này bạn có thể sử dụng tùy thuộc vào mục đích của việc lưu trữ dữ liệu trong ứng dụng. Ví dụ như dữ liệu chỉ nên sử dụng cho một ứng dụng nào đó hoặc có thể public cho các ứng dụng truy câp...

Lưu trữ dữ liệu là tính năng quan trọng đối với ứng dụng, giúp cho người dùng có thể dùng lại được những dữ liệu trước đó mà không cần nhập lại. Trong Android có 3 cách để lưu lại dữ liệu:

  • Cơ chế “cấu hình chia sẻ” (shared preferences) được dùng để lưu những dữ liệu nhỏ dưới dạng key-value (tên khóa – giá trị khóa)
  • Lưu dữ liệu cố định vào tập tin trong bộ nhớ trong hoặc bộ nhớ ngoài của điện thoại
  • Lưu dữ liệu sử dụng cơ sở dữ liệu quan hệ cục bộ SQLite

I.Lưu trữ dữ liệu với Shared Preferences:

Android cung cấp sẵn một cơ chế đơn giản giúp chúng ta lưu trữ nhanh các dữ liệu ngắn như cấu hình ứng dụng, tên đăng nhập, email… và lấy lại dữ liệu đã ghi này trong các lần chạy ứng dụng tiếp theo.
1. Gọi hàm getSharedPreferences, hàm này trả về SharedPreferences và nó có 2 đối. Đối số 1 là tên tập tin để lưu trạng thái, đối số 2 là kiểu lưu. Chú ý là đối số 1 ta chỉ ghi tên tập tin (không cần ghi phần mở rộng, vì phần mở rộng mặc nhiên của nó là .xml khi ta lưu thành công), đối số 2 thường ta để là MODE_PRIVATE:
SharedPreferences sharedPreferences = getSharedPreferences(“key“, MODE_PRIVATE);
2. Tạo đổi tượng Editor để cho phép chỉnh sửa dữ liệu.
Editor editor = sharedPreferences.edit();
3. Đưa dữ liệu muốn lưu trữ vào edit bằng các phương thức edit.putXXX(“key”,”value”);
Tùy vào kiểu dữ liệu ta muốn lưu trữ mà XXX được thay thế bởi các kiểu dữ liệu phù hợp:
editor.putString(“key”, “value”);
editor.putInt(“pwd”, value);
editor.putBoolean(“checked”, value);
4. Lưu trạng thái bằng cách gọi dòng lệnh:
editor.commit();

public void saveSharePreference(String key, String value) {

        sharedPreferences = context.getSharedPreferences(key, Context.MODE_PRIVATE);
        Editor editor = sharedPreferences.edit();
        editor.putString(key, value);
        editor.commit();
    }

5.Gọi dữ liệu từ Shared Preferences thông qua gọi hàm get tương ứng với key mà ta đã lưu. Chúng ta cần có giá trị default khi không có giá trị

public String loadSharePreference(String key) {
        sharedPreferences = context.getSharedPreferences(key, Context.MODE_PRIVATE);
        return sharedPreferences.getString(key, "");
    }

– Lưu và đọc trạng thái bạn nên viết thành các hàm riêng biệt cho dễ sử dụng

– Hàm lưu bạn gọi trong sự kiện onPause

– Hàm đọc bạn gọi trong sự kiện onResume.

Nhập dữ liệu trước khi thực hiện Shared Preferences

 Nhập thông tin trước khi thực hiện Shared Preferences. Lần sau chạy lại thì thông tin đã được lưu không cần người dùng nhập lại, phương pháp này thích hợp cho những thao tác tránh người dùng phải nhập nhiều lần khi sử dụng ứng dụng.

 

II. Lưu trữ diệu liệu với file

Trong trường hợp cần lưu lại dữ liệu phức tạp hơn (khó có thể lưu lại dạng key-value trong shared preference), ta có thể dùng hệ thống file. Trong Android, để làm việc (nhập/xuất) với file, ta có thể dùng các lớp của gói java.io. Trong phần này, ta sẽ xem cách làm việc với file trong bộ nhớ trong lẫn bộ nhớ ngoài.

        StringBuffer buf = new StringBuffer();
        FileInputStream in = openFileInput("fileblog.txt");
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));

sau đó đọc từ reader ra reader.readLine();

sau khi chạy

 

III.Lưu trữ dữ liệu với SQLite:

Thay vì lưu trữ bằng text file, XML hay SharePreference thì bạn cũng có thể lưu trữ thông tin bằng SQLite. SQLite đã được tích hợp sẵn trong Android SDK.Thay đổi thông tin thông qua các câu truy vấn SQL cũng dễ dàng hơn nhiều so với việc thao tác trên file. Android sử dụng hệ cơ sở dữ liệu SQLite. CSDL do một ứng dụng tạo ra sẽ chỉ được truy xuất bởi ứng dụng đó, và file CSDL sẽ nằm trong bộ nhớ trong dành riêng cho ứng dụng (/data/data/{package-name}/databases/).

1. Đường link cho slqite: sau khi chạy thì db sẽ được copy thừ thư mục assets vào bộ nhớ trong dành riêng cho ứng dụng

@SuppressLint("SdCardPath")
    public static String DB_PATH = "/data/data/info.androidhive.blog/databases/";
    private static String DB_NAME = "blog.sqlite";
private void copyDataBase() throws IOException {
        InputStream myInput = mContext.getAssets().open(DB_NAME);
        OutputStream myOutput = new FileOutputStream(DB_PATH + DB_NAME);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }

        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

2.Khởi tạo db.

public boolean isCreatedDatabase() throws IOException {
        boolean result = true;
        if (!checkExistDataBase()) {
             this.getReadableDatabase();
            try {
                    copyDataBase();
                    result = false;
            } catch (Exception e) {
                throw new Error("Error copying database");
            }
        }
        return result;
    }

3. Lấy toàn bộ dữ liệu từ db:

    public ArrayList<News> getNews() {
        ArrayList<News> newslist = new ArrayList<News>();

        try {
            openDataBase();
            String sql = "SELECT * FROM content";
            Cursor c = database.rawQuery(sql,  null);
            c.moveToFirst();
            News news;
            while (!c.isAfterLast()) {
                news = new News();
                news.setId(c.getInt(c.getColumnIndex("id")));
                news.setContent(c.getString(c.getColumnIndex("nd")).toString());
                newslist.add(news);
                c.moveToNext();
            }
            c.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close();
        }
        return newslist;
    }

Trước khi chạy:

kết quả

 

Bài viết có nhiều thiếu sót, mong mọi người có thể để lại nhận xét bên dưới để cải thiện bài viết được tốt hơn.

Các bạn có thể tham khảo mã nguồn tại đây: 

https://onedrive.live.com/redir?resid=205EF9BF23EEF51E!13766&authkey=!AE2iLL415MDScww&ithint=file%2czip


One comment

#131
vinh
2016-12-02 21:17
E có thể lấy dữ liệu theo từng cột dc ko?vd như e có 2 cột tên và pass,thì làm sao để lấy dc,vì e ko thấy khai báo tên cột nên ko biết làm sao để lấy no ra?
tks a nhiều

Leave a Comment

Fields with * are required.