收藏 分享(赏)

Android创建和使用数据库详细指南.doc

上传人:hyngb9260 文档编号:5955682 上传时间:2019-03-22 格式:DOC 页数:18 大小:162.50KB
下载 相关 举报
Android创建和使用数据库详细指南.doc_第1页
第1页 / 共18页
Android创建和使用数据库详细指南.doc_第2页
第2页 / 共18页
Android创建和使用数据库详细指南.doc_第3页
第3页 / 共18页
Android创建和使用数据库详细指南.doc_第4页
第4页 / 共18页
Android创建和使用数据库详细指南.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、Android 创建和使用数据库详细指南(1)摘要:每个应用程序都要使用数据,Android 应用程序也不例外,Android 使用开源的、与操作系统无关的 SQL 数据库-SQLite ,本文介绍的就是如何为你的Android 应用程序创建和操作 SQLite 数据库。数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android 使用 SQLite 数据库,它是一个开源的、支持多操作系统的 SQL 数据库,在许多领域广泛使用,如 Mozilla FireFox 就是使用 SQLite 来存储配置数据的, iPhone 也

2、是使用 SQLite 来存储数据的。 在 Android 中,你为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于 Android 设备/data/data/databases 文件夹中,在这篇文章中,你将会学习到如何在 Android 中创建和使用数据库。1 SQLite 数据库使用 Eclipse 创建一个 Android 项目,取名为 Database,如图 1 所示:图 1 数据库-使用 Eclipse 创建你的 Android 新项目2 创建 DBAdapter 辅助类操作数据库的最佳实践是创建一个辅助类,由它封装所有对数据库的复杂访问,对于调用代码而言

3、它是透明的,因此我创建了一个 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.Curso

4、r;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.l

5、earn2develop.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 DBAdapterpu

6、blic 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 stat

7、ic 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;

8、DATABASE_CREATE 常量包括创建 titles 表的 SQL 语句。在 DBAdapter 类中,你可以扩展 SQLiteOpenHelper 类,它是一个 Android 辅助类,主要用于数据库创建和版本管理。实际上,你可以覆盖 onCreate()和 onUpgrade()方法,如清单 2 所示。清单 2 在 DBAdapter 类中,扩展 SQLiteOpenHelper 类覆盖 onCreate() 和 onUpgrade()方法package net.learn2develop.Database;import android.content.ContentValues;i

9、mport 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 DBAdapterpublic static final String KEY_ROWID = “_id“;public static fin

10、al 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 fin

11、al 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;pu

12、blic DBAdapter(Context ctx)this.context = ctx;DBHelper = new DatabaseHelper(context);private static class DatabaseHelper extends SQLiteOpenHelperDatabaseHelper(Context context)super(context, DATABASE_NAME, null, DATABASE_VERSION);Overridepublic void onCreate(SQLiteDatabase db)db.execSQL(DATABASE_CRE

13、ATE);Overridepublic 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()方法用于升级数据库,

14、这可以通过检查 DATABASE_VERSION 常量定义的值来实现,对于 onUpgrade()方法而言,只不过是简单地删除表,然后在创建表而已。现在你可以定义不同的方法来打开和关闭数据库,如清单 3 中的添加/编辑/ 删除/行的函数。清单 3 定义打开和关闭数据库以及增加/编辑/ 删除表中行的方法public class DBAdapter/././-打开数据库-public DBAdapter open() throws SQLExceptiondb = DBHelper.getWritableDatabase();return this;/-关闭数据库-public void clos

15、e()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, nu

16、ll, 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);/-检索一个指定的标题-publ

17、ic Cursor getTitle(long rowId) throws SQLExceptionCursor 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

18、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 作为一个指针从数据库查询返

19、回结果集,使用 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.dat

20、abase.SQLException;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;public class DBAdapterpublic static final String KEY_ROWID = “_id“;public static final String KEY_ISBN = “isbn“;public static final String KEY_TITLE = “title“;publ

21、ic 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 =“creat

22、e 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(con

23、text);private static class DatabaseHelper extends SQLiteOpenHelperDatabaseHelper(Context context)super(context, DATABASE_NAME, null, DATABASE_VERSION);Overridepublic void onCreate(SQLiteDatabase db)db.execSQL(DATABASE_CREATE);Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion,int newVer

24、sion)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 SQLExceptiondb = DBHelper.getWritableDatabase();return this;/-关闭数据库-public void clo

25、se()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,

26、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);/-检索一个指定标题-publi

27、c Cursor getTitle(long rowId) throws SQLExceptionCursor 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 r

28、owId, 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.ja

29、va 文件中,创建一个 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. */Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState)

30、;setContentView(R.layout.main);DBAdapter db = new DBAdapter(this);4 增加一个标题如果想在 titles 表中增加一个标题,可以使用 DBAdapter 类的 insertTitle()方法:Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);DBAdapter db = new DBAdapter(this);/-add 2 titles-

31、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

32、所示。图 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 cl

33、ass DatabaseActivity extends Activity /* Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);DBAdapter db = new DBAdapter(this);/-获取所有标题-db.open();Cursor c = db.getAllTitles();if (c.moveT

34、oFirst()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.

35、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()方法:Overridepublic void onCreate(Bundle savedInstanceState) supe

36、r.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);elseToast.makeText(this, “No title found“,Toast.LENGTH_LONG).show();db.close();返回的结果是一个 Cursor 对象,如果返回一行,可以使用 DisplayTi

37、tle()方法显示标题的详细信息,否则就使用 Toast 类显示一个错误消息。7 更新一个标题要更新一个特定的标题,可以调用 DBAdapter 的 updateTitle()方法,传递想要更新的标题的 ID 给它就可以了,如清单 6 所示。清单 6 调用 DBAdapter 类的 updateTitle()方法更新标题Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);DBAdapter db = new

38、 DBAdapter(this);/-更新标题 -db.open();if (db.updateTitle(1,“0470285818“,“C# 2008 Programmers Reference“,“Wrox Press“)Toast.makeText(this, “Update successful.“,Toast.LENGTH_LONG).show();elseToast.makeText(this, “Update failed.“,Toast.LENGTH_LONG).show();/-/-检索相同的标题-Cursor c = db.getTitle(1);if (c.moveTo

39、First()DisplayTitle(c);elseToast.makeText(this, “No title found“,Toast.LENGTH_LONG).show();/-db.close();如果更新成功会显示一条表示成功的消息,同时,你可以检索刚刚更新的标题看更新结果是否正确。8 删除一个标题想要删除一个标题,可以调用 DBAdapter 类的 deleteTitle()方法,传递你想要删除的标题的 ID 即可:Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanc

40、eState);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();elseToast.makeText(this, “Delete failed.“,Toast.LENGTH_LONG).show();db.close();如果删除成功会显示一条表示成功的消息。9 升级数据库要升级数据库

41、,修改 DBAdapter 类中 DATABASE_VERSION 常量的值比之前的值大,如之前的值是 1,将其改为 2:public class DBAdapterpublic 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 Stri

42、ng 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 auto

43、increment, “+ “isbn text not null, title text not null, “+ “publisher text not null);“;当你再次运行这个应用程序时,你会在 Eclipse 的 LogCat 窗口中看到数据库已经升级的消息,如图 5 所示。图 5 LogCat 窗口-消息显示数据库升级成功10 简化数据库访问使用 DBAdapter 类,可以简化你的 Android 应用程序访问数据库记录的操作,一个重要的事情是在 Android 中创建的 SQLite 数据库只有创建它的应用程序可以访问它。如果你要共享数据,你需要使用一个内容提供器,这个将在以后的文章中再介绍了。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报