ຈາກຂໍ້ມູນໃນ Excel ໃປຫາຂໍ້ມູນໃນ SQlite ໃນແອບ Android

    ຖ້າໃຜເຮັດວຽກໃນອົງກອນ ມັກຈະເຫັນເນາະ ສ່ວນຫຼາຍມັກຈະເກັບຂໍ້ມູນບາງສ່ວນໃນ Excel, ເພາະ Excel ສາມາດຈັດເກັບຂໍ້ມູນແບບ row-column ແລະ ຈັດການໄດ້ຢ່າງເທບເລີຍ.

    ມື້ນີ່ຈະມາອະທິບາຍກ່ຽວກັບວິທີການເອົາຂໍ້ມູນຈາກ Excel ໄປໃສ່ແອບແອນດຮອຍ, ຄ່າວໆແບບນີ້ເນາະ ບໍ່ເຂົ້າໃຈເບີ່ງຕາມຮູບເລີຍ.

from-xml-to-android-app

    ຈາກຂໍ້ມູນໃນ Excel ແລ້ວ export ເປັນ XML. ເຮົາສາມາດນຳເອົາຂໍ້ມູນທີ່ເປັນ XML ໄປໃສ່ໃນແອບເຮົາໄດ້ໂດຍ 2 ວິທີຄື: ກອບໄປໃສ່ raw folder ແບບດື້ໆເລີຍ (statics) ແລະ ແບບເອົາໄປເກັບໄວ້ໃນ server ແລ້ວໂຫຼດມາໃສ່ແອບເອົາ (dynamic) ເພື່ອໄປໃຊ້ໃນແອບຕໍ່ໄປ.

    ວິທີນຳເອົາຂໍ້ມູນຈາກ Excel ນຳໄປໃຊ້ໃນທາງໂປແກມທີ່ນິຍົມກັນຈະມີ .CSV (Comma delimited) ປະມານນີ້ເນາະ ທີສາມາດເອົາໄປ import ເຂົ້າຖານຂໍ້ມູນໄດ້ໂດກົງເລີຍ, ແຕ່ໂປເຈັກທີ່ກຳລັງເຮັດຢູ້ບໍ່ມີຖານຂໍ້ມູນກະເລີຍໄດ້ໃຊ້ XML ເອົາງ່າຍດີ. ຖາມວ່າ XML ແມ່ນຫຍັງ ເອົາໄປໃຊ້ຫຍັງດີ. ກະປະມານວ່າ XML ເປັນພາສາທີ່ມີໂຄງສ້າງຄ້າຍໆກັບ HTML ຫັ້ນຫຼະ ຄ້າຍຄືເນາະ, ໜ້າທີມັນຄ້າຍໆຄືກັບ ຖັງໃສ່ຫຍັງອີຫຍັງຈັກຢ່າງໜີ້ລະ ທີ່ເຮົາສາມາດປັງແຕ່ງໂຄງສ້າງພາຍໃນຖັງໄດ້ ແບບທີ່ເຮົາເຂົ້າໃຈ ແລະ ບັນຈຸອີຫຍັງເຂົ້າໄປ. ໃນການ code ກະໃຊ້ມັນເປັນສື່ໃນການເກັບຂໍ້ມູນແບບ tag-attribute-value ເພື່ອທີ່ຈະສົ່ງໄປບ່ອນອື່ນ ຫຼື ເກັບໄວ້, ສ່ວນໃຫຍ່ກະຖືກໃຊ້ເປັນໂຕຫໍ່ເກັບຂໍ້ມູນໄວ້ໃຫ້ເປັນໄຟດຽວ ແລ້ວສົ່ງໄປບ່ອນອື່ນ ຄືທີ່ເຫັນກະມີບາງເວັບສົ່ງຂໍ້ມູນຈາກ server ມາ client ໂດຍໃຊ້ XML. ແຕ່ແນະນຳເນາະ ຖ້າເອົາໄວ້ເກັບຂໍ້ມູນຫຼາຍໆ records ແມ່ນໃຫ້ເຮັດຖານຂໍ້ມູນເກັບດີກ່ວາ.


 

    * ຂັ້ນຕອນທີ I: export ຂໍ້ມູນທີເປັນ record ໃນ Excel ໃຫ້ເປັນ XML.

    ໃນ Excel ນັ້ນ ຖ້າໃຜເປັນ developer ກະໃຫ້ໄປເປິດໂໝດ developer ຊະ ຊີວິດຈະໄດ້ງ່າຍຂື້ນຫຼາຍເທົ່າ. ໃນ developer mode ມັນຈະມີ menu ມາໃຫ້ຫຼາຍໆເລີຍເຊັ່ນ: DEVELOPER, INQUIRE, POWERPIVOT. ຢາກຮູ້ວ່າແມ່ນຫຍັງກະໄປເປິດກັນເບີ່ງເນາະ. ໂດຍວິທີການເປິດແມ່ນໃຫ້ເຂົ້າໄປຕາມນີ້ເນາະ.

File>>Options>>Customize Ribbon ຫຼື ຄິກຂວາທີ Home ຫຼື menu ອື່ນກະໄດ້ ແລ້ວເລືອກ Customize Ribbon

    ໃນໜ້າຕ່າງເດັ້ງມາໃຫ້ໄປຕິກເອົາ Developer ຢູ່ເບື້ອງຂວາມື. ແຕ່ເຮັດເທົ່ານີ້ເຮົາຈະຍັງບໍ່ເຫັນເມນູ INQUIRE ກັບ POWERPIVOT ເທື່ອ ປະມານນີ້ເນາະ ລອງໆກັນໄປເບີ່ງ.

    ເມື່ອເປີດແລ້ວກະ ເຂົ້າໄປ Developer ແລ້ວຈະເຫັນໝວດເມນູ XML ຢູ່. ກ່ອນທີ່ຈະ ສ້າງ XML file ໄດ້ຕ້ອງເພີ່ມ XML Maps ກ່ອນ (ເມນູ Source), ໂດຍການເພີ່ມ ເຮົາຈະຕ້ອງໄດ້ສ້າງໂຄງສ້າງ XML ຂອງເຮົາຂື້ນມາ ແລ້ວຈັດເກັບເປັນ .xml ຫຼື xsd ກ່ອນ, ເພື່ອທີ່ຈະເຂົ້າໄປ add new XML maps ໄດ້. ຕົວຢ່າງ XML Maps.

<customers>
    <customer name=”” tel=”” email=”” address=”” />
    <customer name=”” tel=”” email=”” address=”” />
</customers>

    ໄຟນີ້ສ້າງຢູ່ໂປແກມໄດກະໄດ້ ແລ້ວແຕ່່ສະດວກ, ແຕ່ຢ່າລືມສ້າງເປັນ 2 ແຖວແບບນັ້ນ ແລ້ວຈັດເກັບເປັນ .xml ຫຼື .xsd ຕາມໃຈເລີຍ. ຕໍ່ໄປກະ ເພີ່ມເຂົ້າໄປໃນ XML Maps ແລ້ວດືງເຂົ້າໄປໃນ cell ເພື່ອເອົາຂໍ້ມູນໃສ່. ຫຼັງຈາກເອົາໃສ່ແລ້ວກະ export ເປັນ .xml ໄດ້ປົກກະຕິ. ອ່າ ລືມເຄັດບໍ່ລັບໄປຢ່າງໜື່ງ ໃນແທບ Developer ໃຫ້ກົດ Map properties ແລ້ວຕີກເອົາ “Append new data to existing xml tables”.

    ໜ້າຈະໄດ້ຂໍ້ມູນກັນໝົດລະເນາະມາຮອດໜີ້ລະ ຕໍໄປກະເອົາຂໍ້ມູນໄປເກັບໄວ້ໃນ server ຫຼື ໂຕໂປເຈັກເລິຍ ແລ້ວແຕ່ຄວາມເໝາະສົມ. ໃນໃນບົດຄວາມນີ້ຈະສະເໜີ ວິທີເທບໆຄື 1. ຈັບເມົ້າໃຫ້ແໜ້ນໆ ເປີດ android studio ຂື້ນມາ ໃຫ້ເຫັນ folder raw ແນ່ ແລ້ວໄປດືງລາກໄຟ XML ນັ້ນມາວາງໃສ່. ອະ! ຈົບ ພໍລະ CTRL + W ບໍ່ມີສາລະ ຫະຫະ. ເອົາງ່າຍກະກອບມາໃສ່ folder raw ຫັ້ນຫຼະ.

<?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes”?>
<customers>
    <customer name=”ສົມຫວັງ” tel=”************” email=”som99@gmail.com” address=”LPB” />
    <customer name=”ສົມປອງ” tel=”************” email=”som99@hotmail.com” address=”LPB” />
</customers>

   * ຂັ້ນຕອນທີ II: ອ່ານ .xml ໃນ android studio.

    ວິທີການອ່ານກະມີຫຼາຍວິທີ ແຕ່ອ່ານໄປອ່ານມາ ນຳຮອຍ native ໜີ້ຫຼະດີແລ້ວ ເພີ່ນບອກວ່າໃຫ້ໃຊ້ XmlPullParser. ເນື່ອງຈາກຂໍ້ມູນເຮົາຈະຈັດເກັບແບບແປກໆແນ່ ເອົາ value ມາໃສ່ໃນ attributes ຫະຫະ. ເຮັດແນວຊາວບ້ານເພີ່ນບໍ່ພາເຮັດ. ເພີ່ມເຕິມເນາະໃນຂໍ້ມູນ XML ບາງໂຕ ຢາກຈະບອກວ່າເຈັບຫົວນຳ ມັນແຕກລົງໄປລົງໄປແບບບໍ່ເທົ່າກັນຍັງບໍ່ພໍ values, attribute, tags ອີຫຍັງຕໍ່ອີຫຍັງ ຕ້ອງຂຽນໂປແກມແບບວ່າ ເກັບຄ່າ static final String ກີກ່ວາເບາະ. ເອົາແບບລຽບໜີ້ຫຼະດີແລ້ວ ຈະບໍ່ໄດ້ເປັນພາລະຕໍ່ໄປ.

    ເຂົ້າເລື່ອງດີກ່ວາ. ທຳອິດມາອ່ານໄຟໂດຍພ່ານ res folder ກັນໂດຍ InputStream ກ່ອນເລີຍ.

InputStream in= mContext.getResources().openRawResource(R.raw.customers_data);

   ແລ້ວກະເອົາ InputStream ນີ້ໄປຍັດໃສ່ XmlPullParser ເພື່ອເອົາໄປດືງຂໍ້ມູນຕໍ່ໄປ ຕາມ code ເຕັມໆກັນເລີຍ.

private XmlPullParser readFile(String fileName) {
    XmlPullParserFactory factory;
    try {
        factory = XmlPullParserFactory.newInstance();
        InputStream in = mContext.getResources().openRawResource(R.raw.fileName); //ອ່ານ .xml ຈາກ res>raw
        XmlPullParser xpParser = factory.newPullParser();
        xpParser.setInput(in, "UTF-8"); //ເຊັດໃຫ້ມັນຮູ້ວ່າເປັນ UTF-8
        return xpParser;
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    }
    return null;
}

    ເມື່ອເຮົາອ່ານໂດຍ InputStream ,ໄປຍັດໃສ່ XmlPullParser ແລ້ວໃຫ້ມັນ Return ອອກມາ. ຕໍ່ໄປເປັນການອ່ານຄ່າຈາກ XmlPullParser. ຮູ້ສືກວ່າມັນຈະອ່ານແຕ່ຕົ້ນຈົນຈົບໄຟ ແບບກວດຈາກ tag ທຳອິດ, tag ເປິດ, tag ປິດ ຕໍ່ໆໄປ ຈົນໝົດໄຟ. ໃນການອ່ານ ມັນຈະຫາ tag ເປິດ ກັບ tag ປີດ, ແລ້ວເຮົາສາມາດອ່ານ values, attribute, tag name ຕ່າງໆຂອງມັນ. ຖ້າໃນ tag ມີ tag ລົງໄປອີກ ມັນກໍ່ຈະຫາ tag ເປິດປິດ ແລ້ວອ່ານຄ່າຕໍ່ໆໄປຈົນ tag ຢ່ອຍໝົດ ແລ້ວຈັ່ງອ່ານ tag ທາງລຸ່ມຕໍ່ໄປ. ຄວນລະວັງ .xml ທີ່ມີ error ເພາະມັນຈະເກີດ error ຂື້ນໄດ້ໃນຕອນອ່ານໜີ້ຫຼະ. ຖ້າເປັນໄຟທີ່ສ້າງຂື້ນໃນ Excel ຄວນຫາ function ໃນ Excel ກວດສອບກະດີ

private ArrayList<HashMap<String, String>> getCustomers(XmlPullParser xpParser) 
     throws XmlPullParserException, IOException {
    if (null == xpParser)
        return null;

    ArrayList<HashMap<String, String>> mArrMap = new ArrayList<>();
    int eventType = xpParser.getEventType();

    /**
     * for !xpParser.getName().equals("customers") skip tags "customers"
     * */
    while (eventType != XmlPullParser.END_DOCUMENT) {
        if (eventType == XmlPullParser.START_DOCUMENT){
            Log.d(TAG, "Start document");
        } else if (eventType == XmlPullParser.START_TAG && !xpParser.getName().equals("categories")) {
            // ສາມາດ get attributes, tag name
            Log.d(TAG, "Start Tag:" + xpParser.getName());
            HashMap<String, String> mMap = new HashMap<>();
            mMap.put(KEY_NAME, xpParser.getAttributeValue(null, KEY_NAME));
            mMap.put(KEY_TEL, xpParser.getAttributeValue(null, KEY_TEL));
            mMap.put(KEY_EMAIL, xpParser.getAttributeValue(null, KEY_EMAIL));
            mMap.put(KEY_ADDR, xpParser.getAttributeValue(null, KEY_ADDR));

            mArrMap.add(mMap);
        } else if (eventType == XmlPullParser.TEXT){
            // ສາມາດ get value ພາຍໃນ tag
            Log.d(TAG, "Text: " + xpParser.getText());
        } else if (eventType == XmlPullParser.END_TAG){
            // ສາມາດ get tag name
            Log.d(TAG, "End tag: " + xpParser.getName());
        }
        eventType = xpParser.next();
    }
    return mArrMap;
}

    ສ່ວນຟັງຊັ່ນນີ້ແມ່ນໃຊ້ໄວ້ດືງເອົາຂໍ້ມູນ name, tel, email, addr ຂອງ customers ມາ. ສັງເກດດີໆ ວ່າເຮົາຈະດືງຂໍ້ມູນຢູ່ໃນ START_TAG ເພາະ attributes ມັນຈະຢູ່ພາຍໃນ tag. ຖ້າຂໍມູນເປັນແບບອື່ນ ແບບຄົນທົ່ວໆໄປໃຊ້ ຈະເກັບຂໍ້ມູນໃນ values ລະຫວ່າງ tag ເປິດ-ປິດ, ເຮົາກໍ່ຈະໄປດືງໃນ TEXT ໂດຍດືງເປັນ getText.

    ເອົາມາລວມກັນກະຈະເປັນແບບນີ້:

public ArrayList<HashMap<String, String>> readCustomers()
    throws IOException, XmlPullParserException {
    XmlPullParser xpParser = readFile(customers_data);
    return getCustomers(xpParser);
}

    ມາຮອດໜີ້ກະງົງໆເນາະ ໄຟພວກນີ້ຂຽນໄວ້ໃສ. ຊ່ວງນີ້ກະພະຢາຢາມແຍກໃຫ້ເປັນຮູບເປັນຮ່າງແນ່ ແບບ OOP ຕາມຊາວບ້ານເຂົາເຈົ້າ. ທີ່ເຮັດມາກະເລີຍສ້າງ class ຊື່ XmlLoader ແລ້ວກະເກັບ ທີ່ເຮົາຂຽນມາໄວ້ໃນຫັ້ນ, ຖ້າເຮົາມີ ຫຼ່າຍໄຟ ກະສ້າງ read*** ໄປຕາມແຕ່ລະໄຟ ແລ້ວເອີ້ນ read**** ແບບນີ້ງ່າຍດີ reuse ໄດ້ເລີຍ ແຮ່ໆໆ. ໃນຕົວຢ່າງ ເວລາເອີ້ນໃຊ້ກະສ້າງ Object ຂອງ XmlLoader mXml ແລ້ວເອີ້ນເອົາເລີຍ:

...
XmlLoader mXMlLoader = new XmlLoader(mContext);
ArrayList<HashMap<String, String>> mCustomers = mXMlLoader.readCustomers();
...

    ປະມານນີ້ເນາະ. ເພີ່ມເຕີມສຳຫຼັບໃຜທີມີຂໍ້ມູນຫຼາຍຊຸດແລ້ວແຕ່ລະຊຸດມີຫຼາຍຂໍ້ມູນຢູ່ໃນເຊັ່ນກັນ ແບບໃນຕົວຢ່າງ, ຫັນມາໃຊ້ເປັນ Object ໃຫ້ມັນແທນ HashMap ແນ່ກະດີ ແບບ get-set class.

public class Customers {

    private String sName;
    private String sTel;
    private String sEmail;
    private String sAddr;

    public String getsName() {
        return sName;
    }

    public void setsName(String sName) {
        this.sName = sName;
    }

    public String getsTel() {
        return sTel;
    }

    public void setsTel(String sTel) {
        this.sTel = sTel;
    }

    public String getsEmail() {
        return sEmail;
    }

    public void setsEmail(String sEmail) {
        this.sEmail = sEmail;
    }

    public String getsAddr() {
        return sAddr;
    }

    public void setsAddr(String sAddr) {
        this.sAddr = sAddr;
    }

    public Customers() {}
}

  ໄປເອີ້ນໃຊ້ກະເອົາໄປແທນ HashMap ແບບນີ້ (ລວມທັງຟັງຊັ່ນ readCustomers, getCustomers):

XmlLoader mXMlLoader = new XmlLoader(mContext);
ArrayList<Customers> mCustomers = mXMlLoader.readCustomers();

    ກະໝົດໄປສຳຫຼັບການ ເອົາຂໍ້ມູນຈາກ Excel ແລ້ວ export ເປັນຂໍ້ມູນໃນຮູບແບບ XML. ແລ້ວເອົາໄປເປັນຂໍ້ມູນແບບ statics ໃນ android project. ທີ່ຈີງແລ້ວຂໍ້ມູນພວກ statics ໃນ android studio, ໃນໂຕໂປແກມກະມີພວກຈັດການກັບ String, array ອີຫຍັງຢູ່ແລ້ວເນາະ. ຖ້າບໍ່ຈຳເປັນກະໄປໃຊ້ພວກນັ້ນແທນ ຈະໄດ້ສະບາຍຫຼາຍເທົ່າ ດ້ວຍໂຄດ ແຖວສອງແຖວ. ແຕ່ໃນບົດຄວາມນີ້ມັກຢາກ ຫະຫະ ຂະນາດຂໍ້ມູນ XML ຍັງເກັບໄວ້ໃນ attribute ເລີຍ ແທນທີ່ຈະເກັບເປັນ values ເອົາ.

    ໃນທ້າຍນີ້ກະຂອບໃຈເນາະ ເດບບ້ອງໆຄົນໄດອ່ານຈົບ ຖ້າມີຫຍັງບໍ່ຖືກຕ້ອງກະເນາະນຳມາໄດ້ເນາະ, ຍີນດີຮັບຄຳຕິຊົມ, ຖ້າມີຫຍັງຢາກໃຫ້ເພີ່ມເຕີມກະຍີນດີເຊັ່ນກັນ ບໍ່ວ່າຈະເປັນເລື່ອງຂໍ້ມູນໃນບລອກ ຫຼື ເປັນຕົວບລອກເອງ. ປລ.ມືໃໝ່ສະໝັກລີ້ນ.

    ຈັ່ງໄດກະຕິດຕາມກັນໄດ້ເນາະ Facebook. ປລ.ໄປກົດໄລ້ຕອນດລາມ່າ

 

Share via

Leave a Reply

Specify GooglePlus Client ID in Super Socializer > Social Login section in admin panel for GooglePlus Login to work