在Android平台上可以操作數據庫,這是第一次接觸Android時的驚艷之一。在Android平台上,綁定了SQLite數據庫,這個數據庫系統也是極具性格的,它的最大的應用場景是嵌入式系統,進一步了解可以參看這里。
如果有JDBC的經驗,那么在這里會容易的多。Android中操作數據庫首先要通過一個 類:android.database.sqlite.SQLiteOpenHelper。它封裝了如何打開一個數據庫,其中當然也包含如果數據庫不存在 就創建這樣的邏輯。看一個例子:
pubilc class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "com.roiding.simple.note";
private static final int DATABASE_VERSION = 1;
private static final String NOTES_TABLE_NAME = "notes";
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + NOTES_TABLE_NAME
+ " (id integer primary key autoincrement, name text);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS notes");
onCreate(db);
}
}
這里面,如下的語句需要解釋:
• super(context, DATABASE_NAME, null, DATABASE_VERSION)
數據庫連接的初始化,中間的那個null,是一個CursorFactory參數,沒有仔細研究這個參數,暫時置空吧。
• public void onCreate(SQLiteDatabase db)
這里面的onCreate是指數據庫onCreate時,而不是DatabaseHelper的onCreate。也就是說,如果已經指定 database已經存在,那么在重新運行程序的時候,就不會執行這個方法了。要不然,豈不是每次重新啟動程序都要重新創建一次數據庫了!在這個方法中,完成了數據庫的創建工作。也就是那個execSQL()方法。
• public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
在程序的開發維護過程中,數據庫的結構可能會有變化,那么這個方法就有用處了。在DatabaseHelper這個對象一創建時,就已經把參數 DATABASE_VERSION傳入,這樣,如果Android發現此版本與現有版本不一致,就會調用這個onUpgrate方法。於是,可以在這里面實現一些數據的upgrade工作,比如說創建一個臨時表,將數據由臨時表中轉到新的表結構中。需要注意的是,這里面的onUpgrade是在版本不一致時調用,也就是說不管當前需要的版本高於現有版本還是低於現有版本,都會出發這個方法,類似的這種情況,就需要對oldVersion和 newVersion進行判斷之后再決定使用什么策略來更新數據。
在Android中,數據庫存放在 /data/data/PACKAGE_NAME/databases 目錄下。
接下來就可以使用這個Helper來操作數據庫了,操作數據庫也就無非是增、刪、改、查。先看一個增的例子:
public static void insert(Context context, String s) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);
String table = "notes";
String nullColumnHack = "id";
ContentValues values = new ContentValues();
values.put("name", "www.roiding.com");
long id = mOpenHelper.getReadableDatabase().insert(table,
nullColumnHack, values);
mOpenHelper.getReadableDatabase().close();
}
DatabaseHelper mOpenHelper = new DatabaseHelper(context);
如果和JDBC例子的話,這一步貌似就像是獲得了一個Statement,用它就可以操作數據庫了。
ContentValues values = new ContentValues();
Android在向數據庫中插入數據的時候,要求數據存放到ContentValues中,這里面的ContentValues其實就是一個 Map,Key值是字段名稱,Value值是字段的值。這樣,也許你會發現一個問題,那數據類型怎么辦?其實在SQLite數據庫中就是沒有數據類型的, 一切都是字符串。
mOpenHelper.getReadableDatabase().insert(table,nullColumnHack, values);
將數據入庫,注意這里面有一個nullColumnHack,看文檔是和所有字段都是空的記錄有關系,我沒有去實驗他具體的效果,只是隨便給他一個字段名稱。
再看一個查的例子:
public static void select(Context context) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);
String table = "notes";
String[] columns = new String[] { "id", "name" };
String selection = "id>? and name<>?";
String[] selectionArgs = new String[] { "0", "roiding.com" };
String groupBy = null;
String having = null;
String orderBy = "id desc";
String limit = "1";
Cursor c = mOpenHelper.getReadableDatabase().query(table,
columns, selection, selectionArgs, groupBy, having, orderBy, limit);
c.moveToFirst();
for (int i = 0; i < c.getCount(); i++) {
String s = c.getString(1);
c.moveToNext();
}
c.close();
mOpenHelper.getReadableDatabase().close();
}
DatabaseHelper mOpenHelper = new DatabaseHelper(context);
於前文中的相同
mOpenHelper.getReadableDatabase().query();
通過mOpenHelper.getReadableDatabase(),會得到一個SQLiteDatabase類型的只讀的數據庫連接,在這里直接調用了他的query方法。這個query方法相對復雜,因為他將一個完整的SQL語句拆成了若干個部分:
table:表名。相當於SQL的from后面的部分。那如果是多表聯合查詢怎么辦?那就用逗號將兩個表名分開,拼成一個字符串作為table的值。
columns:要查詢出來的列名。相當於SQL的select后面的部分。
selection:查詢條件,相當於SQL的where后面的部分,在這個語句中允許使用“?”,也就是說這個用法和JDBC中的PreparedStatement的用法相似。
selectionArgs:對應於selection的值,selection有幾個問號,這里就得用幾個值。兩者必須一致,否則就會有異常。
groupBy:相當於SQL的group by后面的部分
having:相當於SQL的having后面的部分
orderBy:相當於SQL的order by后面的部分,如果是倒序,或者是聯合排序,可以寫成類似這樣:String orderBy = “id desc, name”;
limit:指定結果集的大小,它和Mysql的limit用法不太一樣,mysql可以指定從多少行開始之后取多少條,例如“limit 100,10”,但是這里只支持一個數值。
c.moveToFirst();
這一句也比較重要,如果讀取數據之前,沒有這一句,會有異常。
c.getString(1);
與JDBC一致了,Android不支持按字段名來取值,只能用序號。
再看一個刪除和修改的例子:
public static void delete(Context context) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);
String table = "notes";
String selection = "id>? and name<>?";
String[] selectionArgs = new String[] { "0", "roiding.com" };
String whereClause = selection;
String[] whereArgs = selectionArgs;
mOpenHelper.getWritableDatabase().delete(table, whereClause, whereArgs);
mOpenHelper.getWritableDatabase().close();
}
有了上面的基礎這里就容易理解了,這里的whereClause相當於前面的selection,whereArgs相當於前面的selectionArgs。
public static void update(Context context) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);
String table = "notes";
String selection = "id>? and name<>?";
String[] selectionArgs = new String[] { "0", "roiding.com" };
String whereClause = selection;
String[] whereArgs = selectionArgs;
ContentValues values = new ContentValues();
values.put("name", "www.roiding.com");
mOpenHelper.getWritableDatabase().update(table, values,
whereClause, whereArgs);
mOpenHelper.getWritableDatabase().close();
}
這個update的用法,綜合select和delete就可以理解。
注意:
Cursor和Databases要及時關閉,不然也會有異常。
getWritableDatabase()和getReadableDatabase()在當前的Android版本中貌似可以通用,像上面的insert,用的就是getReadableDatabase。
在真實的應用中,會對上面這些基本操作做更高一級的抽象和封裝,使之更容易使用。在select時,除了用上述的方法,將分段的SQL語句傳進去之外,Android還支持一種方法:使用SQLiteQueryBuilder。如果使用的是上述的分段SQL語句的方法,在Android的內部實現中,也是先將分段的SQL使用SQLiteQueryBuilder的靜態方法來生成一個真正的SQL的,而且,我沒有看出來使用SQLiteQueryBuilder的優勢。
Tags: delete, getReadableDatabase, getWritableDatabase, insert, query, SQLite, SQLiteOpenHelper, update
每個應用程序都要使用數據,Android應用程序也不例外,Android使用開源的、與操作系統無關的SQL數據庫--SQLite,本文介紹的就是如何為你的Android應用程序創建和操作SQLite數據庫。
數據庫支持每個應用程序無論大小的生命線,除非你的應用程序只處理簡單的數據,那么就需要一個數據庫系統存儲你的結構化數據,Android使用SQLite數據庫,它是一個開源的、支持多操作系統的SQL數據庫,在許多領域廣泛使用,如Mozilla FireFox就是使用SQLite來存儲配置數據的,iPhone也是使用SQLite來存儲數據的。
在Android中,你為某個應用程序創建的數據庫,只有它可以訪問,其它應用程序是不能訪問的,數據庫位於Android設備/data/data/ /databases文件夾中,在這篇文章中,你將會學習到如何在Android中創建和使用數據庫。
SQLite數據庫
使用Eclipse創建一個Android項目,取名為Database,如圖1所示:
圖1 數據庫-使用Eclipse創建你的Android新項目
創建DBAdapter輔助類
操作數據庫的最佳實踐是創建一個輔助類,由它封裝所有對數據庫的復雜訪問,對於調用代碼而言它是透明的,因此我創建了一個DBAdapter的輔助類,由它創建、打開、關閉和使用SQLite數據庫。
首先,在src/ 文件夾(在這個例子中是src/net.learn2develop.Database)下添加一個DBAdapter.java文件。
在DBAdapter.java文件中,導入所有你要使用到的命名空間:
package net.learn2develop.Databases;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBAdapter
{
}
接下來創建一個數據庫,取名為bookstitles,字段如圖2所示。
圖2 數據庫字段
在DBAdapter.java文件中,定義清單1中的常量。
清單1 定義DBAdapter.java文件中的常量
package net.learn2develop.Database;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBAdapter
{
public static final String KEY_ROWID = "_id";
public static final String KEY_ISBN = "isbn";
public static final String KEY_TITLE = "title";
public static final String KEY_PUBLISHER = "publisher";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "books";
private static final String DATABASE_TABLE = "titles";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
"create table titles (_id integer primary key autoincrement, "
+ "isbn text not null, title text not null, "
+ "publisher text not null);";
private final Context context;
}
DATABASE_CREATE常量包括創建titles表的SQL語句。
在DBAdapter類中,你可以擴展SQLiteOpenHelper類,它是一個Android輔助類,主要用於數據庫創建和版本管理。實際上,你可以覆蓋onCreate()和onUpgrade()方法,如清單2所示。
清單2 在DBAdapter類中,擴展SQLiteOpenHelper類覆蓋onCreate() 和 onUpgrade()方法
package net.learn2develop.Database;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBAdapter
{
public static final String KEY_ROWID = "_id";
public static final String KEY_ISBN = "isbn";
public static final String KEY_TITLE = "title";
public static final String KEY_PUBLISHER = "publisher";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "books";
private static final String DATABASE_TABLE = "titles";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
"create table titles (_id integer primary key autoincrement, "
+ "isbn text not null, title text not null, "
+ "publisher text not null);";
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public DBAdapter(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion
+ " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS titles");
onCreate(db);
}
}
}
onCreate()方法創建一個新的數據庫,onUpgrade()方法用於升級數據庫,這可以通過檢查DATABASE_VERSION常量定義的值來實現,對於onUpgrade()方法而言,只不過是簡單地刪除表,然后在創建表而已。
現在你可以定義不同的方法來打開和關閉數據庫,如清單3中的添加/編輯/刪除/行的函數。
清單3 定義打開和關閉數據庫以及增加/編輯/刪除表中行的方法
public class DBAdapter
{
//...
//...
//---打開數據庫---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//---關閉數據庫---
public void close()
{
DBHelper.close();
}
//---向數據庫插入一個標題---
public long insertTitle(String isbn, String title, String publisher)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_ISBN, isbn);
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_PUBLISHER, publisher);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//---刪除一個指定的標題---
public boolean deleteTitle(long rowId)
{
return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}
//---檢索所有標題---
public Cursor getAllTitles()
{
return db.query(DATABASE_TABLE, new String[] {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_PUBLISHER},
null,
null,
null,
null,
null);
}
//---檢索一個指定的標題---
public Cursor getTitle(long rowId) throws SQLException
{
Cursor mCursor =
db.query(true, DATABASE_TABLE, new String[] {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_PUBLISHER
},
KEY_ROWID + "=" + rowId,
null,
null,
null,
null,
null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
//---更新一個標題---
public boolean updateTitle(long rowId, String isbn,
String title, String publisher)
{
ContentValues args = new ContentValues();
args.put(KEY_ISBN, isbn);
args.put(KEY_TITLE, title);
args.put(KEY_PUBLISHER, publisher);
return db.update(DATABASE_TABLE, args,
KEY_ROWID + "=" + rowId, null) > 0;
}
}
注意Android使用Cursor類返回一個需要的值,Cursor作為一個指針從數據庫查詢返回結果集,使用Cursor允許 Android更有效地管理它們需要的行和列,你使用ContentValues對象存儲鍵/值對,它的put()方法允許你插入不同數據類型的鍵值。
清單4顯示了完整的DBAdapter.java源代碼。
清單4 DBAdapter.java完整源代碼
package net.learn2develop.Database;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBAdapter
{
public static final String KEY_ROWID = "_id";
public static final String KEY_ISBN = "isbn";
public static final String KEY_TITLE = "title";
public static final String KEY_PUBLISHER = "publisher";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "books";
private static final String DATABASE_TABLE = "titles";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
"create table titles (_id integer primary key autoincrement, "
+ "isbn text not null, title text not null, "
+ "publisher text not null);";
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public DBAdapter(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion
+ " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS titles");
onCreate(db);
}
}
//---打開數據庫---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//---關閉數據庫---
public void close()
{
DBHelper.close();
}
//---向數據庫中插入一個標題---
public long insertTitle(String isbn, String title, String publisher)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_ISBN, isbn);
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_PUBLISHER, publisher);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//---刪除一個指定標題---
public boolean deleteTitle(long rowId)
{
return db.delete(DATABASE_TABLE, KEY_ROWID +
"=" + rowId, null) > 0;
}
//---檢索所有標題---
public Cursor getAllTitles()
{
return db.query(DATABASE_TABLE, new String[] {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_PUBLISHER},
null,
null,
null,
null,
null);
}
//---檢索一個指定標題---
public Cursor getTitle(long rowId) throws SQLException
{
Cursor mCursor =
db.query(true, DATABASE_TABLE, new String[] {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_PUBLISHER
},
KEY_ROWID + "=" + rowId,
null,
null,
null,
null,
null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
//---更新一個標題---
public boolean updateTitle(long rowId, String isbn,
String title, String publisher)
{
ContentValues args = new ContentValues();
args.put(KEY_ISBN, isbn);
args.put(KEY_TITLE, title);
args.put(KEY_PUBLISHER, publisher);
return db.update(DATABASE_TABLE, args,
KEY_ROWID + "=" + rowId, null) > 0;
}
}
TAG: Android android 數據庫
使用數據庫
現在你已經可以利用創建的輔助類來使用數據庫了,在DatabaseActivity.java文件中,創建一個DBAdapter類的實例:
package net.learn2develop.Database;
import android.app.Activity;
import android.os.Bundle;
public class DatabaseActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
}
}
增加一個標題
如果想在titles表中增加一個標題,可以使用DBAdapter類的insertTitle()方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
//---add 2 titles---
db.open();
long id;
id = db.insertTitle(
"0470285818",
"C# 2008 Programmer's Reference",
"Wrox");
id = db.insertTitle(
"047017661X",
"Professional Windows Vista Gadgets Programming",
"Wrox");
db.close();
}
insertTitle()方法返回插入行的ID,如果在添加過程中遇到錯誤,它就返回-1。
如果你分析Android設備/模擬器的文件系統,你可以看到book數據庫創建在database文件夾下,如圖3所示。
圖3 database文件夾
檢索所有標題
想要檢索titles表中的所有標題,可以使用DBAdapter類的getAllTitles()方法,如清單5所示。
清單5 使用DBAdapter類的getAllTitles()方法檢索titles表中的所有標題
package net.learn2develop.Database;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.Toast;
public class DatabaseActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
//---獲取所有標題---
db.open();
Cursor c = db.getAllTitles();
if (c.moveToFirst())
{
do {
DisplayTitle(c);
} while (c.moveToNext());
}
db.close();
}
}
返回的結果是一個Cursor對象,如果要顯示所有標題,你首先應該調用Cursor對象的moveToFirst()方法,如果它成功(意味着至少有一行有效),使用DisplayTitle()方法顯示詳細的標題,要移動到下一個標題,可以調用Cursor對象的moveToNext()方法,下面是DisplayTitle()方法的定義:
public void DisplayTitle(Cursor c)
{
Toast.makeText(this,
"id: " + c.getString(0) + "\n" +
"ISBN: " + c.getString(1) + "\n" +
"TITLE: " + c.getString(2) + "\n" +
"PUBLISHER: " + c.getString(3),
Toast.LENGTH_LONG).show();
}
圖4顯示Toast類,它從數據庫中檢索並顯示一個標題。
圖4 Toast類
檢索單個標題
想要通過ID檢索單個標題,可以使用DBAdapter類的getTitle()方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
//---get a title---
db.open();
Cursor c = db.getTitle(2);
if (c.moveToFirst())
DisplayTitle(c);
else
Toast.makeText(this, "No title found",
Toast.LENGTH_LONG).show();
db.close();
}
返回的結果是一個Cursor對象,如果返回一行,可以使用DisplayTitle()方法顯示標題的詳細信息,否則就使用Toast類顯示一個錯誤消息。
更新一個標題
要更新一個特定的標題,可以調用DBAdapter的updateTitle()方法,傳遞想要更新的標題的ID給它就可以了,如清單6所示。
清單6 調用DBAdapter類的updateTitle()方法更新標題
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
//---更新標題---
db.open();
if (db.updateTitle(1,
"0470285818",
"C# 2008 Programmer's Reference",
"Wrox Press"))
Toast.makeText(this, "Update successful.",
Toast.LENGTH_LONG).show();
else
Toast.makeText(this, "Update failed.",
Toast.LENGTH_LONG).show();
//-------------------
//---檢索相同的標題---
Cursor c = db.getTitle(1);
if (c.moveToFirst())
DisplayTitle(c);
else
Toast.makeText(this, "No title found",
Toast.LENGTH_LONG).show();
//-------------------
db.close();
}
如果更新成功會顯示一條表示成功的消息,同時,你可以檢索剛剛更新的標題看更新結果是否正確。
刪除一個標題
想要刪除一個標題,可以調用DBAdapter類的deleteTitle()方法,傳遞你想要刪除的標題的ID即可:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
//---delete a title---
db.open();
if (db.deleteTitle(1))
Toast.makeText(this, "Delete successful.",
Toast.LENGTH_LONG).show();
else
Toast.makeText(this, "Delete failed.",
Toast.LENGTH_LONG).show();
db.close();
}
如果刪除成功會顯示一條表示成功的消息。
升級數據庫
要升級數據庫,修改DBAdapter類中DATABASE_VERSION常量的值比之前的值大,如之前的值是1,將其改為2:
public class DBAdapter
{
public static final String KEY_ROWID = "_id";
public static final String KEY_ISBN = "isbn";
public static final String KEY_TITLE = "title";
public static final String KEY_PUBLISHER = "publisher";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "books";
private static final String DATABASE_TABLE = "titles";
//---change this to a higher value---
private static final int DATABASE_VERSION = 2;
private static final String DATABASE_CREATE =
"create table titles (_id integer primary key autoincrement, "
+ "isbn text not null, title text not null, "
+ "publisher text not null);";
當你再次運行這個應用程序時,你會在Eclipse的LogCat窗口中看到數據庫已經升級的消息,如圖5所示。
圖5 LogCat窗口-消息顯示數據庫升級成功
簡化數據庫訪問
使用DBAdapter類,可以簡化你的Android應用程序訪問數據庫記錄的操作,一個重要的事情是在Android中創建的SQLite數據庫只有創建它的應用程序可以訪問它。如果你要共享數據,你需要使用一個內容提供器,這個將在以后的文章中再介紹了。