Bài 16-Sửa dữ liệu MongoDB trong Android Kotlin


Như vậy bạn đã biết cách truy xuất và thêm mới dữ liệu vào MongoDB trong Android Kotlin, bài này ta tiếp tục với phần chỉnh sửa dữ liệu. Tương tự như bài 15, Tui di chuyển quán Cafe khác nha, lần này IP của máy Tui là:  172.16.96.86, các Thím nhớ cấu hình lại file mongodb.cfg và chạy lại Service như Tui đã nhắc nhở trong bài 14 nha.

Nếu IP mà bị đổi mà các bạn không cấu hình và chạy lại Service thì khóc ra tiếng Miên MongoDB cũng không thể nào hoạt động được.

Ta tiếp tục mở lại Project trong bài 15 nha, Kết thúc bài học này thím phải làm được giao diện như sau:

Ta cần tạo một màn hình chỉnh sửa dữ liệu, màn hình này sẽ có 2 chức năng: Tìm kiếm Product theo Mã và Cho phép cập nhật dữ liệu (nhìn màn hình điện thoại thứ nhất).

Xem cấu trúc mới sau khi làm chức năng sửa:

Ta tạo một Activity tên là : SuaProductActivity, XML layout như sau:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SuaProductActivity">

    <TextView
        android:id="@+id/textView4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Nhập mã tìm kiếm:"
        android:background="@color/maunentieude"
        android:textColor="@color/mauchutieude"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/edtMaTim"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName" />

    <Button
        android:onClick="xuLyTimProduct"
        android:id="@+id/btnTim"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Tìm" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Mã Product:"
        android:background="@color/maunentieude"
        android:textColor="@color/mauchutieude"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/edtMa"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName" />

    <TextView
        android:id="@+id/textView6"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Tên Product:"
        android:background="@color/maunentieude"
        android:textColor="@color/mauchutieude"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/edtTen"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName" />

    <TextView
        android:id="@+id/textView7"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Đơn giá:"
        android:background="@color/maunentieude"
        android:textColor="@color/mauchutieude"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/edtDonGia"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="numberDecimal"
        android:text="" />

    <Button
        android:onClick="xuLySuaProduct"
        android:id="@+id/btnCapNhat"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Cập nhật Product" />
</LinearLayout>

Phần Coding trong màn hình SuaProductActivity ta phải sử dụng 2 AsyncTask: Cho Tìm Kiếm và cho phần Chỉnh sửa.

Dữ liệu mới nhất Product.json bạn có thể tải tại đây

Để tìm kiếm Product theo mã (trên giao diện bạn thấy Tui để phần tìm kiếm đó):

var connectionString = MongoClientURI("mongodb://172.16.96.86:27017")
var mongoClient = MongoClient(connectionString)

var database = mongoClient.getDatabase("QuanLySanPham")
var collection = database.getCollection("Product")
var filter = Filters.eq("Ma", "p999")
var cursor = collection.find(filter).first()
if(cursor==null)
    return  null
var data = cursor.toJson()
var jsonObject = JSONObject(data)
var ma = jsonObject.getString("Ma")
var ten = jsonObject.getString("Ten")
var gia = jsonObject.getDouble("DonGia")

Coding ở trên là tìm Product có mã p999 nha các Thím. Nếu tìm thấy thì ta đưa về Json để móc nối lấy ra được giá trị của các thuộc tính: Ma, Ten, DonGia (xem coding ở trên)

Coding chỉnh sửa ta làm như sau:

var connectionString = MongoClientURI("mongodb://172.16.96.86:27017")
var mongoClient = MongoClient(connectionString)

var database = mongoClient.getDatabase("QuanLySanPham")
var collection = database.getCollection("Product")
var filter = Filters.eq("Ma", "p999")
var editDoc = Document("\$set",
        Document("DonGia", 325)
         .append("Ten", "Thuốc trị hôi nách Campuchia"))
var ret:UpdateResult = collection.updateOne(filter, editDoc)
return ret.modifiedCount>0

Để chỉnh sửa, thì ta tìm ra Sản Phẩm có mã p999 trước, sau khi tìm kiếm được rồi ta đưa vào Document(“\$set“…) ở trên. Muốn đổi giá trịcuar thuộc tính nào thì cứ đưa vào Document ở đối số thứ 2, các thuộc tính tiếp theo đưa vào append.

lệnh ret.modifiedCount trả về số phần tử bị thay đổi. Tui so sánh với >0 để cho ra true, false thôi không có gì. Muốn dùng true false thì viết như Tui ở trên, còn không thì cứ để giá trị đó là biết ngay thanh công hay thất bại.

Coding chi tiết của lớp này SuaProductActivity nè:

package com.communityuni.androidkotlintomongodb

import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.EditText
import android.widget.Toast
import com.communityuni.model.Product
import com.mongodb.MongoClient
import org.json.JSONObject
import com.mongodb.client.model.Filters
import com.mongodb.MongoClientURI
import com.mongodb.client.result.UpdateResult
import org.bson.Document


class SuaProductActivity : AppCompatActivity() {
    lateinit var edtMaTim:EditText
    lateinit var edtMa:EditText
    lateinit var edtTen:EditText
    lateinit var edtDonGia:EditText
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sua_product)
        addControls()
    }
    private fun addControls() {
        edtMaTim=findViewById(R.id.edtMaTim)
        edtMa=findViewById(R.id.edtMa)
        edtTen=findViewById(R.id.edtTen)
        edtDonGia=findViewById(R.id.edtDonGia)
    }
    fun xuLyTimProduct(view:View)
    {
        var maTim:String=edtMaTim.text.toString()
        TimProducTask().execute(maTim)
    }
    inner class TimProducTask:AsyncTask<String,Void,Product?>()
    {
        override fun doInBackground(vararg p0: String?): Product? {
            var product:Product?=null
            try {
                var connectionString = MongoClientURI("mongodb://172.16.96.86:27017")
                var mongoClient = MongoClient(connectionString)

                var database = mongoClient.getDatabase("QuanLySanPham")
                var collection = database.getCollection("Product")
                var filter = Filters.eq("Ma", p0[0])
                var cursor = collection.find(filter).first()
                if(cursor==null)
                    return  null
                var data = cursor.toJson()
                var jsonObject = JSONObject(data)
                var ma = jsonObject.getString("Ma")
                var ten = jsonObject.getString("Ten")
                var gia = jsonObject.getDouble("DonGia")
                product=Product(ma,ten,gia)
            } catch (ex: Exception) {
                Log.e("LOI", ex.toString())
            }
            return product
        }
        override fun onPostExecute(result: Product?) {
            super.onPostExecute(result)
            if(result!=null) {
                edtMa.setText(result.Ma)
                edtTen.setText(result.Ten)
                edtDonGia.setText(result.DonGia.toString())
            }
            else
            {
                Toast.makeText(
                        applicationContext,"Ko tìm thấy",Toast.LENGTH_LONG
                ).show()
            }
        }
    }
    fun xuLySuaProduct(view:View)
    {
        var p:Product= Product(edtMa.text.toString(),edtTen.text.toString(),edtDonGia.text.toString().toDouble())
        SuaProductTask().execute(p)
    }
    inner class SuaProductTask : AsyncTask<Product,Void,Boolean>()
    {
        override fun doInBackground(vararg p0: Product?): Boolean {
            try {
                var p:Product?=p0[0]
                if(p==null)return false
                var connectionString = MongoClientURI("mongodb://172.16.96.86:27017")
                var mongoClient = MongoClient(connectionString)

                var database = mongoClient.getDatabase("QuanLySanPham")
                var collection = database.getCollection("Product")
                var filter = Filters.eq("Ma", p.Ma)
                var editDoc = Document("\$set",
                        Document("DonGia", p.DonGia)
                         .append("Ten", p.Ten))
                var ret:UpdateResult = collection.updateOne(filter, editDoc)
                return ret.modifiedCount>0
            } catch (ex: Exception) {
                Log.e("LOI", ex.toString())
            }
            return false
        }

        override fun onPostExecute(result: Boolean?) {
            super.onPostExecute(result)
            if(result==true)
            {
                Toast.makeText(applicationContext,"Sửa Product thành công",Toast.LENGTH_LONG).show()
            }
            else
            {
                Toast.makeText(applicationContext,"Sửa Product thất bại",Toast.LENGTH_LONG).show()
            }
        }
    }
}

Trong MainActivity ta bổ sung thêm sự kiện mở SuaProductActivity:

fun suaProduct(view:View)
{
    var intent= Intent(this,SuaProductActivity::class.java)
    startActivity(intent)
}

Chạy lên ta sẽ được kết quả như mong muốn.

Các bạn có thể tải source code đầy đủ ở đây: Source code sửa dữ liệu MongoDB trong Android Kotlin.

Và các Em chú ý là Project này sẽ được dùng cho bài sau nữa nha, nên bắt buộc phải hiểu và làm được bài này cho tốt.

Bài học Sau Tui sẽ hướng dẫn các bạn các kỹ thuật tương tác dữ liệu ( xóa) trực tiếp từ Android Kotlin tới MongoDB, các bạn chú ý theo dõi.

Các khóa học online khác, bạn có thể tham khảo tại đây: http://communityuni.com/

Chúc các bạn thành công!

 

2 responses

  1. […] chuỗi bài hướng dẫn tương tác MongoDB trong Android Kotlin, ta đã biết xem, thêm, sửa và giờ là thao tác Xóa. Kết thúc bài này ta đã hoàn thành sứ mệnh CRUD, tập […]

  2. […] tự trả lời câu hỏi của Tui như sau: Tại sao trong các bài 13, bài 14, bài 15, bài 16, bài 17, ta đã dùng Android để kết nối và tương tác CSDL MongoDB được rồi thì […]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: