安卓短信铃声文件夹模拟器数据库文件在哪文件夹里

您的当前位置: > 正文
安卓模拟器bluestacks虚拟SD卡打开放置数据包
10:34来源:游戏狗作者:H@h的影子
前面已经和大家一起学习了如何安装安卓模拟器,相信不少朋友已经使用安卓模拟器bluestacks玩上了不少安卓游戏,但是你知道如何使用安卓模拟器运行带有数据包的安卓游戏吗?本篇教程就是告诉大家安卓模拟器SD卡目录,也就是bluestacks虚拟SD卡打开方法,将安卓游戏数据包放置到相应的位置就可以游戏了。
准备工具:
打开安卓模拟器SD卡(bluestacks虚拟SD)之前,我们需要准备几个工具:
1、已经安装好安卓模拟器bluestacks的电脑;
2、镜像文件打开工具。
镜像文件打开工具:
bluestacks虚拟SD打开方法:
1、因为虚拟SD卡是隐藏的,所以第一步,我们就需要看到这个隐藏文件,方法很简单,随便进入一个电脑文件夹,然后选择【文件夹选项】-【查看】,之后在列表最后那个找到【显示隐藏的文件、文件夹以及驱动器】,将这项前面的& &&打上,然后点击【确定】;
2、之后打开电脑C盘,在里面可以找到一个名为【ProgramData】的文件夹,在该文件夹下找到【BlueStacks】-【Android】文件夹,里面有一个【SDCard.fs】文件;
3、没错,SDCard.fs就是我们需要找的bluestacks虚拟SD,也就是安卓模拟器SD卡,但是这个文件需要使用镜像文件打开工具才能打开,这个时候我们就需要使用到之前下载好的镜像文件打开工具了。
4、将镜像文件下载并安装好之后,我们双击就可以将第二步找到的bluestacks虚拟SD也就是SDCard.fs文件打开了,然后将安卓游戏数据包放置到相应的位置即可(游戏不同,安卓游戏数据包放置位置也不同,根据游戏自己的要求放置到相应的data或者obb目录下),之后再安装好安卓游戏APK,就可以畅快的游戏了。
注意:bluestacks虚拟SD只有在安卓模拟器bluestacks关闭的情况下,才可以对里面的文件进行修改,所以在放置数据包之前,先将安卓模拟器bluestacks关闭。
· · · · ·
玩过这个安卓游戏的人有何感觉?已经有人表态
文明上网,理性发言;请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的评论。
安卓游戏资讯排行榜
本周下载排行榜
网游排行单机排行
本周最新更新Android数据库高手秘籍(一):SQLite命令 - 博客 - 伯乐在线
& Android数据库高手秘籍(一):SQLite命令
& 2.0K 阅读
要想熟练地操作任何一个数据库,最最基本的要求就是要懂SQL语言,这也是每个程序员都应该掌握的技能。虽说SQL博大精深,要想精通确实很难,但最基本的一些建表命令,增删改查,大家还是必须要学会的。
SQL(Structured Query Language)是一种标准的数据库查询语言,即所有的关系型数据库都会支持它,只不过每种数据库对SQL语言的支持与标准存在着细微的不同。我们无须关心其它数据库对SQL语言的支持情况,这里我们只要把重点放在SQLite上就可以了。下面我将使用模拟器来对SQLite支持的各种命令进行演示,如果你想用手机的话也可以,但要确保你的手机已经Root,并且包含sqlite3这个命令文件。
首先确保模拟器已经连接上了电脑,然后在命令行输入adb shell进入控制台,如下图所示:
注意#符号表示我们当前已经是超级用户了,如果显示的是$符号,表示当前只是普通用户而已,这时还需要输入su命令切换一下用户身份才行。
有了超级用户权限之后,我们能做的事情就很多了,这里我们先查看一下系统自带的联系人表吧。进入到/data/data目录下,如下图所示:
所有应用程序的本地存储文件都是存放在这个目录下面的。为了要让不同应用程序之间的数据容易区别开来,Android是使用应用程序包名进行分开管理,也就是说每个应用程序的本地存储文件都会存放在自己应用程序包名的那个目录下,这里我们ls一下看看有多少子目录:
OK,确实有很多,毕竟手机上所有的应用程序都在这里。其中,com.android.providers.contacts中存放的就是联系人的相关数据,我们进入到这个目录再ls一下:
可以看到,目前有databases、files、lib和shared_prefs这几个子目录。其中databases肯定是用于存放数据库文件的,files是用于存放普通文本文件的,lib是用于存放so库的,shared_prefs则是用于存放shared文件的。这是Android数据持久化的几种可选方式,对这部分内容不太了解的朋友可以参考的第六章。
接着进入到databases目录中,再ls:
其中后缀名为journal的文件是日志文件,我们不用管,contacts2.db和profile.db才是真正的数据库文件,可以使用sqlite3命令来打开数据库,如下图所示:
好的,数据库已经打开了,那么我们怎么才能知道当前数据库中有哪些表呢?很简单,.table命令就可以做到了:
哇,竟然有这么多张表!是的,联系人的数据结构非常复杂,很多的数据都是分表存储的。这里我们随便挑一张表,比如说accounts表,如果我想知道这张表中有哪些列应该怎么办呢?在MySQL中可以使用desc accounts这个命令,但SQLite却不认识这个命令,毕竟它们是有差异化的。SQLite中可以使用pragma table_info(TABLE_NAME)这个命令来查看表的数据结构,如下图所示:
可以看到,一共显示了三条结果,表示accounts表中共有三列。但是,所有的字段都缩在了一行里面,并用“|”符号分隔,这样我们很难看出每个字段的含义。很简单,只需要换一种显示模式就行了,比如说line模式就挺不错的。输入.mode line命令切换显示模式,然后重新运行pragma命令,结果如下图所示:
怎么样,这样就清晰多了吧?这三列的列名分别是account_name、account_type和data_set,数据类型都是TEXT(字符串),允许为空,并且都不是主键。好,那我现在想查一查accounts表中的数据呢?这就太简单了,使用select语句就可以了,如下所示:
恩?怎么只有一条空数据啊。貌似模拟器上默认就是这样的,如果你用的是手机的话,这里应该就可以查到真正的数据了。不过没关系,我们可以在设置里面手动添加一个邮箱账户,如下图所示:
现在再来重新查询一遍accounts表,如下所示:
OK,添加的新账户已经成功查出来了。
除了查询命令之外,还有其它的增删改命令都和标准的SQL语法是相同的,即insert、delete和update,由于比较简单,我就不再赘述了。比较值得一提的是,每个SQLite数据库中都还有一个隐藏的sqlite_master表,这里记载了当前数据库中所有表的建表语句,可以使用select * from sqlite_master命令进行查看:
结果太多了是不是?一屏根本就显示不下嘛。不要着急,别忘了我们使用的是select命令,可以使用where语句来过滤出我们想要查询的那部分内容,如下图所示:
OK,CREATE TABLE accounts (account_name TEXT, account_type TEXT, data_set TEXT) 这就是accounts表的建表语句了,通过这种方式我们可以查询到任意一张表的建表语句,从而对我们学习和分析数据库表结构有所帮助。
有些朋友可能会觉得,每次都要输入select命令来查询表中的数据太麻烦了。没错,而且还要保证手机是连接在电脑上的时候才能查询,确实太不方便。幸运的是,有些手机软件已经提供了数据库表查询的功能,使得我们随时随地都可以方便地查看数据库中的数据,比如Root Explorer这款软件就不错。
仍然是确保你的手机已经Root,然后安装Root Explorer,打开软件之后按照我们前面介绍的路径,进入/data/data/com.android.providers.contacts/databases,点击contacts2.db数据库,选择内置数据库查看器,然后随便点击一张表就可以查看到里面的数据了,如下图所示:
使用这种方法,我们可以随时查看数据库表中的最新数据,直观又方便,在程序开发的时候可以起到非常大的帮助。
好了,今天的讲解就到这里,下篇文章当中我将带领大家探究Android数据库中更多的奥秘。感兴趣的朋友请继续阅读
为作者带来更多读者;为读者筛选优质内容;专注IT互联网。
最新评论(期待您也参与评论)
汇集优质的Python技术文章和资源。人生苦短,我用Python!
JavaScript, CSS, HTML5 这里有前端的技术干货!
关注安卓移动开发业界动态,分享技术文章和优秀工具资源。
关注iOS移动开发业界动态,分享技术文章和优秀工具资源。
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线博客团队正试图以我们微薄的力量,把优秀的原创/译文分享给读者,做一个小而精的精选博客,为“快餐”添加一些“营养”元素。
欢迎关注更多频道
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选博客文章
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
(加好友请注明来意)
网站使用问题
请在询问或者反馈
& 2015 伯乐在线
赞助云主机android实体手机上数据库文件放在什么地方,怎么取出来_百度知道
android实体手机上数据库文件放在什么地方,怎么取出来
我开发了一个软件,但是我要看它的数据库文件中的数据,用来改进,但是我在实体机上运行后找不到数据库文件,手机是HTC G6请问有什么办法取出来?
我有更好的答案
5楼正解。是这样的。1. 手机打开“ADB 调试”2. usb 线连接手机3. 命令行输入 adb shell 登录到手机4. cd /data/data/{Your Package Name}/database5. ls拷贝文件可以使用adb pull /data/data/{Your Package Name}/database/{xxx.db} .
windows-&setting-&other-&fileexplorer控制台就有了可以查看模拟器内部文件的功能
数据库文件是在 /data/data/Package Name/database 位置下 你可以直接copy出来
其他类似问题
为您推荐:
android的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁XP安卓模拟器的游戏数据包放在那里_百度知道
XP安卓模拟器的游戏数据包放在那里
我的模拟器是Start BlueStacks
提问者采纳
模拟器文件夹里面找sdcard这样一个文件夹,然后运行模拟器,模拟器里面可以找到文件管理器,在这个文件管理器里面,就可以看到你存放的apk安装文件,点击安装就好了
提问者评价
采纳率100%
其他类似问题
为您推荐:
安卓的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁在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", ""); &&
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", "" }; &&
String groupBy = &&
String having = &&
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", "" }; &&
String whereClause = &&
String[] whereArgs = selectionA &&
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", "" }; &&
String whereClause = &&
String[] whereArgs = selectionA &&
ContentValues values = new ContentValues(); &&
values.put("name", ""); &&
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.D  import android.content.ContentV  import android.content.C  import android.database.C  import android.database.SQLE  import android.database.sqlite.SQLiteD  import android.database.sqlite.SQLiteOpenH  import android.util.L  public class DBAdapter  {  }  接下来创建一个数据库,取名为bookstitles,字段如图2所示。  图2 数据库字段  在DBAdapter.java文件中,定义清单1中的常量。  清单1 定义DBAdapter.java文件中的常量package net.learn2develop.D  import android.content.ContentV  import android.content.C  import android.database.C  import android.database.SQLE  import android.database.sqlite.SQLiteD  import android.database.sqlite.SQLiteOpenH  import android.util.L  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 C  }  DATABASE_CREATE常量包括创建titles表的SQL语句。  在DBAdapter类中,你可以扩展SQLiteOpenHelper类,它是一个Android辅助类,主要用于数据库创建和版本管理。实际上,你可以覆盖onCreate()和onUpgrade()方法,如清单2所示。  清单2 在DBAdapter类中,扩展SQLiteOpenHelper类覆盖onCreate() 和 onUpgrade()方法 package net.learn2develop.D  import android.content.ContentV  import android.content.C  import android.database.C  import android.database.SQLE  import android.database.sqlite.SQLiteD  import android.database.sqlite.SQLiteOpenH  import android.util.L  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 C  private DatabaseHelper DBH  private SQLiteD  public DBAdapter(Context ctx)  {  this.context =  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();    }  //---关闭数据库---  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 mC  }  //---更新一个标题---  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.D  import android.content.ContentV  import android.content.C  import android.database.C  import android.database.SQLE  import android.database.sqlite.SQLiteD  import android.database.sqlite.SQLiteOpenH  import android.util.L  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 C  private DatabaseHelper DBH  private SQLiteD  public DBAdapter(Context ctx)  {  this.context =  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();    }  //---关闭数据库---  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 mC  }  //---更新一个标题---  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.D  import android.app.A  import android.os.B  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();      id = db.insertTitle(   "",   "C# 2008 Programmer's Reference",   "Wrox");   id = db.insertTitle(   "X",   "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.D  import android.app.A  import android.database.C  import android.os.B  import android.widget.T  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())
   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,   "",   "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数据库只有创建它的应用程序可以访问它。如果你要共享数据,你需要使用一个内容提供器,这个将在以后的文章中再介绍了。
阅读(...) 评论()
友情链接:}

我要回帖

更多关于 安卓短信铃声文件夹 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信