จากบทความที่แล้วที่ผู้เขียนได้นำเสนอวิธีสร้างแอพพลิเคชั่นสแกนบาร์โค๊ดไป แต่ยังไม่ได้ทำในส่วนของฐานข้อมูลเอาไว้อย่างที่ตั้งหัวข้อเอาไว้ ฉะนั้นในบทความนี้ ก็จะสานต่อจากบทความที่แล้ว
บทความที่แล้วได้ ทำให้แอพพลิเคชั่นสามารถสแกนบาร์โค๊ดได้แล้ว โดยการนำค่าสตริงที่เก็บอยู่ใน Key String มาเก็บไว้ที่ตัวแปร
ในความเป็นจริงในการทำสต็อกสินค้า เราจะทำการ สร้างบาร์โค๊ดสำหรับสินค้านั้นๆ แล้วจึงใส่รายละเอียดข้อมูลสินค้าเข้าไป เช่น ชื่อ, ลักษณะ, ราคา, ยี่ห้อ, ขนาด, ปริมาณ ฯลฯ แล้วแต่ยูสเซอร์ได้เลย ซึ่งบาร์ทำหน้าที่อ้างอิงข้อมูลเหล่านี้
คอนเซ็ปของแอพตัวนี้ ผู้เขียนต้องการทำเพื่อเก็บข้อมูลสินค้าในฐานะผู้ซื้อ ไม่ใช่ ผู้ขาย หมายความว่า ผู้ซื้อสามารถสร้างฐานข้อมูลของตัวเองเอาไว้ เพื่อความสะดวกในการซื้อสินค้าชิ้นเดิมในครั้งต่อๆไปในภายหลัง นั้นเอง
ส่วนในบทความนี้ ผู้เขียนจะพัฒนาในส่วนของ ฐานข้อมูลและการป้อนข้อมูลลงฐานข้อมูลเท่านั้น
ผู้เขียนจะสร้างระบบในการสแกนเพื่อนำมาสินค้ามารวมใน พร้อมแสดงผลออกมาดังรูปภายได้ ในภายหลัง
ร่วมสนับสนุนนักเขียนด้วยการคลิ๊กลิ้ง ด้านล่าง ขอบคุณครับ รับรองไม่มีไวรัส
มาดูตัวอย่างของแอพที่ผู้เขียนพัฒนาขึ้น
ภาพนี้เป็นสินค้าตัวอย่างไม่ได้ค่าโฆษณาแต่อย่างใด ของแค่ได้ใจของผู้อ่าน ก็พอ ฮิ้ววววว
เอ้า มาต่อ
เมื่อสแกนเสร็จเราจะเห็นว่า เราได้รหัส ที่อ่านได้ตรงตาม บาร์โค๊ด
จากนั้น ก็ระบุรายละเอียดด้วยผู้ซื้อเอง
ดันกดนิ้ว Volume มาด้วย เมื่อกด ตกลง ก็มีข้อความขึ้นมาว่า เพิ่มข้อมูลเสร็จสิ้น เท่านี้ข้อมูลก็เข้าไปอยู่ในฐานข้อมูลเรียบร้อยแล้ว
แต่ก่อนอื่นมาลองทำความเข้าใจกับขั้นตอนของระบบกันก่อน หรืออัลกอริทึมนั่นเอง สำหรับผู้ที่สนใจบางท่าน อาจจะมองปุ้ปรู้ปั้ม เหมือนจับวาง หรือเรียกว่า เมพ...ขิงๆ ก็ขออภัยก็แล้วกันนะครับ แต่เพื่อที่บางท่านอาจจะยังใหม่ในการเขียนโปรแกรม (ปล. ผู้เขียนก็ยังใหม่เหมือนกัน สามารถชี้แนะได้น่ะ มาคุยกัน) ผู้เขียนจะขออธิบาย กันลืมเองก็แล้วกัน อยากให้เข้าใจมากกว่า เข้ามาก็อปโค๊ดไปแปะ โปรดใช้วิธีพิมพ์ตาม นะครับ
ร่วมสนับสนุนนักเขียนด้วยการคลิ๊กลิ้ง ด้านล่าง ขอบคุณครับ รับรองไม่มีไวรัส
Step 1. สร้าง Input Text
Step 2. รับค่าตัวแปรที่ได้จาก การสแกนมาเก็บเอาไว้ ในตัวแปร
Step 3. เช็คค่าในช่อง Input เมื่อกด ปุ่ม Button
Step 3.1 แปลงค่าทุกช่องให้เป็นค่า String
Step 3.2 Select เลือกฐานข้อมูล
Step 3.3 Insert ป้อนลงฐานข้อมูล
Step 4. ตั้งค่าใน Input ให้เป็นช่องว่าง แบบค่าสตริง (" ")
Step 5. แจ้งเตือน
ตัวอย่าง code
String content = getIntent().getExtras().getString("CONTENT");
barcode.setText(content);
ในโค๊ดด้านบนนี้ เป็นคำสั่งดึงค่าจาก key String ของการ intent ส่งค่า และ set ค่าในของ Input ด้วยตัวแปรที่เก็บค่าเท่าไว้
โค๊ดทั้งหมด
package com.blogspot.sheepcodeblog.scannerbarcodetodatabase;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.database.sqlite.SQLiteDatabase;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class InputData extends ActionBarActivity {
databaseScanner DBscan;
SQLiteDatabase db_manage ;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_input_data);
DBscan = new databaseScanner(this);
db_manage = DBscan.getWritableDatabase();
Step 1.
final EditText barcode = (EditText) findViewById(R.id.editbarcode); final EditText name = (EditText) findViewById(R.id.editname); final EditText cost = (EditText) findViewById(R.id.editcost); final EditText where = (EditText) findViewById(R.id.editwhere);
Step 2.
String content = getIntent().getExtras().getString("CONTENT"); barcode.setText(content);
Step 3.
Button okey = (Button) findViewById(R.id.buttonok);
okey.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Step 3.1
String barcodeString = barcode.getText().toString();
String nameString = name.getText().toString();
String costString = cost.getText().toString();
String whereString = where.getText().toString();
Step 3.2
if (barcodeString.length() != 0 && nameString.length() != 0 && costString.length() != 0 && whereString.length() != 0) { Cursor cursor = db_manage.rawQuery("SELECT * FROM " + databaseScanner.TABLE_NAME + " WHERE " + databaseScanner.COL_ID + "= '" + barcodeString + "'" + " AND " + databaseScanner.COL_NAME + "= '" + nameString + "'" + " AND " + databaseScanner.COL_COST + "= '" + costString + "'" + " AND " + databaseScanner.COL_WHERE + "= '" + whereString + "'", null); Step 3.3
if (cursor.getCount() == 0) { db_manage.execSQL(" INSERT INTO " + databaseScanner.TABLE_NAME + " (" + databaseScanner.COL_ID + ", " + databaseScanner.COL_NAME + ", " + databaseScanner.COL_COST + ", " + databaseScanner.COL_WHERE + " ) VALUES ( '" + barcodeString + "', '" + nameString + "', '" + costString + "', '" + whereString + "'); "); Step 4
barcode.setText(" ");
name.setText(" ");
cost.setText(" ");
where.setText(" ");
Step 5
Toast.makeText(getApplicationContext(), " เพิ่มข้อมูลเสร็จสิ้น ", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), " มีข้อมูลนี้แล้ว", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(getApplicationContext(), "กรุณป้อนให้ครบทุกช่อง", Toast.LENGTH_LONG).show();
}
}
});
}
public void onStop() {
super.onStop();
DBscan.close();
db_manage.close();
}
}
โค๊ดตัวอย่าง ฐานข้อมูล
package com.blogspot.sheepcodeblog.scannerbarcodetodatabase;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/** * Created by sheepcodeblog.blogspot.com on 11/4/15. */public class databaseScanner extends SQLiteOpenHelper {
private static final String DB_NAME = "scanDb";
private static final int DB_VERSION = 1;
public static final String TABLE_NAME = "scanTable";
public static final String COL_ID = "id_scan";
public static final String COL_NAME = "name";
public static final String COL_COST = "cost";
public static final String COL_WHERE = "date";
public databaseScanner (Context context) {
super(context, DB_NAME, null, DB_VERSION);
// TODO Auto-generated constructor stub }
@Override public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String create = "CREATE TABLE " + TABLE_NAME + " (" + COL_ID +" INTEGER PRIMARY KEY, " + COL_NAME + " TEXT, " + COL_COST + " TEXT, " + COL_WHERE + " TEXT);" ;
String insert = "INSERT INTO " + TABLE_NAME + " (" + COL_ID + " , " + COL_NAME + " , " + COL_COST + " , " + COL_WHERE + " ) VALUES ( '8888','SheepCode','blog','Blogspot.com');";
db.execSQL(create);
db.execSQL(insert);
}
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
ตัวอย่างโค๊ด XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:weightSum="1">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="125dp"
android:layout_weight="0.44"
android:weightSum="1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="บันทึกสินค้า"
android:id="@+id/textView"
android:layout_gravity="center_horizontal" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="76dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="barcode"
android:id="@+id/txtbarcode" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editbarcode"
android:layout_gravity="center_horizontal" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="41dp"
android:text="ชื่อสินค้า"
android:id="@+id/txtname" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editname" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="163dp">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="94dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ราคาสินค้า"
android:id="@+id/txtcost" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editcost" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ที่ไหน"
android:id="@+id/txtwhere" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editwhere" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="77dp">
<Button
android:layout_width="187dp"
android:layout_height="wrap_content"
android:text="ตกลง"
android:id="@+id/buttonok" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ยกเลิก"
android:id="@+id/buttoncancel" />
</LinearLayout>
</LinearLayout>
นอกจากนี้ ขอพูดถึงข้อเสียในการทำแอพแบบเสียหน่อย
ข้อแรกก็คือ ในการทำระบบโดยการใช้ Intent รู้สึกค่อนข้างจะสแกนได้ช้า และการควบคุมโฟกัสช้า ขณะที่ทำการสแกน เมื่อเปรียบเทียบกับ การเปิดแอพ barcode scan โดยตรง แค่สกิดนิดเดียวก็แสดงผลแล้ว ถือว่ายังได้ผลที่ยังไม่ดีนักสำหรับการนำไปใช้ในเชิงธุรกิจ
แต่ยังไม่สามารถบอกได้ 100% เพียงแค่บอกว่า ใช้วิธี Intent นี้แล้ว ช้า...
ถ้าหากลองใช้วิธีนำ library ของ zxing มาต่อยอด ก็อาจจะเร็วขึ้นก็ได้
ข้อสอง คือ ถ้าหากผู้ซื้อนำไปใช้จริงๆแล้วละก็ ค่อนข้างเสียเวลาที่จะต้องสแกนและป้อน ข้อมูลเอง ถ้าหากว่าราคามีการปรับเปลี่ยนอยู่ตลอดเวลา ผู้ใช้คงเซ็งน่าดู ก็ยังถือว่า ยังใช้ไม่ได้
ร่วมสนับสนุนนักเขียนด้วยการคลิ๊กลิ้ง ด้านล่าง ขอบคุณครับ รับรองไม่มีไวรัส
แล้วทำแอพนี้ขึ้นมาทำไม
1. เรียนรู้การใช้ สแกนบาร์โค๊ด
2. รู้ว่า ทำได้จริง แต่ยังไม่ดี ต้องพัฒนาเพิ่ม
3. เอามันส์
ยังไม่จบ
บทถัดไป จะสแกนแล้วนำมาแสดงผล เป็น ผลรวม โชว์ค่า