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:

[code language=”xml”]
<?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>
[/code]

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 đó):

[code language=”java”]
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”)
[/code]

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:

[code language=”java”]
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
[/code]

Để 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è:

[code language=”java”]
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()
}
}
}
}
[/code]

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

[code language=”java”]
fun suaProduct(view:View)
{
var intent= Intent(this,SuaProductActivity::class.java)
startActivity(intent)
}
[/code]

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:

https://unica.vn/?aff=11929

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

2 thoughts on “Bài 16-Sửa dữ liệu MongoDB trong Android Kotlin”

Leave a Reply