[公告] 痞客豐年終!萬元禮券限量送~[公告] 第一屆痞客邦金點賞登場!2014年最有影響力的部落格即將揭曉[公告] 痞客邦新服務上線 每日星座運勢測算【得獎名單公佈】[公告] 痞客邦應用市集全新改版![公告] 痞客邦「應用市集」新 App 上架-iFontCloud Professional
歡迎轉載(註明出處)或直接轉貼網址也ok,但是請不要直接把內容摳走貼在別的地方 = =

首先呢,SQLite 並不是像一般大型資料庫一樣要先建立好資料庫的實體

ex : 建立資料庫、建立資料表、計設資料表欄位之類的~

然後再經由程式進行存取,SQLite 是經由 Android 幫你建立的 (十分不習慣)

所以要繼承 SQLiteOpenHelper 然後來建立一個資料表

 

以下是步驟

首先建立一個 class 叫做 DBHelper 然後繼承 SQLiteOpenHelper

  package com.android.myapp;

  public class DBHelper extends SQLiteOpenHelper {
	

  }

然後滑鼠移到繼承的 SQLiteOpenHelper 時會出現

Import SQLiteOpenHelper

按下去就會自動產生 code 

a

然後滑鼠在移到劃紅線的 DBHelper 這個 Class 名稱

會出現 Add constructor DBHelper(Context,.....................)

也是點下去就會自己產生 code

b  

 然後幾乎什麼 code 都還沒寫,程式碼就會長這樣

package com.android.myapp;

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

public class DBHelper extends SQLiteOpenHelper {

	public DBHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		
	}
	

}

其中覆寫的 onCreate 指的是如果 Android 載入時找不到生成的資料庫檔案,就會觸發 onCreate 

onUpgrade 則是如果資料庫結構有改變了就會觸發 onUpgrade 

所以很明顯的我們要把產生資料表的 SQL 寫在這 onCreate

然後首先我們要先定義資料庫名稱與版本,所以請看 line 8 ~ 10 

package com.android.myapp;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {
	private final static int _DBVersion = 1; //<-- 版本
	private final static String _DBName = "SampleList.db";	//<-- db name
	private final static String _TableName = "MySample"; //<-- table name
	public DBHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		
	}

}

然後程式中有一段  super(context, name, factory, version);

super 關鍵字指的是目前這個 class 的上一層,也就是 SQLiteOpenHelper

我們把剛剛定義的變數傳給 name 與 version

於是就變成

super(context, _DBName, factory, _DBVersion);

再來我們就分別在 onCreate 與 onUpgrade 放入SQL的命令

所以最後就會如下

package com.android.myapp;

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

public class DBHelper extends SQLiteOpenHelper {
	
	private final static int _DBVersion = 1;
	private final static String _DBName = "SampleList.db";	
	private final static String _TableName = "MySample";
	public DBHelper(Context context) {
		super(context, _DBName, null, _DBVersion);
		// TODO Auto-generated constructor stub		
	}


	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		final String SQL = "CREATE TABLE IF NOT EXISTS " + _TableName + "( " +
		                       "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
				               "_TITLE VARCHAR(50), " +
		                       "_CONTENT TEXT," +
				               "_KIND VARCHAR(10)" +
				           ");";
        db.execSQL(SQL);
	}
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		final String SQL = "DROP TABLE " + _TableName;
        db.execSQL(SQL);		
	}

}

這邊要注意的是好像一定要把 primary key 的名字設定為 _id,不然好像會 error 

到此就寫完了

 

然後再來是應用

package com.android.myapp;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.*;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class DataList extends Activity implements View.OnClickListener {
    private Button sample1;
    private Button viewcode1;
    private DBHelper DH = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.datalist);
        findControl();
        setClick();
        openDB();
    }
    private void add(String Title,String Content,String Kind){
        SQLiteDatabase db = DH.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("_TITLE", Title.toString());
        values.put("_CONTENT", Content.toString());
        values.put("_KIND", Kind.toString());
        db.insert("MySample", null, values);
    }
    private void openDB(){
    	DH = new DBHelper(this);  
    }
    private void closeDB(){
    	DH.close();    	
    }
    
    private void findControl() {
    	sample1 = (Button)findViewById(R.id.sample1);
    	viewcode1 = (Button)findViewById(R.id.viewcode1);
    }
    
    private void setClick() {
        sample1.setOnClickListener(this);
    	viewcode1.setOnClickListener(this);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        closeDB();
    }
    
	@Override
	public void onClick(View v) {
		
		//Toast popup = Toast.makeText(this, "hello", Toast.LENGTH_SHORT);
		//popup.show();
		if (v.getId() == R.id.sample1) {			
			add("A","test","1");
			openDialog("test","1");					
		} else if (v.getId() == R.id.viewcode1) {			
			add("B","test","2");
			openDialog("","2");			
		}
	}
	
	private void openDialog(String Msg,String Mode) {
		if (Mode =="1") {
		   TextView AlertMsg = new TextView(this);
	       AlertMsg.setText(Msg);	
		   new AlertDialog.Builder(this).setTitle("效果").setView(AlertMsg).show();	       
		} else if (Mode == "2") {
		   String url = "file:///android_asset/Sample.html";
		   WebView AlertMsg = new WebView(this);
		   WebSettings websettings = AlertMsg.getSettings();  
	       websettings.setSupportZoom(true);  
	       websettings.setJavaScriptEnabled(true);  
		   AlertMsg.setWebViewClient(new WebViewClient());  
		   AlertMsg.loadUrl("file:///android_asset/Sample.html");
		   new AlertDialog.Builder(this).setTitle("程式碼")
		   .setView(AlertMsg).show();				
			
		}

	}
	
}

這樣就可以寫入資料表了

下圖是用手機裝的 APP "SQLite Editor" 檢視 SQLite 的結果

2012-11-14_15-35-01

 

結束 

Posted by 小雕 at 痞客邦 PIXNET 留言(10) 引用(0) 人氣()


open trackbacks list Trackbacks (0)

留言列表 (10)

Post Comment
  • ..
  • 請問應用又是什麼?
    datalist
    sample1
    viewcode1
    都會出現錯誤
  • 應用就是實際的操作資料庫的方法
    因為前面只是在建立 DBHelper 這個class 然後繼承 SQLiteOpenHelper
    然後透過DBHelper 這個class去操作資料庫 (新增、刪除、修改)

    datalist
    sample1
    viewcode1
    是我layout裡面的控制項 XD

    小雕 replied in 2013/01/28 15:39

  • 訪客

  • datalist 無法解析或不是欄位
    sample1 無法解析或不是欄位
    viewcode1 無法解析或不是欄位
    是什麼意思?? 怎麼改他都不行有什麼方法可以除錯嗎? :(
  • datalist 是這個範例視圖(layout) 的名字,找不到就會錯囉!
    setContentView(R.layout.datalist); <---- 你可以換成你的 layout

    sample1 + viewcode1 都是我視圖 datalist 裡面的 Button 控制項
    只要拉兩個Button到你的 layout 上取名叫 (sample1 + viewcode1) 即可
    但是名字可以自己取啊不一定要用我寫的 = =

    小雕 replied in 2013/01/29 12:04

  • 訪客
  • 我剛接觸Android SQLite照上面的用都沒有出現
    對不起我是初心者
    建立Android資料庫要第一步要怎麼做比較好
  • 其實我也是初學者,我從.net 跳過來的 = =
    大家就互相討論吧!

    第一步你要先實作一個 class 用來幫你處理跟資料庫有關的作業

    以上面的範例為例 :
    首先新增一個 class 叫做 DBHelper 然後繼承 SQLiteOpenHelper
    然後你就會看到他自動幫你生成了 onCreate 與 onUpgrade 這兩個方法
    onCreate 指的是你的App開始 run 的時候就會觸發這個方法
    因為我們一開始根本沒有任何資料表,必須仰賴 android 幫我們生成
    所以理所當然我們就把 Create Table 的這個 SQL 命令寫在這方法裡面


    第二步就是該如何使用你剛寫好的 DBHelper 這個 class
    其實你可以不用管我layout 上的那些控制項,只要知道如何使用就好了

    1.開啟資料連線 (第26行裡面的 openDB())

    2. 按下按鈕後測試寫入資料庫,一開始你可以把值寫死,例如 :
    SQLiteDatabase db = DH.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("_TITLE", "111");
    values.put("_CONTENT", "222");
    values.put("_KIND", "333");
    db.insert("MySample", null, values);

    3.物件消滅 onDestroy (第54行)

    小雕 replied in 2013/01/30 16:04

  • 訪客
  • 不好意思,可以給一下你xml的程式碼嗎?
    不太清楚你用的物件,一直建立失敗。

    感謝~
  • 我之前寫的這隻已經不見 = = sorry 了......

    小雕 replied in 2013/03/24 20:17

  • Shu-Wei Ye
  • 請問一下
    這個做完之後是在手機上面建立資料庫的資料嗎?
  • 喔 對啊,資料庫onCreate時會建立(可以看sql),onClick 時則會新增資料到sqlite

    小雕 replied in 2013/03/24 20:16

  • 羽涵
  • String url = "file:///android_asset/Sample.html";
    AlertMsg.loadUrl("file:///android_asset/Sample.html");
    程式run不出來,請問這兩行程式是做什麼用的,是分別指到什麼網頁?
    那如果要新增資料的話要怎麼新增,因為沒有輸入的欄位?
    兩個button的功用是?
    不好意思問題有點多,謝謝^^''
  • 其實應該是這樣寫,就帶變數進去
    String url = "file:///android_asset/Sample.html";
    AlertMsg.loadUrl(url);

    但因為我只是隨便測試寫入sqlite而已所以沒管那麼多 = =

    AlertMsg 的話是一個 WebView
    然後 loadUrl 的 uri 位置是 file:///android_asset/Sample.html
    意思就是他會去開那個網頁
    而那個網頁的位置呢 就在你專案根目錄下的assets資料夾
    你可以在資料夾內丟個 Sample.html 就會去開啟那個網頁了
    (這是我之前寫的某隻程式拿來改的,因為這篇只是為了練習 sqlite 所以開網頁這個動作沒任何意義你可以忽略 = =)

    然後那兩個按鈕按下去除了會把資料寫入 sqlite之外
    還會開一個內箝在AlertDialog的網頁Sample.html (開網頁在這例子中無特別意義,可以忽略 = =)
    動作大概是這樣~~

    如果你要輸入的控制項也可以自己放,然後改成 button click 時再去抓輸入框的值寫入 sqlite 就好了,我這篇因為只是練習sqlite,所以 button click 就直接塞資料了

    小雕 replied in 2013/04/03 09:36

  • JaelHsieh
  • DH = new DBHelper(this);
    這行是做甚麼的?就只錯這個
    顯示DBHelper(DataList)is undefined
  • 這行是要初始化 DBHelper 用的
    undefined 的話你可能要檢查一下 DBHelper 這個class有沒有建立 or 發生錯誤喔

    小雕 replied in 2013/07/31 10:29

  • Private Comment
  • Private Comment

You haven’t logged in yet, please use guest status to leave message. You can also log in with above service account and leave message

other options