首先呢,SQLite 並不是像一般大型資料庫一樣要先建立好資料庫的實體
ex : 建立資料庫、建立資料表、計設資料表欄位之類的~
然後再經由程式進行存取,SQLite 是經由 Android 幫你建立的 (十分不習慣)
所以要繼承 SQLiteOpenHelper 然後來建立一個資料表
以下是步驟
首先建立一個 class 叫做 DBHelper 然後繼承 SQLiteOpenHelper
package com.android.myapp;
public class DBHelper extends SQLiteOpenHelper {
}
然後滑鼠移到繼承的 SQLiteOpenHelper 時會出現
Import SQLiteOpenHelper
按下去就會自動產生 code
然後滑鼠在移到劃紅線的 DBHelper 這個 Class 名稱
會出現 Add constructor DBHelper(Context,.....................)
也是點下去就會自己產生 code
然後幾乎什麼 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 的結果
結束

請問應用又是什麼? datalist sample1 viewcode1 都會出現錯誤
應用就是實際的操作資料庫的方法 因為前面只是在建立 DBHelper 這個class 然後繼承 SQLiteOpenHelper 然後透過DBHelper 這個class去操作資料庫 (新增、刪除、修改) datalist sample1 viewcode1 是我layout裡面的控制項 XD
datalist 無法解析或不是欄位 sample1 無法解析或不是欄位 viewcode1 無法解析或不是欄位 是什麼意思?? 怎麼改他都不行有什麼方法可以除錯嗎? :(
datalist 是這個範例視圖(layout) 的名字,找不到就會錯囉! setContentView(R.layout.datalist); <---- 你可以換成你的 layout sample1 + viewcode1 都是我視圖 datalist 裡面的 Button 控制項 只要拉兩個Button到你的 layout 上取名叫 (sample1 + viewcode1) 即可 但是名字可以自己取啊不一定要用我寫的 = =
我剛接觸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行)
不好意思,可以給一下你xml的程式碼嗎? 不太清楚你用的物件,一直建立失敗。 感謝~
我之前寫的這隻已經不見 = = sorry 了......
請問一下 這個做完之後是在手機上面建立資料庫的資料嗎?
喔 對啊,資料庫onCreate時會建立(可以看sql),onClick 時則會新增資料到sqlite
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 就直接塞資料了
DH = new DBHelper(this); 這行是做甚麼的?就只錯這個 顯示DBHelper(DataList)is undefined
這行是要初始化 DBHelper 用的 undefined 的話你可能要檢查一下 DBHelper 這個class有沒有建立 or 發生錯誤喔
*****
*****
*****
*****
請問您的意思是openDialog();整段可以不用寫吧? 請問其他地方我都成功了"下圖是用手機裝的 APP "SQLite Editor" 檢視 SQLite 的結果"是一定要透過別的程app開起嗎?還是可以直接在在原版的程式看到結果
哈囉你好~是的openDialog整個不用寫~ 至於檢視sqlite的話可以參考下面這些大大的文章 http://wangshifuola.blogspot.tw/2011/06/androidsqlitetable-schema.html http://fecbob.pixnet.net/blog/post/35698829 或是 firefox 也有套件可以直接檢視sqlite喔 https://addons.mozilla.org/zh-tw/firefox/addon/sqlite-manager/
請問一下 您是使用SQLite付費版的嗎 如果我手機沒有ROOT也能用嗎? 因為我看介紹他寫【最終的SQLite編輯root用戶。】 不太確定能不能用 如果是的話能教學怎麼使用嗎?
我是使用付費版的沒錯,這app要root才能使用喔!
可惜沒 layout 檔