Thứ Năm, 1 tháng 9, 2016

Sử dụng SQLite Database trong Android trên Eclipse

Sử dụng SQLite Database trong Android trên Eclipse

Tác giả: Phạm Viết Phú      

            SQLite là hệ quản trị cơ sở dữ liệu tương tự như SQL, MySQL. SQLite có đặc điểm là ngọn, nhẹ, đơn giãn và được áp dụng nhiều trên các hệ điều hành di động. Không có khái niệm user, password hay phân quyền trong SQLite database.

            Với bài viết này sẽ chúng tôi sẽ cung cấp các bước cơ bản tạo DB sử dụng SQLite và vận dụng nó ở mức cơ bản.

            Yêu cầu

·         Tool sử dụng là Eclipse

·         Đã cài đặt và thiết lập đầy đủ Android SDK

·         Đã có kiến thức lập trình hướng đối tượng

Ý tưởng trong bài viết này là chúng ta sẽ tạo chương trình danh bạ đơn giản chỉ để lưu thông tin số điện thoại và địa chỉ của một người.

Các bước thực hiện để tạo ra giao diện cho ứng dụng

·         B1. Tạo project

Click chọn menu File, chọn New, chọn Android Project

Click Finish để kết thúc việc tạo mới project.

Package của project vừa mới tạo.

·         B2. Thiết kế giao diện cho chương trình

            Giao diện của chương trình sẽ được thiết kế trên file main.xml. Có nhiều layout để thiết kế một giao diện trên android: LinearLayout, AbsouteLayout, TableLayout, RelativeLayout, FrameLayout, ScrollLayout. Mỗi layout có ưu điểm riêng trong trình bày. Ở chương trình này, chúng tôi sẽ dùng LinearLayout.

Toàn bộ thiết kế của giao diện sẽ được nằm trong khung giữa của tab  <LinearLayout></LinearLayout>.

Thiết kế label và Textbox của chương trình.

 

Thiết kế các Button của chương trình.

Tạo ListView để hiện thông tin từ database lên.

Tổng quan của chương trình khi chạy thử trên Emulator.

Chúng ta vừa thiết kế xong phần giao diện cho ứng dụng.

Tiếp theo, chúng ta sẽ chuyển qua phần thiết kế database SQLite trong Android. Trong bài này, chúng tôi sẽ hướng dẫn thực hiện insert, và trình bày dữ liệu bằng các hàm mà SQLite đã hỗ trợ sẵn mà không cần sử dụng các câu query phức tạp.

-          Bước 1: Tạo lớp DBAdapter.java: Click chuột phải vào project folder mà mình tạo chọn New/Class

-         

 

Điền thông tin đầy đủ vào các Textbox đã được khoanh đỏ: Ở mục package chúng ta sẽ chọn đúng package của project, nếu không chúng ta nên click vào nút Browse để chọn lại.

Click Finish để kết thúc việc tạo DBAdapter.java.

 

-          Bước 2: Implement code trong lớp DBAdapter.java.

+   Chúng ta phải định nghĩa được các thuộc tính cần có của một database.

 

      public static final String KEY_ROWID = "_id";

      public static final String KEY_NAME = "name";

      public static final String KEY_PHONE = "phone";

      public static final String KEY_ADDRESS = "address";

 

      private static final String TAG = "DBAdapter";

 

      private DatabaseHelper mDbHelper;

 

      private SQLiteDatabase mDb;

 

      private static final String DATABASE_CREATE = "create table PersonInfo (_id integer primary key autoincrement, "

            + "name text not null, phone text not null, address text not null);";

 

       private static final String DATABASE_NAME = "data";

 

      private static final String DATABASE_TABLE = "PersonInfo";

 

      private static final int DATABASE_VERSION = 2;

 

       private final Context mCtx;

 

Đoạn code trên có hằngsố DATABASE_CREATE chứa câu query SQL để tao bảng dữ liệu  PersonInfo.

 

+  Bước tiếp theo implement các function quan trọng có trong một database như là đóng, mở và tạo mới DB.

            private static class DatabaseHelper extends SQLiteOpenHelper {

 

        DatabaseHelper(Context context) {

            super(context, DATABASE_NAME, null, DATABASE_VERSION);

        }

 

        @Override

        public void onCreate(SQLiteDatabase db) {

 

            db.execSQL(DATABASE_CREATE);

        }

 

        @Override

        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

            Log.w(TAG, "Upgrading database from version " + oldVersion + " to " +                                                                           newVersion

                                                             + ", which will destroy all old data");

            db.execSQL("DROP TABLE IF EXISTS PersonInfo");

            onCreate(db);

        }

    }

 

           

    public DBAdapter(Context ctx) {

        this.mCtx = ctx;

    }

 

    public DBAdapter open() throws SQLException {

        mDbHelper = new DatabaseHelper(mCtx);

        mDb = mDbHelper.getWritableDatabase();

        return this;

    }

    /**

     * Close DatabaseHelper.

     */

    public void close() {

        mDbHelper.close();

    }

 

    public long createPersonInfo(String name, String phone, String address) {

        ContentValues initialValues = new ContentValues();

        initialValues.put(KEY_NAME, name);

        initialValues.put(KEY_PHONE, phone);

        initialValues.put(KEY_ADDRESS, address);

 

        return mDb.insert(DATABASE_TABLE, null, initialValues);

    }

 

Chúng ta thực hiện tạo hàm createPersonInfo()để insert thông tin của một người xuống database với các thông số name, phone, address và hàm sẽ trả về id nếu insert thành công.

 

    public boolean deletePersonInfo(long rowId) {

 

        return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;

    }

Chúng ta thực hiện hàm deletePersonInfo ()để delete thông tin của một người từ database với thông số là một id.

 

    public Cursor fetchAllPersonInfo() {

 

        return mDb.query(DATABASE_TABLE, new String[]{KEY_ROWID, KEY_NAME, KEY_PHONE, KEY_ADDRESS}, null, null, null,

                null, null);

    }

 

Chúng ta thực hiện hàm fetchPersonInfo hổ trợ lấy thông tin chỉ của một người, thông số truyền vào là Id của người đó.

public Cursor fetchPersonInfo(long rowId) throws SQLException {

 

        Cursor mCursor =

 

        mDb.query(true, DATABASE_TABLE, new String[]{KEY_ROWID, KEY_NAME, KEY_PHONE, KEY_ADDRESS}, KEY_ROWID + "="

                + rowId, null, null, null, null, null);

        if (mCursor != null) {

            mCursor.moveToFirst();

        }

        return mCursor;

 

    }

 

Chúng ta thực hiện hàm updatePersonInfo sẽ hỗ trợ update thông tin của một người với thông số truyền vào là id, name, phone, address.

 

    public boolean updatePersonInfo(long rowId, String name, String phone, String address) {

        ContentValues args = new ContentValues();

        args.put(KEY_NAME, name);

        args.put(KEY_PHONE, phone);

        args.put(KEY_ADDRESS, address);

 

        return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;

    }

 

Chúng ta nhận  thấy rằng các hàm createPersonInfo để insert dữ liệu, deletePersonInfo để delete, updatePersonInfo để update, fetchPersonInfo để lấy dữ liệu đều không sử dụng các câu lệnh truy vấn SQL bởi vì nó đã được dấu dưới các hàm được dựng sẵn trong mDb của SQLiteDatabase. Trong quá trình gõ code nếu thấy báo thiếu thư viện, chúng ta chỉ cần nhấn tổ hợp phím tắt Ctrl + Shift + O để import tự động thư viện thích hợp vào.

 

 

+ Bây giờ, chúng ta chuyển sang implement cho lớp MainActivity.java:

            public class MainActivity extends ListActivity {

    DBAdapter mDBHelper;

    Cursor mCursor;

    ArrayAdapter<String> array;

    ArrayAdapter<String> arraylist;

    EditText txtName;

    EditText txtPhone;

    EditText txtAddress;

    Button btnInsert;

    Button btnReload;

 

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

       

        txtName = (EditText)findViewById(R.id.txtFullName);

        txtPhone = (EditText)findViewById(R.id.txtPhone);

        txtAddress = (EditText)findViewById(R.id.txtAddress);

        btnInsert = (Button)findViewById(R.id.btnInsert);

        btnReload = (Button)findViewById(R.id.btnReload);

       

        mDBHelper = new DBAdapter(this);

        mDBHelper.open();

       

        btnInsert.setOnClickListener(new View.OnClickListener() {

           

            @Override

            public void onClick(View arg0) {

                Toast.makeText(getApplicationContext(), "You inserted:" +

                       txtName.getText().toString()+"-"+ txtPhone.getText().toString()+"-"+txtAddress.getText().toString(), Toast.LENGTH_LONG).show();

                mDBHelper.createPersonInfo(txtName.getText().toString(), txtPhone.getText().toString(), txtAddress.getText().toString());

                          

            }

        });

       

        btnReload.setOnClickListener(new View.OnClickListener() {

           

            @Override

            public void onClick(View arg0) {

                loadData();

               

            }

        });

    }

   

    public void loadData(){

        try {

           

            Cursor c = mDBHelper.fetchAllPersonInfo();

           

            if (c.getCount() > 0) {

                c.moveToFirst();

            }

            array = new ArrayAdapter<String>(getApplication(),

                    android.R.layout.simple_list_item_1);

            do {

                String name = c.getString(c.getColumnIndex("name"));

                String phone = c.getString(c.getColumnIndex("phone"));

                String address = c.getString(c.getColumnIndex("address"));

                array.add(name + " \n " + phone +" \n"+ address);

            } while (c.moveToNext());

            setListAdapter(array);

        } catch (Exception e) {

            Toast.makeText(getApplication(), "Not found database",

                    Toast.LENGTH_LONG).show();

        }

       

    }

}

 

Ở chương trình này, chúng tôi đề cập đến hai function cơ bản là Insert dữ liệu xuống database và lấy hết toàn bộ dữ liệu dưới database lên và hiễn thị trên ListView.

Trên thực tế hàm loadData() sẽ thực hiện ngay sau khi insert xong dữ liệu để thấy chương trình trực quan hơn. Tuy nhiên, để hỗ trợ quí vị tiếp cận, chúng tôi đã để hàm loadData() thực thi sau khi click vào Reload button.

Nhũng chức năng khác như delete, update thì chúng tôi sẽ bổ sung ở bài viết khác.

 

Không có nhận xét nào:

Đăng nhận xét