2012年7月25日 星期三

Android:SQLite 新增 修改 刪除 列表 查詢

SQLite會用到兩個很重要的類別物件,SQLiteOpenHelper負責建立資料庫以及資料表
以及SQLiteDatabase負責資料的新增 修改 刪除 等操作

首先要新建一個class extends SQLiteOpenHelper


package com.sqltest;

import ....
public class Mydbhelper extends SQLiteOpenHelper {
static String dbname = "mydb";
static int version = 1;
static String dbtableSQL = "CREATE TABLE mytable ( _id integer primary key not null,"
+ "name text not null,sex text,addr text)";

// 內建的建構子,用來建立資料庫,但要傳入的參數有點多,所以我們改用自己的
public Mydbhelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
    //我們自己的建構子只需傳入Context頁面即可
public Mydbhelper(Context context) {
super(context, dbname, null, version);
// TODO Auto-generated constructor stub
}
    //建立資料表
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(dbtableSQL);

}
    //更新資料表
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub

}

}

主頁面程式

package com.sqltest;

import ...
public class MainActivity extends Activity {
EditText etname, etsex, etaddr;
TextView show;

SQLiteDatabase dbwr;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

etname = (EditText) findViewById(R.id.editText1);
etsex = (EditText) findViewById(R.id.editText2);
etaddr = (EditText) findViewById(R.id.editText3);
show = (TextView) findViewById(R.id.textView4);
        /*建立繼承SQLiteOpenHelper之類別物件,主要用來建構
出用於修改資料之SQLiteDatabase類別物件*/
Mydbhelper helper = new Mydbhelper(this);
dbwr = helper.getWritableDatabase();
Toast.makeText(this, "建立資料庫成功", 3000).show();
}
    //記得結束資料串流,避免資料遺失
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
dbwr.close();
}
        //修改
public void renewbut(View v) {
if (!etname.getText().toString().equals("")
&& !etaddr.getText().toString().equals("")) {
//ContentValues物件用來攜帶資料進資料表裡
ContentValues cv = new ContentValues();
//ContentValues.put("資料庫欄位",value)
cv.put("addr", etaddr.getText().toString());
//更新資料使用內建的API,SQLiteDatabase相關資料庫操作都會回傳一個long,可用來判斷是否有操作成功
//update(String table, ContentValues values, String whereClause, String[] 
whereArgs)
                        //whereClause 對應到SQL語法: name='XXX',SQL是用單引號
long check = dbwr.update("mytable", cv, "name='"
+ etname.getText().toString() + "'", null);
if (check > 0)
Toast.makeText(this, "修改成功", 3000).show();
else
Toast.makeText(this, "修改失敗", 3000).show();

} else {

Toast.makeText(this, "清輸入姓名以及地址", 3000).show();
}

}
       //刪除
public void delbut(View v) {
if (!etname.getText().toString().equals("")) {
long check = dbwr.delete("mytable", "name='"
+ etname.getText().toString() + "'", null);
if (check > 0) {
Toast.makeText(this, "刪除成功", 3000).show();
} else {
Toast.makeText(this, "刪除失敗", 3000).show();
}

} else {
Toast.makeText(this, "請輸入刪除資料之姓名", 3000).show();
}

}
       //新增
public void newbut(View v) {
ContentValues cv = new ContentValues();
cv.put("name", etname.getText().toString());
cv.put("sex", etsex.getText().toString());
cv.put("addr", etaddr.getText().toString());
long check = dbwr.insert("mytable", null, cv);
if (check > 0) {
Toast.makeText(this, cv.toString() + "新增成功", Toast.LENGTH_SHORT)
.show();

} else {
Toast.makeText(this, "新增失敗", Toast.LENGTH_SHORT).show();
}
}
       //查詢
public void querybut(View v) {
if (!etname.getText().toString().equals("")) {
//宣告一個Cursor變數,類似ResultSet,像是一個從資料表中得到的資料表單
Cursor c = null;
//Cursor表單中,擁有的欄位,必須與原資料表欄位名稱符合
String[] colum = { "name", "sex", "addr" };
c = dbwr.query("mytable", colum, "name='"
+ etname.getText().toString() + "'", null, null, null, null);
//針對Cursor變數進行操作,用迴圈將裡面的資料提領出來
if (c.getCount() > 0) {
String st1 = "";
//移動到第一筆
c.moveToFirst();
for (int i = 0; i < c.getCount(); i++) {
st1 = ("姓名:  " + c.getString(0) + "性別:  " + c.getString(1)
+ "地址:  " + c.getString(2) + "\n");
//移動到下一筆
c.moveToNext();
}
show.setText(st1);
Toast.makeText(this, "共有" + c.getCount() + "筆紀錄", 3000).show();
} else {
Toast.makeText(this, "沒有資料...", 3000).show();
}

} else {
Toast.makeText(this, "請輸入欲查詢之姓名", 3000).show();
}
}

//展示
            public void showbut(View v) {

Cursor c = null;
String[] colum = { "name", "sex", "addr" };
c = dbwr.query("mytable", colum, null, null, null, null, null);
if (c.getCount() > 0) {
String st1 = "";

c.moveToFirst();
for (int i = 0; i < c.getCount(); i++) {
st1 += ("姓名:  " + c.getString(0) + "性別:  " + c.getString(1)
+ "地址:  " + c.getString(2) + "\n");
c.moveToNext();
}
show.setText(st1);

Toast.makeText(this, "共有" + c.getCount() + "筆紀錄", 3000).show();
} else {
Toast.makeText(this, "沒有資料...", 3000).show();
}

}

}

13 則留言:

  1. 請問這有完整範例檔嗎??

    回覆刪除
  2. 請問可以跟你索取完整範例檔嗎?

    回覆刪除
  3. https://www.box.com/s/jv3x3tpesugxfm3aczrm

    回覆刪除
  4. 今天才看到你的回覆 特地來謝謝你的 :)

    回覆刪除
  5. 抱歉我是Android新手
    想請問您
    為何程式中不用做任何作按鈕的宣告或呼叫
    也可以做到按下按鈕就觸發的功能呢

    回覆刪除
    回覆
    1. XML直接定義屬性,在Button上
      android:onClick
      直接下載專案就可以看的到

      刪除
    2. 想再請問
      若要在手機上查詢 儲存的資料內容 或直接在檔案中新增資料 有辦法嗎? 路徑在哪

      此程式的刪除功能 可以把某一筆資料刪除 但編碼為重新編置 只會一直加上去
      這問題要如何解決?

      若查詢功能 想以關鍵字的方式 找相關的資料列出來 是否做的到呢?

      (抱歉問題有點多

      刪除
    3. hi~

      關於要在手機上查詢儲存的資料內容甚至修改SQLite資料庫,可以參考http://blog.csdn.net/chaozhung/article/details/8924318

      還有一種方法,可以去下載Play Store上的SQLite editor之類的App來進行修改,不過裝置必須要有root權限

      第二個問題,這個我也還在找方法。或許可以把資料撈出來後,不要印出_id,原先_id欄位就直接印出數字,每讀出一筆資料就+1這樣...

      第三個問題,範例中是以書名當關鍵字去搜尋,如果你要以價格或是其他欄位為關鍵字去搜尋,應該只要參考原先範例修改就可以了

      刪除
  6. 安安 我想參考一下你的完整檔 謝謝><

    回覆刪除