14 ก.ค. 2554

Android Database

ตอนนี้ผมจะมาอธิบายการสร้าง Databases ใน Android กัน
ใน Android นั้นจะใช้ SQLite เป็น Databases ซึ่งจะต้องเข้าผ่านทาง adb
เริ่มแรกตรงส่วนนี้

public DbExpend(Context context) {
   super(context, "test.db", null,1);
}
จะเป็นการสร้างฐานข้อมูลชื่อ test.db โดยที่ให้เป็น 1 คือ Version นั่นเอง
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
} 
ตรงนี้ก็จะเป็นตอนเริ่มโปรแกรมว่าเราจะให้ทำอะไร ก็ตาม Code ด้านล่างเลยครับ 
ตอนสร้างในนี้ก็จะทำการใส่ SQL Command เข้าไป

DbExpend.java

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class DbExpend extends SQLiteOpenHelper {

    public DbExpend(Context context, String name, CursorFactory factory,
            int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }
    public DbExpend(Context context) {
        super(context, "test.db", null,1);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }
 @Override
 public void onCreate(SQLiteDatabase db) {
  String sql = "CREATE TABLE EXPEND ("+
            "ID INTEGER NOT NULL PRIMARY KEY ,"+
            "TYPE VARCHAR(30) NOT NULL ,"+
            "NAME VARCHAR(30) NOT NULL ,"+
            "MONEY DOUBLE NOT NULL  ,"+
            "DATE DATE NOT NULL );";     
     db.execSQL(sql);
 }

}
  


อันนี้เป็นไฟล์ DataLayer.java ไว้จัดการ Databases


import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class DataLayer {
   private DbExpend _dbHelper;
   public DataLayer(Context c) {
       _dbHelper = new DbExpend(c);
   }
   public void AddExpend(String TYPE,String NAME,double MONEY,String DATE) {
       SQLiteDatabase db = _dbHelper.getWritableDatabase();
       try {
           ContentValues values = new ContentValues();
           values.put("TYPE", TYPE);
           values.put("NAME", NAME);
           values.put("MONEY", MONEY);
           values.put("DATE", DATE);
           db.insert("EXPEND", "", values);
       } finally {
           if (db != null)
               db.close();
       }
   }
   public ArrayList<ResultExpend> SelectExpend() {
       SQLiteDatabase db = _dbHelper.getReadableDatabase();
       try {
           ArrayList<ResultExpend> results = new ArrayList<ResultExpend>();
           Cursor c = db.rawQuery("SELECT * FROM EXPEND",null);
           if (c.getCount()>0) {
               c.moveToFirst();
               do {
                   results.add(new ResultExpend(c.getInt(0),c.getString(1),c.getString(2),
                     c.getDouble(3),c.getString(4)));
               } while (c.moveToNext());
           }
           return results;
       } finally {
           if (db != null)
               db.close();
       }
   }
   public void UpdateExpend(double moneyupdate) {
      SQLiteDatabase db = _dbHelper.getWritableDatabase();
      try {
           ContentValues values = new ContentValues();
           values.put("MONEY", moneyupdate);
           int affected = db.update("EXPEND", values, null, null);
       } finally {
           if (db != null)
               db.close();
       }
   }
   public void DeleteEXPEND(int id) {
       SQLiteDatabase db = _dbHelper.getWritableDatabase();
       try {
           int recordsDeleted = db.delete("EXPEND", "ID ="+id, null);
       } finally {
           if (db != null)
               db.close();
       }
   }
   
  
}


อันนี้ ResultExpend.java เป็นสร้างไว้เก็บข้อมูลจาก Databases



public class ResultExpend {
 private int id;
 private String type;
 private String name;
 private double money;
 private String date;
 
 public ResultExpend(int id, String type,
   String name, double money,String date) {
  super();
  this.id = id;
  this.type = type;
  this.name = name;
  this.money = money;
  this.date = date;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getType() {
  return type;
 }
 public void setType(String type) {
  this.type = type;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public double getMoney() {
  return money;
 }
 public void setMoney(double money) {
  this.money = money;
 }
 public String getDate() {
  return date;
 }
 public void setDate(String date) {
  this.date = date;
 }
}

เวลาเรียกใช้

DataLayer d = new DataLayer(getBaseContext());
    ArrayList<ResultExpend> result = new ArrayList<ResultExpend>();
    result = d.SelectExpend();
    for(int i = 0;i<result.size();i++){
     Log.i("EXPEND","ID :"+result.get(i).getId());
     Log.i("EXPEND","TYPE :"+result.get(i).getType());
     Log.i("EXPEND","NAME :"+result.get(i).getName());
     Log.i("EXPEND","MONEY :"+result.get(i).getMoney());
     Log.i("EXPEND","DATE :"+result.get(i).getDate());
    }

ส่วนการเข้าไปดูในส่วนของ Database นั้นลองหาตัวอ่าน SQLite ใน window ดูนะครับ ขอบคุณที่แวะเข้ามาครับ ถ้ามีอะไรอยากถามก็โพสถามได้นะครับเช็คทุกวัน ถ้ามีเวลาจะพยายามตอบให้ เคยลองเขียนเกี่ยวกับเรื่อง Map Navigation อยู่บ้าง ออไปดูโปรแกรมที่ผมลองเขียนเล่นได้ที http://javadroids.blogspot.com/2011/09/program-xexplorer.html

6 ความคิดเห็น:

  1. ไม่ระบุชื่อ18 มกราคม 2555 02:40

    สวัสดีค่ะ คือว่าดิฉันกำลังพัฒนา App ของ android ที่ต้องเชื่อมต่อกับฐานข้อมูล แบบว่าเพิ่งเริ่ม แต่สงสัยว่าการจัดการฐานข้อมูล สามารถใช้วิธีอื่นนอกจากเขียนโค้ดควบคุมได้ไหมค่ะ เหมือนกับเขียน php แล้วใช้ dbms ของ phpmyadmin หนะค่ะ

    ตอบลบ
  2. โปรแกรม SQLite Databases Browser ครับ โหลดได้จาก http://sourceforge.net/projects/sqlitebrowser/

    วิธีใช้คร่าวๆ http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

    วิธีใส่เข้าไป http://www.boringmonday.com/jc/2010/11/22/sqlite-database-on-your-android-emulator/

    ลองทำดูนะครับ ตัวผมเองนั้น ใช้เป็น adb shell อาจจะดูลำบากหน่อยแต่ก็ละเอียดดีครับ
    http://stackoverflow.com/questions/1964077/how-can-you-access-the-contents-of-android-emulator-databases

    ตอบลบ
  3. SQLite Add-ons for Firefox
    https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

    ตอบลบ
  4. ไม่ระบุชื่อ18 มกราคม 2555 23:25

    ขอบคุณมากเลยนะคะ สำหรับคำตอบ ตอนนี้กำลังศึกษาและพยายามทำอยู่ค่ะ

    ตอบลบ
  5. ไม่ระบุชื่อ18 กรกฎาคม 2555 01:24

    คือผมอยากทราบว่า ที่คุณทำจากโค้ด คือเป็นสร้างดาต้าเบสโดยใช้โค้ด ใช่ไหมคับ
    คือผมเพิ่งหัดทำแอ๊นดอย แล้วที่คุณทำ มันไม่ได้มีฐานข้อมูลอยู่แล้วใช่ไหมอะคับ
    แต่คุณเพิ่งสร้างจากโค้ดเอาไหมคับ

    ตอบลบ
    คำตอบ
    1. ใช่ครับสร้างจากโคดเอา เมื่อเราสร้างดาต้าเบสแล้วภายในแอพเช่นชื่อ "DB1" ในแอพนั้นก็จะใช้ชื่อนี้ในการเรียกใช้
      จนกว่าจะลงแอพใหม่หรือ Clear Data ของแอพอันนี้ข้อมูลจะหายหมด
      ส่วนถ้าเราทำการ Update แล้วดาต้าเบสของเราก็ยังอยู่นะครับ สามารถสร้างได้หลายๆ ดาต้าเบส
      ส่วนการสร้างก็สามารถสร้างภายนอกได้แล้วทำการไปใส่ในภายหลังได้ หรือสร้างผ่าน ADB ลองหาดูใน
      Google ครับ

      ลบ