編輯:Android開發實例
知識點:
1.使用SQL Helper創建數據庫
2.數據的增刪查改(PRDU:Put、Read、Delete、Update)
背景知識:
上篇文章學習了android保存文件,今天學習的是保存數據到SQL數據庫中。相信大家對數據庫都不陌生。對於大量重復的,有特定結構的數據的保存,用 SQL數據庫 來保存是最理想不過了。
下面將用一個關於聯系人的數據庫Demo來具體學習。
具體知識:
1.定義Contract類
在創建SQL數據庫之前,要創建Contract類。那什麼是Contract類呢?
代碼如下:
Contract Class的定義:
Contract Class,又可以叫做Companion Class。
Android Developer的幫助文檔是這麼說的:
< A contract class is a container for constants that define names for URIs,
tables, and columns. The contract class allows you to use the same constants
across all the other classes in the same package. This lets you change a
column name in one place and have it propagate throughout your code.>
Contact 類是定義URI、表、列的名字的容器。這個類允許我們在同一包的不同類下使用相同的常量。
我們在一處修改了列名,同時傳播到我們代碼的每個地方。
代碼如下:
package com.example.sqlitetest;
//Contract類
public class Contact {
int _id;
String _name;
String _phone_number;
public Contact(){
}
public Contact(int id, String name, String _phone_number){
this._id = id;
this._name = name;
this._phone_number = _phone_number;
}
public Contact(String name, String _phone_number){
this._name = name;
this._phone_number = _phone_number;
}
public int getID(){
return this._id;
}
public void setID(int id){
this._id = id;
}
public String getName(){
return this._name;
}
public void setName(String name){
this._name = name;
}
public String getPhoneNumber(){
return this._phone_number;
}
public void setPhoneNumber(String phone_number){
this._phone_number = phone_number;
}
}
2.使用SQLHelper創建數據庫
就像保存文件在內部存儲一樣,Android在私有的應用存儲空間存儲我們的數據庫,這樣就保證我們的數據是安全的。不能被其他應用訪問到。
在設備上存儲的數據庫保存在:
/data/data/<package_name>/databases目錄下
為了使用SQLiteOpenHelper,我們需要創建一個重寫了onCreate(),onUpgrade()和onOpen()回調方法的子類。
3.數據的增刪改查
增:傳ContentValue值到insert()方法。
代碼如下:
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName());
values.put(KEY_PH_NO, contact.getPhoneNumber());
db.insert(TABLE_CONTACTS, null, values);
db.close();
刪:delete()方法
代碼如下:
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
new String[] { String.valueOf(contact.getID()) });
db.close();
改:update()方法
代碼如下:
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName());
values.put(KEY_PH_NO, contact.getPhoneNumber());
return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
ew String[] { String.valueOf(contact.getID()) });
查:query()方法
代碼如下:
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
cursor.getString(1), cursor.getString(2));
return contact;
完整DatabaseHelper代碼如下:
代碼如下:
package com.example.sqlitetest;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
// 數據庫版本
private static final int DATABASE_VERSION = 1;
// 數據庫名
private static final String DATABASE_NAME = "contactsManager";
//Contact表名
private static final String TABLE_CONTACTS = "contacts";
//Contact表的列名
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_PH_NO = "phone_number";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// 創建表
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
+ KEY_PH_NO + " TEXT" + ")";
db.execSQL(CREATE_CONTACTS_TABLE);
}
// 更新表
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 刪除舊表
db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
//再次創建表
onCreate(db);
}
/**
*增刪改查操作
*/
// 增加新的聯系人
void addContact(Contact contact) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName());
values.put(KEY_PH_NO, contact.getPhoneNumber());
// 插入行
db.insert(TABLE_CONTACTS, null, values);
db.close(); // 關閉數據庫的連接
}
// 獲取聯系人
Contact getContact(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
cursor.getString(1), cursor.getString(2));
return contact;
}
// 獲取所有聯系人
public List<Contact> getAllContacts() {
List<Contact> contactList = new ArrayList<Contact>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_CONTACTS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
Contact contact = new Contact();
contact.setID(Integer.parseInt(cursor.getString(0)));
contact.setName(cursor.getString(1));
contact.setPhoneNumber(cursor.getString(2));
contactList.add(contact);
} while (cursor.moveToNext());
}
return contactList;
}
// 更新單個聯系人
public int updateContact(Contact contact) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName());
values.put(KEY_PH_NO, contact.getPhoneNumber());
//更新行
return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
new String[] { String.valueOf(contact.getID()) });
}
// 刪除單個聯系人
public void deleteContact(Contact contact) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
new String[] { String.valueOf(contact.getID()) });
db.close();
}
// 獲取聯系人數量
public int getContactsCount() {
String countQuery = "SELECT * FROM " + TABLE_CONTACTS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
cursor.close();
return cursor.getCount();
}
}
還有一些代碼不是本次學習的重點,就不貼出來了。有需要的留言找我要。
Demo運行效果圖:
一、概述 近期注意到QQ新版使用了沉浸式狀態欄
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
Android性能優化-布局優化 今天,繼續Android性能優化 一 編碼細節優化。 編碼細節,對於程序的運行效率也是有很多的影響的。今天這篇主題由於
本文要演示的Android開發實例是如何完成一個Android中的miniTw