




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android 创建和使用数据库详细指南(1) 摘要:每个应用程序都要使用数据,Android 应用程序也不例外,Android 使用 开源的、与操作系统无关的 SQL 数据库-SQLite ,本文介绍的就是如何为你的 Android 应用程序创建和操作 SQLite 数据库。 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据, 那么就需要一个数据库系统存储你的结构化数据,Android 使用 SQLite 数据库,它是一个 开源的、支持多操作系统的 SQL 数据库,在许多领域广泛使用,如 Mozilla FireFox 就是使 用 SQLite 来存储配置数据的, iPhone 也是使用 SQLite 来存储数据的。 在 Android 中,你为某个应用程序创建的数据库,只有它可以访问,其它应用程序是 不能访问的,数据库位于 Android 设备/data/data/databases 文件夹中,在这篇文章中,你将 会学习到如何在 Android 中创建和使用数据库。 1 SQLite 数据库 使用 Eclipse 创建一个 Android 项目,取名为 Database,如图 1 所示: 图 1 数据库-使用 Eclipse 创建你的 Android 新项目 2 创建 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; 3 使用数据库 现在你已经可以利用创建的辅助类来使用数据库了,在 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); 4 增加一个标题 如果想在 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 Programmers Reference“, “Wrox“); id = db.insertTitle( “047017661X“, “Professional Windows Vista Gadgets Programming“, “Wrox“); db.close(); insertTitle()方法返回插入行的 ID,如果在添加过程中遇到错误,它就返回-1 。 如果你分析 Android 设备/模拟器的文件系统,你可以看到 book 数据库创建在 database 文件夹下,如图 3 所示。 图 3 database 文件夹 5 检索所有标题 想要检索 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 类 6 检索单个标题 想要通过 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 类显示一个错误消息。 7 更新一个标题 要更新一个特定的标题,可以调用 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 Programmers 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(); 如果更新成功会显示一条表示成功的消息,同时,你可以检索刚刚更新的标题看更新 结果是否正确。 8 删除一个标题 想要删除一个标题,可以调用 DBAdapter 类的 deleteTitle()方法,传递你想要删除的标 题的 ID 即可:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 青苗班培训总结
- 老年智能机培训
- 防疫歌曲教学课件
- 暖通施工技术试题及答案
- 电气自动化技术专业试题及答案
- 建设银行2025东营市秋招笔试综合模拟题库及答案
- 邮储银行2025金融科技岗笔试题及答案吉林地区
- 邮储银行2025宣城市秋招笔试专业知识题专练及答案
- 2025年3D打印技术的家具制造应用
- 邮储银行2025南通市秋招笔试专业知识题专练及答案
- 桩基础平法施工图(平法施工图识读)
- GB/T 9113-2010整体钢制管法兰
- GB/T 23338-2018内燃机增压空气冷却器技术条件
- 癫痫的急救与护理课件
- 海姆立克急救法完整版本课件
- 国家地表水环境质量监测网采测分离实施方案课件
- 控压钻井技术及实践培训讲义工艺课件
- 厚度仪点检表
- 北京市水利工程维修养护定额
- 自然拼读法在小学英语教学中的应用的实践研究
- 无领导小组面试评分表模板
评论
0/150
提交评论