Android-資料庫Sqlite的建立,查詢及在ListView顯示
之前一直沒用到資料庫,也就沒看。突然有一天要用到才想去看,無奈得不到精髓,在這一塊也是消沉了好幾天都沒有進展,而且也看了蠻多的部落格,看完之後居然像沒看過一樣,好囧。。。。我也不知道是不是新手都這樣,如果是,那我一定很理解,如果不是,那隻能說我自己太懶了,沒有動手的能力。
後來看了Mars老師的視訊,然後跟著敲程式碼,程式碼跟著一樣,執行卻一直出現異常,百度上說異常的出現可能是Sql語句有錯誤,存在空格也不行,檢查無果,只能複製貼上原始碼了,正常執行。
所以就在Mars老師的程式碼基礎上來記錄一下Sqlite的簡單使用,並實現了查詢資料庫並在ListView上顯示。
佈局管理器裡面加入幾個Button和一個ListView:
為ListView的樣式佈局list.xml:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/create" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="createDatabase" /> <Button android:id="@+id/updateDatabase" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/delete" android:layout_alignLeft="@+id/query" android:text="updateDatabase" /> <Button android:id="@+id/insert" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/create" android:text="insert" /> <Button android:id="@+id/update" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/insert" android:layout_alignBottom="@+id/insert" android:layout_toLeftOf="@+id/updateDatabase" android:text="update" /> <Button android:id="@+id/query" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/update" android:layout_alignBottom="@+id/update" android:layout_toRightOf="@+id/create" android:text="query" /> <Button android:id="@+id/delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/query" android:layout_alignBottom="@+id/query" android:layout_toRightOf="@+id/query" android:text="delete" /> </RelativeLayout> <ListView android:id="@android:id/list" android:layout_width="wrap_content" android:layout_height="wrap_content" > </ListView> </LinearLayout>
接下來就是重點了,對於資料庫,Android平臺提供給我們一個輔助類幫助建立和管理資料庫——SQLiteOpenHelper,其使用方法如下:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/_id" android:layout_width="80px" android:layout_height="40sp" android:text="id" /> <TextView android:id="@+id/name" android:layout_width="250px" android:layout_height="40sp" android:text="name" /> <TextView android:id="@+id/credit" android:layout_width="80px" android:layout_height="40sp" android:text="credit" /> </LinearLayout>
SQLiteOpenHelper是一個輔助類來管理資料庫的建立和版本。
可以通過繼承這個類,實現它的一些方法來對資料庫進行一些操作。
所有繼承了這個類的類都必須實現下面這樣的一個構造方法:
public DatabaseHelper(Context context, String name, CursorFactory factory, int version)
1、Context型別,上下文物件。
2、String型別,資料庫的名稱
3、CursorFactory型別
4、int型別,資料庫版本
所以,第一步,需要新建一個類繼承SQLiteOpenHelper,名字為DatabaseHelper.java
package com.sqlite.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper{
private static final int VERSION = 1;
private String TABLE_NAME = "kecheng";
//四個引數的構造方法
public DatabaseHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
//三個引數
public DatabaseHelper(Context context, String name,
int version){
this(context, name, null, version);
}
//兩個引數
public DatabaseHelper(Context context, String name){
this(context, name,VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
System.out.println("create a Database");
StringBuffer sBuffer = new StringBuffer();
sBuffer.append("CREATE TABLE [" + TABLE_NAME + "] ("); //建立表和定義表明
sBuffer.append("[_id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ");//設定_id為主鍵,不能為空與自增性質
sBuffer.append("[name] TEXT,"); //一個為name的列名,型別為text,這點不同於java中的String
sBuffer.append("[credit] INTEGER)"); //一個為credit的列名,型別為INTEGER整型,代表學分
db.execSQL(sBuffer.toString());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
System.out.println("upgrade a Database");
}
}
之後就是在mainActivity.java中呼叫建立資料庫,註釋寫得很清楚,就不多囉嗦了。
package com.Android.sqlite;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.sqlite.db.DatabaseHelper;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
//定義Button,ListView,list資料集合,simpleAdapter介面卡
private Button create, updateDatabase, insert, updatebtn, query, delete;
private ListView listview = null;
private List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
private SimpleAdapter simpleAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//取得元件
create = (Button) findViewById(R.id.create);
updateDatabase = (Button) findViewById(R.id.updateDatabase);
insert = (Button) findViewById(R.id.insert);
updatebtn = (Button) findViewById(R.id.update);
query = (Button) findViewById(R.id.query);
delete = (Button) findViewById(R.id.delete);
listview = (ListView) findViewById(android.R.id.list);
//繫結事件監聽器
create.setOnClickListener(new CreateListener());
updateDatabase.setOnClickListener(new UpdateDatabaseListener());
insert.setOnClickListener(new InsertListener());
updatebtn.setOnClickListener(new UpdateListener());
query.setOnClickListener(new QueryListener());
delete.setOnClickListener(new DeleteListener());
//介面卡新增查詢結果,並加到ListView中顯示
simpleAdapter = new SimpleAdapter(this, getData(), R.layout.list,
new String[] { "_id", "name", "credit" }, new int[] {
R.id._id, R.id.name, R.id.credit });
listview.setAdapter(simpleAdapter);
}
class CreateListener implements OnClickListener {
@Override
public void onClick(View v) {
// 建立一個DatabaseHelper物件
DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this,
"test_my_db");
// 只有呼叫了DatabaseHelper物件的getReadableDatabase()方法,或者是getWritableDatabase()方法之後,才會建立,或開啟一個數據庫
SQLiteDatabase db = dbHelper.getReadableDatabase();
}
}
class UpdateDatabaseListener implements OnClickListener {
@Override
public void onClick(View v) {
DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this,
"test_my_db", 2);
SQLiteDatabase db = dbHelper.getReadableDatabase();
}
}
class InsertListener implements OnClickListener {
@Override
public void onClick(View v) {
DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this,
"test_my_db", 2);
SQLiteDatabase db = dbHelper.getWritableDatabase();
//插入資料語句,以事務處理方式插入
//主鍵不需要插入,會自己出現並自增
db.beginTransaction(); //開始事務處理
db.execSQL("insert into kecheng(name,credit) values('java基礎',2)");
db.execSQL("insert into kecheng(name,credit) values('行動通訊',3)");
db.execSQL("insert into kecheng(name,credit) values('通訊原理',2)");
db.execSQL("insert into kecheng(name,credit) values('微控制器設計',1)");
db.execSQL("insert into kecheng(name,credit) values('光纖通訊',3)");
db.execSQL("insert into kecheng(name,credit) values('電磁場與電磁波',2)");
db.execSQL("insert into kecheng(name,credit) values('微波通訊系統',3)");
db.execSQL("insert into kecheng(name,credit) values('大學英語',2)");
db.execSQL("insert into kecheng(name,credit) values('類比電子線路',3)");
db.execSQL("insert into kecheng(name,credit) values('數位電子線路',2)");
db.execSQL("insert into kecheng(name,credit) values('高等數學',3)");
db.execSQL("insert into kecheng(name,credit) values('C語言',3)");
db.execSQL("insert into kecheng(name,credit) values('EDA設計',2)");
db.execSQL("insert into kecheng(name,credit) values('感測器原理應用',3)");
db.setTransactionSuccessful(); //設定事務標誌為成功,當結束事務時就會提交事務
db.endTransaction();//結束事務
}
}
// 更新操作就相當於執行SQL語句當中的update語句
// UPDATE table_name SET XXCOL=XXX WHERE XXCOL=XX...
class UpdateListener implements OnClickListener {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// 得到一個可寫的SQLiteDatabase物件
DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this,
"test_my_db");
SQLiteDatabase db = dbHelper.getWritableDatabase();
//更新_id=5的資料,語句很容易理解
db.execSQL("UPDATE kecheng SET name='通訊原理1111',credit=4 WHERE _id=5");
}
}
class QueryListener implements OnClickListener {
@Override
public void onClick(View v) {
System.out.println("aaa------------------");
DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this,
"test_my_db");
SQLiteDatabase db = dbHelper.getReadableDatabase();
//下面是查詢語句
Cursor cursor = db.rawQuery("select * from kecheng ",
null);
while (cursor.moveToNext()) { //獲取遊標下移,作為迴圈,從而獲得所有資料
String id = cursor.getString(0); //獲取_id
String name = cursor.getString(1); //獲取name
String credit = cursor.getString(2);//獲取credit學分
System.out.println("query--->" + id + "," + name + "," + credit);//輸出資料
}
}}
class DeleteListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this,
"test_my_db");
SQLiteDatabase db = dbHelper.getReadableDatabase();
db.execSQL("delete from kecheng where credit=2");//刪除 學分為2的資料
}
}
private List<Map<String, Object>> getData() {
DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this,
"test_my_db");
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from kecheng where credit=3",
null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
String name = cursor.getString(1);
String credit = cursor.getString(2);
//這裡同樣是查詢,只不過把查詢到的資料新增到list集合,可以參照ListView的用法
Map<String, Object> map = new HashMap<String, Object>();
map.put("_id", id); //獲取_id
map.put("name", name); //獲取name
map.put("credit", credit); //獲取credit學分
list.add(map);
//System.out.println("query--->" + id + "," + name + "," + credit);
}
return list;
}
}
第一次執行,介面如第一個圖,可能會有人注意到,ListView沒有資料顯示啊?原因很簡單,因為我們把建立資料庫的操作和createDatabese按鈕綁定了,此時,當我們按下createDatabase按鈕時,資料庫才被建立,之後點選insert按鈕,匯入資料,我們可以使用adb除錯工具來看看是否成功,如第二個圖,很明顯,資料已成功插入,關於adb的使用在這裡就不講了,有需要的童鞋可以自己百度或者call me.
當點選query按鈕的時候,可以看到在LogCat下面已有資料輸出,這裡我們的查詢條件是輸出表內的所有資料,故查詢語句裡面使用*來代替。當重啟啟動程式,此時由於資料庫以建立,故ListView顯示出了資料。