2012-07-05

Android 手機資料庫(二) - SQLite操作:新增、修改、刪除

上一節已經介紹了SQLite的創建及查詢

這節為你介紹SQLite的新增、修改、刪除

不囉嗦,直接進入主題

新增資料

package jim.memorandum;
import android.database.sqlite.SQLiteDatabase;

public class Add extends Activity {

        //SQLiteDatabase對象
 SQLiteDatabase db;
 //資料庫名
 public String db_name = "MemorandumSQL";
   
 //表名
 public String table_name = "newMemorandum";

 //輔助類名
 NewListDataSQL helper = new NewListDataSQL(Add.this, db_name);

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

          //以輔助類獲得類據庫對象
   db = helper.getWritableDatabase();
        }

        //儲存
        Button Add = (Button)findViewById(R.id.btn_save);
        
        View.OnClickListener listener1 = new View.OnClickListener() {  
        
        public void onClick(View view) {  
         String strToast = "新增成功!";//返回訊息
         note = (EditText) findViewById(R.id.editText1);//備忘事項
         
        //寫進SQLite
      ContentValues cv = new ContentValues();
      cv.put("date", date_add.getText().toString() + time_add.getText().toString());
      cv.put("note",note.getText().toString());
     String sPW = pw.getText().toString();
   //checkBox打勾了才加入密碼
   if(ckBox.isChecked())
   {
    strToast = strToast + " 密碼保護:已開啟!";
    if(sPW.equalsIgnoreCase(""))
    {
     cv.put("pw","");
    }
    else{
        cv.put("pw",sPW);
    }
   }
   else
   {
    strToast = "新增成功!";
    cv.put("pw","");
   }
   
   //提醒
   if(ck_remind_add.isChecked())
   {
    cv.put("reminder",1);
   }
   else
   {
    cv.put("reminder",0);
   }
   
   //備註
   cv.put("memo","");
   cv.put("type", "");
   
     //添加方法
      long long1 = db.insert(table_name, "", cv);
      //Cursor c = db.query(table_name, null, null, null, null,null, null);
      //添加成功後返回行號,失敗後返回-1
    if (long1 == -1) {
     Toast.makeText(Add.this,
       "新增失敗!", Toast.LENGTH_SHORT)
       .show();
    } else {
     mID = (int) long1;
       //加入提醒
      if(ck_remind_add.isChecked())
      {
        strToast = strToast + " 提醒:已開啟!";
        setReminder(true); 
      }
     
      
     Toast.makeText(Add.this,
       strToast, Toast.LENGTH_SHORT)
       .show();
     
     //新增完成就關閉
     Add.this.finish(); 
     
     //跳回主畫面,用下面的方式才會刷新
     Intent intent_request = new Intent(Add.this, MemorandumActivity.class);
     Add.this.startActivity(intent_request);
      
    }
           }  
       };  
       Add.setOnClickListener(listener1); 

說明:

創建db之前第一篇就有說明過了,所以這裡就不再贅述,不了解的請參考第一篇

New 一個 ContentValues 容器,用於儲存要新增進資料庫的資料

用法為ContentValues .put(欄位名稱,值)

再來新增進資料庫   long long1 = db.insert(table_name, "", cv);

long1是資料庫回傳值,-1表示失敗、不為-1時為新增的到第幾筆的行號

比如說資料庫內有二筆,我現在新增成功了,long1就會返回3

可以用來顯示現在資料庫共有幾筆資料

最後用Toast.makeText顯示成功訊息就完成新增了。



修改資料

  //修改:db.update(table,Values,whereClause,whereArgs)
 long long1 = db.update("newMemorandum", cv, "_ID=" + ID, null);

說明:

修改和新增大部份都相同,就只有寫入資料庫的指令不同

db.update(table,Values,whereClause,whereArgs)

table 表名:相對於SQL from後面的部份

Values :要修改的欄位名稱及修改的值

whereClause:

刪除資料

long long1 = db.delete("newMemorandum", "_ID=" + MID[index], null); 

說明:

和修改大同小異,這裡就不再說明了,看程式碼應該就能了解了

後記:

新增、修改、刪除這樣就算完成了,其實不算太難
資料庫儲存必須考慮記憶體空間及版更後資料必須保留等問題
這個後續我會再做說明,如有不懂請來信,謝謝。

14 則留言:

  1. 你好 我想製作,刪除一整排欄位的資料,請問要怎麼編寫delete呢?

    回覆刪除
    回覆
    1. 一整排的欄位?你是要把一欄刪除掉這樣是嗎?還是一筆資料?

      如果是一筆,上面就有說明了

      如果是table的一個欄位,SQLite不能做單一欄位的刪除,如下官方說明頁:
      http://www.sqlite.org/lang_altertable.html

      唯一的方法是drop掉舊的table再create一個你要的新的table這樣

      方法是先create一個新的table,把資料倒過去後再drop掉舊的table這樣。

      刪除
  2. 不好意思~ 我照您的方法實踐,但是在insert的時候,程式就彈出:
    不幸,程式已經停止的訊息。

    請問一下我是哪個步驟可能不對呢?

    回覆刪除
    回覆
    1. insert錯誤有可能是新增的資料對應錯誤
      或是新增了錯誤的欄位資料值
      加入的是null值也可能會出現錯誤喔
      所以檢查一下要新增的變數內的值是否正確
      及對應欄位是否正確,從這方面去檢查應該就沒問題才對

      刪除
  3. 請問一下,如果我要儲存的是Arraylist
    那在儲存那邊要怎麼編寫呢??

    回覆刪除
    回覆
    1. 你的儲存是指什麼?儲存進資料庫還是儲存進arraylist?

      刪除
    2. 將arraylist 儲存進資料庫

      刪除
    3. 跑arraylist的迴圈就能取到每一筆資料 然後在單筆單筆insert to db 不然就做bulkInsert先做好一整包然後再一次存全部

      刪除
  4. 您好 我在新增資料的時候
    long1有累加上去
    但是我用其他的程式我的資料庫沒有新增資料 這是正常的嗎?

    回覆刪除
  5. 作者已經移除這則留言。

    回覆刪除
  6. 作者已經移除這則留言。

    回覆刪除
  7. 請問如果update的whereClause要用多欄位該怎麼辦呢

    回覆刪除
  8. 您好,我想將相片及其詳細資料丟進資料庫以便查詢整理,該怎麼寫呢?

    回覆刪除
    回覆
    1. 我是這樣做的給你參考:
      相片在DB的欄位是設VARCHAR
      取得的相片先轉bitmap 再轉成 byte
      String base64 = Base64.encodeToString(bytes, Base64.DEFAULT)
      上面這個可以再轉成String就能存到DB了,給你參考

      刪除

您的寶貴建議是我前進的動力!