您的位置:首页 > 移动开发 > Android开发

android开发 简单的数据库操作 adb命令

2016-07-27 10:50 686 查看
内容是看书练习的,对数据库的简单操作!

写一个数据库帮助类

MyDatabaseHelper.java

package com.vincent.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

public class MyDatabaseHelper extends SQLiteOpenHelper{

private Context mContext;
/**
* 创建书 表
*/
public static final String CREATE_BOOK="create table Book("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real ,"
+ "pages integer,"
+ "name text)";
/**
* 创建书种类表
*/
public static final String  CREATE_CATEGORY = "create table Category( "
+ "id integer primary key autoincrement, "
+ "category_name text "
+ "category_code integer )";
/**
* @param context 上下文对象
* @param name 数据库名称
* @param factory 允许我们查询数据的时候返回一个自定义的cursor
* @param version 数据库的版本号
*/
public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
mContext=context;
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext, "数据库创建成功", Toast.LENGTH_LONG).show();
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");//删除表Book
db.execSQL("drop table if exists Category");//删除表Category
onCreate(db);//重新创建数据库
}

}


然后在activity点击button创建数

private MyDatabaseHelper dbHelper;
dbHelper=new MyDatabaseHelper(DataActionActivity.this, "BookStore.db", null, 1);
CreateDB.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
//dbHelper.getWritableDatabase();此方法在磁盘空间已满的情况下抛出异常,否则返回一个操作数据库的对象
dbHelper.getWritableDatabase();
//dbHelper.getReadableDatabase();此方法在磁盘空间已满的情况下返回一个只能对数据库读取操作的对象
//              dbHelper.getReadableDatabase();
}
});


“`

数据库创建好了,可以通过ddms查看,使用File Explorer最多只能看到databases目录下的BookStores文件,Book内容是看不到的。使用adb shell工具查看

找到SDK platform-tools路径,比如我的是:F:\android_sdk_windows\platform-tools

在环境变量path下添加,在末尾加上英文状态下的分号,然后把platform-tools路径加上去,确认添加即可,就不上图了,这种事分分钟搞定,打开CMD.adb shell



error:more than one device/emulator

提示连接的设备超过一个,我打开了一个模拟器,手机也连接上的,

这时候使用adb devices 查看当前连接设备



这时候要我们指定一个设备:使用命令adb -s emulator-5556 shell

指定模拟器设备:



然后下一步:进入到项目路径下,我的包名是:com.vincent.hello

输入命令:cd /data/data/com.vincent.hello/databases/

图示:



下一步输入ls,刚开始看成了is,结果是l,试了好几下才发现,郁闷



已经可以看到我们创建的数据库了BookStore.db,下面还有一个文件,这个是系统自动生成的,这是为了让数据库能够支持事务而产生临时的日志文件,这时候只有0k大小,

哈,现在就要打开数据库了,继续输入:sqlite3 BookStore.db,这个时候不要输错了,输错了就蛋疼了...现在可以看到当前数据库版本信息



来,先看看我之前创建的表,输入.table



咦,竟然有三个表,book,是我们创建的书表,Category是我们创建的分类表,那么android_metadata 表是什么呢?原来android_metadata 是是每个数据库中都会自动生成的,不用管它,现在让我们来查看这两个表创建的语法吧!输入:.schema  效果如下!



这是我们在代码里面创建数据库的sql语句:/**

* 创建书 表

*/

public static final String CREATE_BOOK=”create table Book(”

+ “id integer primary key autoincrement, ”

+ “author text, ”

+ “price real ,”

+ “pages integer,”

+ “name text)”;

/**

* 创建书种类表

*/

public static final String CREATE_CATEGORY = “create table Category( ”

+ “id integer primary key autoincrement, ”

+ “category_name text ”

+ “category_code integer )”;

对照上面的看看,是不是一样的呢,如果先创建Book表,然后再去创建Category表,这时候点击创建是不会更新的,需要在我自定义的数据库帮助类中删除两张表,再创建数据库onCreate(db);然后升级数据库版本,这样就能创建好了

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(CREATE_BOOK);

db.execSQL(CREATE_CATEGORY);

Toast.makeText(mContext, “数据库创建成功”, Toast.LENGTH_LONG).show();

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL(“drop table if exists Book”);//删除表Book

db.execSQL(“drop table if exists Category”);//删除表Category

onCreate(db);//重新创建数据库

}

数据库创建好了,表也整好了,现在往里面添加数据吧,哈哈,把我平时看的小说写进去:

btnAddData.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
SQLiteDatabase db=dbHelper.getWritableDatabase();//获得操作数据库的对象
ContentValues values=new ContentValues();//看起来就是用来装数据的,一个数据对象
values.put("name", "完美世界");
values.put("author", "辰东");
values.put("pages", 666);
values.put("price", 800);
db.insert("Book", null, values);//插入第一条数据
values.clear();//清空这个数据对象,然后继续下一个
values.put("name", "万古至尊");
values.put("author", "太一生水");
values.put("pages", 1000);
values.put("price", 500);
db.insert("Book", null, values);//插入第二条数据
}
});
往里面添加数据要使用ContentValues对象,首先获取数据库对象,然后往values对象里面添加值,id没有装入,因为前面设置的自增长,使用db插入,如需继续添加,这需要吧values清空,就跟货车拉货似的,卸了货才能继续装..装入完成之后怎么知道是不是完成了呢,我们可以使用adb命令看一看, 




插入完成之后,现在来修改一下数据:

SQLiteDatabase 中也是提供了一个非常好用的 update()方法用于对数据进行更新,这个方法

接收四个参数,第一个参数和 insert()方法一样,也是表名,在这里指定去更新哪张表里的数

据。第二个参数是 ContentValues 对象,要把更新数据在这里组装进去。第三、第四个参数

用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。

findViewById(R.id.btn_updata).setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
try{
SQLiteDatabase db=dbHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("price", 1233);
db.update("Book", values, "name=?", new String[]{"完美世界"});//此句代码意思是:将name=“完美世界”的书price更新为1233
}catch(Exception e){
e.printStackTrace();
Toast.makeText(getApplicationContext(), "数据更新失败",Toast.LENGTH_LONG).show();
}
}
});


查看结果,



继续往下看看删除数据:

findViewById(R.id.btn_delete).setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
db.delete("Book", "pages>?", new String[]{"700"});//删除Book表中pages>700的书
}
});


运行一下:

结果如图



话说太一生水的万古至尊写完了,虽然看起来还有第二部的样子,不过那是以后的事儿呢,删了先,哈哈

最后是查询数据了:

感觉查询的方法参数好多啊,最少都有7个的样子..

SQLiteDatabase 中还提供了一个 query()方法用于对数据进行查询。

这个方法的参数非常复杂,最短的一个方法重载也需要传入七个参数。那我们就先来看一下

这七个参数各自的含义吧,第一个参数不用说,当然还是表名,表示我们希望从哪张表中查

询数据。第二个参数用于指定去查询哪几列,如果不指定则默认查询所有列。第三、第四个

参数用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行的数据。第五个参

数用于指定需要去 group by 的列,不指定则表示不对查询结果进行 group by 操作。第六个参

数用于对 group by 之后的数据进行进一步的过滤,不指定则表示不进行过滤。第七个参数用

于指定查询结果的排序方式,不指定则表示使用默认的排序方式。更多详细的内容可以参考

下表。其他几个 query()方法的重载其实也大同小异,你可以自己去研究一下,这里就不再

进行介绍了



findViewById(R.id.btn_query).setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
try{
SQLiteDatabase db=dbHelper.getWritableDatabase();
//查询Book表中的所有数据
Cursor cursor=db.query("Book",null,null,null,null,null,null);
if(cursor.moveToFirst()){
do{
//遍历cursor对象,取出打印数据
String name=cursor.getString(cursor.getColumnIndex("name"));
String author=cursor.getString(cursor.getColumnIndex("author"));
int pages=cursor.getInt(cursor.getColumnIndex("pages"));
double price=cursor.getFloat(cursor.getColumnIndex("price"));
System.out.println("name="+name+","+"author="+author+","+"pages="+pages+","+"price="+price+";");
Toast.makeText(getApplicationContext(), "name="+name+","+"author="+author+","+"pages="+pages+","+"price="+price+";", Toast.LENGTH_LONG).show();
}while(cursor.moveToNext());
}
cursor.close();
}catch(Exception e){
e.printStackTrace();
Toast.makeText(getApplicationContext(), "查询失败", Toast.LENGTH_LONG).show();
}

}
});
这里只是设置了查询的表名,输出这个表的所有结果就好了..




我们首先在查询按钮的点击事件里面调用了 SQLiteDatabase 的 query()方法

去查询数据。这里的 query()方法非常简单,只是使用了第一个参数指明去查询 Book 表,后

面的参数全部为 null。这就表示希望查询这张表中的所有数据,虽然这张表中目前只剩下一

条数据了。查询完之后就得到了一个 Cursor 对象,接着我们调用它的 moveToFirst()方法将数

据的指针移动到第一行的位置,然后进入了一个循环当中,去遍历查询到的每一行数据。在

这个循环中可以通过 Cursor 的 getColumnIndex()方法获取到某一列在表中对应的位置索引,

然后将这个索引传入到相应的取值方法中,就可以得到从数据库中读取到的数据了。接着我

们使用 Log 的方式将取出的数据打印出来,借此来检查一下读取工作有没有成功完成。最后

别忘了调用 close()方法来关闭 Cursor。

关于数据库事务的使用,事务就是一连串的操作,要么都失败,要么都成功的意思。使用事务:

/**

* 使用事务替换Book表中的数据,要么全部替换,要么都不换

*/

findViewById(R.id.btn_replace_data).setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
db.beginTransaction();//开启事务
try{
db.delete("Book", null, null);//删除表
if(true){
//在这里手动抛出异常,让事务失败
throw new NullPointerException();
}
ContentValues values=new ContentValues();
values.put("name", "遮天");
values.put("author","辰东");
values.put("pages", 50000);
values.put("price", 500.0);
db.insert("Book", null, values);
values.clear();
values.put("name", "神墓");
values.put("author","辰东");
values.put("pages", 80000);
values.put("price", 600.0);
db.insert("Book", null, values);
values.clear();
values.put("name", "西游记");
values.put("author","吴承恩");
values.put("pages", 20000);
values.put("price", 654.0);
db.insert("Book", null, values);
values.clear();
values.put("name", "水浒传");
values.put("author","施耐庵");
values.put("pages", 60000);
values.put("price", 10000.0);
db.insert("Book", null, values);
values.clear();
db.setTransactionSuccessful();//事务已经执行成功
Utils.defaultToast(DataActionActivity.this, "事务执行成功");
}catch(Exception e){
e.printStackTrace();
}finally{
db.endTransaction();//结束事务
}

}
});


点击Button执行,先删除旧数据,然后然后了一个NullPointerException,这个时候,我们去查询一下数据库Book表的数据:



现在去掉抛出空指针的代码再次运行程序,执行事务:



查看数据库看看Book表的结果如何:



成功替换掉了原本Book表中的数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息