本章节翻译自《Beginning-Android-4-Application-Development》,如有翻译不当的地方,敬请指出。

原书购买地址http://www.amazon.com/Beginning-Android-4-Application-Development/dp/1118199545/


目前所介绍的方法只是用来存储一些简单的数据。如果想要存储关系型数据,那么使用数据库将会更加的效率。举个例子,你要存储学校里面每一个学生的分数,这种情况下,最好使用数据库,因为你可以查询某个学生的具体分数。而且,使用数据库能够保持不同数据之间关系的完整性。

Android使用SQLite数据库系统。使用这种数据库,只有创建它的程序可以使用它,别的程序无法访问到它。

在接下来的几节中,会简述如何通过编码在你的程序中创建一个SQLite数据库。对于Android来说,通过编码创建的数据库的存储位置是/data/data/<packane_name>

/databases 。


想要处理数据库的一种良好的方式就是创建一个数据库辅助类,这个类中,封装了所有的数据操作方式。因此,这节中我们来看看如何创建一个数据库辅助类DBAdapter,这个类中包含创建,打开,关闭和使用SQLite数据库。

我们讲创建一个数据库,名字叫MyDB;包含一张表,名字叫contacts,有3列_id,name和email。

1. 创建一个工程,Databases。

2. 创建一个类,DBAdater。

3. DBAdapter.java中的代码。

public class DBAdapter {    static final String KEY_ROWID = "_id";    static final String KEY_NAME = "name";    static final String KEY_EMAIL = "email";    static final String TAG = "DBAdapter";    static final String DATABASE_NAME = "MyDB";    static final String DATABASE_TABLE = "contacts";    static final int DATABASE_VERSION = 2;    static final String DATABASE_CREATE =        "create table contacts (_id integer primary key autoincrement, "        + "name text not null, email text not null);";    final Context context;    DatabaseHelper DBHelper;    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)        {            try {                db.execSQL(DATABASE_CREATE);            } catch (SQLException e) {                e.printStackTrace();            }        }        @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 contacts");            onCreate(db);        }    }    //---opens the database---    public DBAdapter open() throws SQLException     {        db = DBHelper.getWritableDatabase();        return this;    }    //---closes the database---    public void close()     {        DBHelper.close();    }    //---insert a contact into the database---    public long insertContact(String name, String email)     {        ContentValues initialValues = new ContentValues();        initialValues.put(KEY_NAME, name);        initialValues.put(KEY_EMAIL, email);        return db.insert(DATABASE_TABLE, null, initialValues);    }    //---deletes a particular contact---    public boolean deleteContact(long rowId)     {        return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;    }    //---retrieves all the contacts---    public Cursor getAllContacts()    {        return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,                KEY_EMAIL}, null, null, null, null, null);    }    //---retrieves a particular contact---    public Cursor getContact(long rowId) throws SQLException     {        Cursor mCursor =                db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,                KEY_NAME, KEY_EMAIL}, KEY_ROWID + "=" + rowId, null,                null, null, null, null);        if (mCursor != null) {            mCursor.moveToFirst();        }        return mCursor;    }    //---updates a contact---    public boolean updateContact(long rowId, String name, String email)     {        ContentValues args = new ContentValues();        args.put(KEY_NAME, name);        args.put(KEY_EMAIL, email);        return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;    }}

首先,声明一些常量,包含一些表中所需要的字段。

    static final String KEY_ROWID = "_id";    static final String KEY_NAME = "name";    static final String KEY_EMAIL = "email";    static final String TAG = "DBAdapter";    static final String DATABASE_NAME = "MyDB";    static final String DATABASE_TABLE = "contacts";    static final int DATABASE_VERSION = 2;    static final String DATABASE_CREATE =        "create table contacts (_id integer primary key autoincrement, "        + "name text not null, email text not null);";

在DBAdapter类中,添加了一个私有类,这个类继承了SQLiteOpenHelper类,就是这个类去创建数据库和进行数据库的版本控制。通常重写onCreate()和onUpgrade()方法:

private static class DatabaseHelper extends SQLiteOpenHelper    {        DatabaseHelper(Context context)        {            super(context, DATABASE_NAME, null, DATABASE_VERSION);        }        @Override        public void onCreate(SQLiteDatabase db)        {            try {                db.execSQL(DATABASE_CREATE);            } catch (SQLException e) {                e.printStackTrace();            }        }        @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 contacts");            onCreate(db);        }    }
如果数据库不存在的话,onCreate()方法会去创建一个新的数据库。当数据库需要升级的时候,onUpgrade()方法被调用。判断数据库是不是需要升级,需要去判断DATABASE_VERSION常量。onUpgrade ()方法中实现很简单,就是删除表,然后重新创建它。

然后,定义数据的一些操作,打开,关闭,增删查改等。

    //---opens the database---    public DBAdapter open() throws SQLException     {        db = DBHelper.getWritableDatabase();        return this;    }    //---closes the database---    public void close()     {        DBHelper.close();    }    //---insert a contact into the database---    public long insertContact(String name, String email)     {        ContentValues initialValues = new ContentValues();        initialValues.put(KEY_NAME, name);        initialValues.put(KEY_EMAIL, email);        return db.insert(DATABASE_TABLE, null, initialValues);    }    //---deletes a particular contact---    public boolean deleteContact(long rowId)     {        return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;    }    //---retrieves all the contacts---    public Cursor getAllContacts()    {        return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,                KEY_EMAIL}, null, null, null, null, null);    }    //---retrieves a particular contact---    public Cursor getContact(long rowId) throws SQLException     {        Cursor mCursor =                db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,                KEY_NAME, KEY_EMAIL}, KEY_ROWID + "=" + rowId, null,                null, null, null, null);        if (mCursor != null) {            mCursor.moveToFirst();        }        return mCursor;    }    //---updates a contact---    public boolean updateContact(long rowId, String name, String email)     {        ContentValues args = new ContentValues();        args.put(KEY_NAME, name);        args.put(KEY_EMAIL, email);        return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;    }

注意,Android使用Cursor类作为数据查询的返回结果。把Curosr想象成查询结果的指针。使用Cursor可以增加查询的效率。

使用ContentValurs对象存储键值对。

使用DBAdapter类去创建一个数据库,需要创建DBAdapter类的一个实例:

    public DBAdapter(Context ctx)    {        this.context = ctx;        DBHelper = new DatabaseHelper(context);    }
构造器中,同时创建了一个DBHelpter类去创建数据库。

DatabaseHelper(Context context)        {            super(context, DATABASE_NAME, null, DATABASE_VERSION);        }



更多相关文章

  1. Android(安卓)Settings 系统设置中 PreferenceActivity点击Heade
  2. android sqlite3使用命令
  3. 【翻译】4种经典的Android屏幕自适应解决方案
  4. Android(安卓)Context 相关
  5. Android网络通信(4):WebKit
  6. android MediaPlayer 几种播放方式
  7. ContentProvider何时创建?SQLiteDatabase方法何时执行?
  8. 如何在Android(安卓)NDK中调用第三方库文件(.so)
  9. Android(安卓)开发之SQLite基础

随机推荐

  1. 在 Ubuntu 下使用 Android(安卓)NDK r4b
  2. 3. 编写的第一个android HelloWorld程序
  3. 【Android个人理解(一)】通过Looper与Handl
  4. Android面试真题,了解一下?
  5. android缓存设计
  6. Gradle Android最新自动化编译脚本教程(
  7. 【设计模式与Android】单例模式——独一
  8. Android中点击空白区域控件自动隐藏(事件
  9. 如何解决本地大批量数据的更新,和后台的同
  10. Android基础知识巩固系列 Android之四大