Lưu trữ dữ liệu trong ứng dụng Android

(ZmikiSoft.com) – Lưu trữ dữ liệu trong ứng dụng Mobile.

Trong ứng dụng Android nói riêng và các ứng dụng Mobile nói chung có nhiều cách lưu trữ dữ liệu, nhưng được chia ra làm 2 loại là:

  1.  Lưu trữ dữ liệu online: dữ liệu được lưu trữ trên một máy chủ ( server ) và ứng dụng sẽ kết nối để lấy dữ liệu về, thông tin được cập nhật mới liên tục, ứng dụng chỉ sử dụng được khi có kết nối internet. Các ứng dụng như facebook, youtube…
  2.  Lưu trữ dữ liệu offline: dữ liệu được lưu trữ trên thiết bị của bạn, bạn vẫn sử dụng được khi không có internet, nhưng cách thức thực hiện sẽ có vài điểm khác nhau ở mỗi nền tảng. Các ứng dụng như ứng dụng từ điển…

Trong bài viết này chúng ta cùng tìm hiểu về việc lưu trữ dữ liệu offline trên hệ điều hành Android.

Lưu trữ offline trên Android cũng được thực hiện nhiều cách thức khác nhau, nhưng chúng ta có thể chia ra làm 3 loại chính

  1. Lưu trữ các tập theo dạng key-value: đây là dạng mặc định trong HĐH Android, hầu hết các ứng dụng thiết lập phần cài đặt đều sử dụng phương thức này để lưu trữ. Để sử dụng loại này trong Android có một khái niệm là Shared Preferences để lưu vào bộ đệm riêng ứng dụng, đây cũng là một dạng lưu trữ của file, nhưng được lưu trữ cụ thể theo ứng dụng riêng biệt do đó để thực hiện bạn cần phải có Context hoặc Activity của ứng dụng.
    • Cách ghi dữ liệu sẽ thực hiện như một ví dụ cụ thể sau:
      SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
      SharedPreferences.Editor editor = sharedPref.edit();
      editor.putInt(getString(R.string.saved_high_score), newHighScore);
      editor.commit();
    • Cách đọc dữ liệu sẽ thực hiện như sau:
      SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
      int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
      long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);
  2.  Lưu trữ dạng file: đây là dạng lưu trữ khá đặc trưng trên HĐH Android, việc lưu trữ này cũng có nhiều biến thể, nhưng được chia ra làm 2 loại là lưu riêng (giống như lưu cache cho riêng ứng dụng) và lưu public (nhiều ứng dụng có thể truy cập).
    1. Lưu riêng (private): các lập trình viên thường sử dụng cách lưu này để lưu các đối tượng nhằm tối ưu cho việc tải dữ liệu. Việc lưu này nhờ vào sự hỗ trợ của ngôn ngữ Java với package java.io. Các class tạo đối tượng phải implement class tên là Serializable. Khi lưu lập trình viên sẽ sử dụng tới các class hỗ trợ như FileOutputStream, File…
      File file = new File(context.getFilesDir(), filename);
      String filename = "myfile";
      String string = "Hello world!";
      FileOutputStream outputStream;
      
      try {
        outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
        outputStream.write(string.getBytes());
        outputStream.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    2. Lưu public: các bạn có thể thấy rõ nhất trong các ứng dụng chụp ảnh, hình ảnh sẽ được lưu trữ trên thẻ nhớ internal và external của thiết bị, ngoài ra còn nhiều dạng lưu trữ như log… Để thực hiện được thao tác này, bạn cần cấp quyền truy cập thẻ nhớ cho ứng dụng, vì file được lưu trữ trên thẻ nhớ nên các ứng dụng khác có thể truy cập được.
  3.  Sử dụng cơ sở dữ liệu SQLITE: Android nói riêng và các hệ điều hành mobile nói chung thường sử dụng SQLite để làm cơ sở dữ liệu lưu trữ vì tính cơ động cao và nhỏ gọn. SQLite có đầy đủ các tính năng cơ bản của một hệ quản trị cơ sở dữ liệu. Với tên gọi package android.database.sqlite. Để sử dụng SQLite lập trình viên thường phải viết Class kế thừ từ Class SQLiteOpenHelper,  và override lại các phương thức căn bản: onCreate(), onUpgrade() and onOpen()... Một số ví dụ về khai báo thực hiện các hàm SQLite.
    Tạo class kế thừa SQLiteOpenHelper
    public class FeedReaderDbHelper extends SQLiteOpenHelper {
        // If you change the database schema, you must increment the database version.
        public static final int DATABASE_VERSION = 1;
        public static final String DATABASE_NAME = "FeedReader.db";
    
        public FeedReaderDbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(SQL_CREATE_ENTRIES);
        }
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // This database is only a cache for online data, so its upgrade policy is
            // to simply to discard the data and start over
            db.execSQL(SQL_DELETE_ENTRIES);
            onCreate(db);
        }
        public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            onUpgrade(db, oldVersion, newVersion);
        }
    }

    Chèn dữ liệu vào database

    // Gets the data repository in write mode
    SQLiteDatabase db = mDbHelper.getWritableDatabase();
    
    // Create a new map of values, where column names are the keys
    ContentValues values = new ContentValues();
    values.put(FeedEntry.COLUMN_NAME_TITLE, title);
    values.put(FeedEntry.COLUMN_NAME_SUBTITLE, subtitle);
    
    // Insert the new row, returning the primary key value of the new row
    long newRowId = db.insert(FeedEntry.TABLE_NAME, null, values);
    // Define 'where' part of query.
    String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
    // Specify arguments in placeholder order.
    String[] selectionArgs = { "MyTitle" };
    // Issue SQL statement.
    db.delete(FeedEntry.TABLE_NAME, selection, selectionArgs);
    Delete dữ liệu trong Database
    String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
    // Specify arguments in placeholder order.
    String[] selectionArgs = { "MyTitle" };
    // Issue SQL statement.
    db.delete(FeedEntry.TABLE_NAME, selection, selectionArgs);

Khóa học lập trình Android
Khóa học lập trình Java
Khóa học lập trình iOS
Khóa học lập trình Objective-C/Swift