实验11SQLite数据库的使用
一、实验目的
1.掌握创建SQLite数据库的方法;
2.掌握实现对SQLite数据增删改查的方法;
3.学会使用adb调试工具查看数据库和数据表;
二、知识要点
1.创建SQLite数据库的方法:
①定义一个帮助类MyHelper继承SQLiteOpentHelper类;
②在MyHelper类中定义构造方法,重写onCreate()和onUpgrade()方法;
③在onCreate(SQLiteDatabasedb)方法中,通过参数db调用execSQL(String sql)方法执行建表SQL语句;
④创建一个MyHelper类对象helper,调用构造方法对其进行初始化,然后由helper对象调用getWritableDatabase()方法或getReadableDatabase()创建数据库。
2.实现SQLite数据增删改查的方法:
(1)添加数据:
①获取一个SQLiteDatabase对象db;
②通过db对象调用以下任一方法实现数据添加:
a)execSQL(String sql)方法执行insert SQL语句;
如:db.execSQL(“insert into table_name(column_list) values(value_list)”);
b)调用insert(表名,null,添加的数据values)方法:首先,定义一个ContentValues对象values,通过values对象调用put()方法将要添加的数据存入values对象,然后再通过db对象调用insert()方法,将values中的数据添加到指定的数据表中。
(2)更新数据:
①获取一个SQLiteDatabase对象db;
②通过db对象调用以下任一方法实现数据添加:
a)execSQL(String sql)方法执行update SQL语句;
如:db.execSQL(“update table_name set column=value,… where condition”);
b)调用update(String table, ContentValuesvalues,StringwhereClause,String[] whereArgs)方法:
首先,定义一个ContentValues对象values,通过values对象调用put()方法将要更新的数据存入values对象,然后再通过db对象调用update()方法,指定要修改数据的表名,更新的数据values,约束更新某一行火某几行中的数据。
(3)删除数据:
①获取一个SQLiteDatabase对象db;
②通过db对象调用以下任一方法实现数据添加:
a)execSQL(String sql)方法执行delete SQL语句;
如:db.execSQL(“delete from table_name where condition”);
b)调用delete(String table, String whereClause,String[] whereArgs)方法,指定要删除数据的表名称,以及约束删除某一行或某几行中的数据。
(4)查询数据:
①获取一个SQLiteDatabase对象db;
②通过db对象调用query()方法,指定要查询的表名、列名、以及where约束条件等,并将查询结果存入一个Cursor对象中。如:
Cursor cursor=db.query(表名,列名,where约束条件,为where中的占位符提供具体的,null,null,null);
三、实验内容
1.创建一个Android项目,项目名称为“shiyan1101_专业_×××(学生姓名)”,要求:
(1)自动创建Activity;
(2)使用XML编写界面;
(3)界面构成:
①4个文本框,分别用来显示提示信息“图书名称”、“图书作者”、“图书价格”、“图书页数”;
②4个编辑框,分别用来接收用户输入“图书名称”、“图书作者”、“图书价格”、“图书页数”;
③5个按钮,文本显示分别为“创建SQLite数据库”、“添加数据”、“修改数据”、“删除数据”、“查询数据”。
(4)程序实现功能:
①点击“创建SQLite数据库”按钮,创建一个SQLite数据库BookStore.db,并创建一个数据表Book,通过Toast显示“数据库BookStore.db创建成功!”,要求使用adb查看数据库创建是否成功。
②点击“添加数据”按钮,将用户在编辑框中输入的图书名称、图书作者、图书价格、图书页数等数据写入添加到数据表Book中。
③点击“修改数据”按钮,将数据表Book中指定的数据进行修改,条件根据题目自己设定。
④点击“删除数据”按钮,将数据表Book中指定的数据删除,删除条件根据题目自己设定。
⑤点击“查询数据”按钮,查询数据表Book中指定的数据,将查询结果通过Log显示。
(5)实验报告中要求用语言描述具体的实验步骤,并附以截图做辅助说明。
【具体过程参见课件——第3部分数据存储中的练习2-6。】
Mydatebase,java
publicclass Mydatebase extends SQLiteOpenHelper {
publicstaticfinal String cerat= "create table if not exists book(
_id integer primary key autoincrement, " +
"name text,
zuozhe text ,
price real,
page integer );";
public Mydatebase(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
@Override
publicvoid onCreate(SQLiteDatabasedb) {
// TODO Auto-generated method stub
db.execSQL(cerat);
}
@Override
publicvoid onUpgrade(SQLiteDatabasedb, int oldVersion, int newVersion) { // TODO Auto-generated method stub
}
}
创建数据库按钮
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(https://www.wendangku.net/doc/d612585182.html,yout.activity_main);
mydb=new Mydatebase(MainActivity.this, "BookStore.db", null, 1);
btcreat=(Button)findViewById(R.id.create);
btcreat.setOnClickListener(new OnClickListener() {
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
db=mydb.getWritableDatabase();
//db.execSQL(INSERT_DATA);
db.execSQL("insert into book (name,zuozhe,price,page)" +
"Values('dnjkc','fdg',35.0,123)");
}
});
添加数据按钮
edname=(EditText)findViewById(R.id.ed1);
edau=(EditText)findViewById(R.id.ed2);
edjiage=(EditText)findViewById(R.id.ed3);
edpage=(EditText)findViewById(R.id.ed4);
btadd=(Button)findViewById(R.id.add);
btadd.setOnClickListener(new OnClickListener() {
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
String sname=edname.getText().toString();
String sau=edau.getText().toString();
Double djiage=Double.parseDouble(edjiage.getText().toString());
int ipage=Integer.parseInt(edpage.getText().toString());
ContentValues values=new ContentValues();
values.put("name", sname);
values.put("zuozhe",sau);
values.put("price", djiage);
values.put("page", ipage);
SQLiteDatabasedb=mydb.getWritableDatabase();
db.insert("book", null, values);
}
});
}
修改数据按钮
btgai=(Button)findViewById(R.id.xiu);
btgai.setOnClickListener(new OnClickListener() {
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
SQLiteDatabasedb=mydb.getWritableDatabase();
db.execSQL("update book set name='孙孟也' where name='smy';");
}
});
}
删除数据按钮
btdelete=(Button)findViewById(R.id.delete);
btdelete.setOnClickListener(new OnClickListener() {
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
SQLiteDatabasedb=mydb.getWritableDatabase();
db.execSQL("delete from book where name='孙孟也'");
}
});
查询数据按钮
btcha=(Button)findViewById(R.id.select);
btcha.setOnClickListener(new OnClickListener() {
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
SQLiteDatabasedb=mydb.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("zuozhe"));
double price=cursor.getDouble(cursor.getColumnIndex("price"));
int pages=cursor.getInt(cursor.getColumnIndex("page"));
Log.d("Message","book name is"+name);
Log.d("Message","book author is"+author);
Log.d("Message","book price is"+price);
Log.d("Message","book pages is"+pages);
}while(cursor.moveToNext());
}
cursor.close();
}
});
}
Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解 17_创建数据库与完成数据添删改查--------------------------------------1.SQLite介绍:最大特点是,无数据类型; 除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER n n 、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型 n n 只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不 n n 过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数n n 据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的 n n 字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。n n n 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段 n n 保存除整数以外的数据时,将会产生错误。 另外, SQLite 在解析CREATE TABLE 语句时, n n 会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句会忽略 name字段 n n 的类型信息: CREATE TABLE person (personid integer primary key autoincrement, name varchar n n (20)) SQLite可以解析大部分标准SQL语句,如:查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order byn n n 排序子句如:select * from person n n n n select * from person order by id desc n n n n select name from person group by name having count(*)>1 ---------------------------------------------------------------------------2.a.分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录n n select * from Account limit 5 offset 3 或者 select * from Account limit 3,5 n b.select * from Account limit 3,5,指的是跳过前面的3条记录,然后获取5条记录n c.select * from Account limit 3,5是select * from Account limit 5 offset 3语句 n n 的简写版 -------------------------------------------------------------------------------n 3.常用操作: a.插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person nn n n (name, age) values(‘传智’,3) b.更新语句:update 表名 set 字段名=值where 条件子句。如:update person set name=n n n n'credream ‘where id=10 c.删除语句:delete from 表名 where 条件子句。如:delete from person nwhere id=10 -------------------------------------------------------------------------------2.虽然无数据类型,但是建议加上,这样可以增加可读性,支持标准sql,oracle中的不行 ---------------------------------------------------3.获取添加记录后的自增长的ID值:select last_insert_rowid(); -----------------------------------------------------------4.在android中开发数据库应用: n a.创建数据库:以前在javaee时候,需要手工数据,但是android应用,需要运行在用户的 n n 手机上,所以,android应用,要有自动创建数据库功能,当第一次使用软件的时候 n n 就创建数据库----------------------------------------5.关于数据库自动创建的详细介绍: 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很 n n 多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出 n n 应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据 n n 表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机 n n 上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方 n n 式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我 n n 们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版 n n 本进行管理来实现前面提出的需求。n -----------------------------------------6.SQLite数据库添加,删除,改查操作 n A.创建数据库:SQLiteOpenHelper .getWritableDatabase ()或getReadableDatabase() n n 可以创建数据库7.创建完成以后可以使用SQLITE Expert软件打开生成的数据库n 可以看到除了生成的自己的需要的表之外,还生成了一张:android_metadata表: n 如果在sqlite中使用数据库一定会有一张android_metadata表,用来登记用户的 n 使用语言:zh_cn -----------------------------------------------------n b.数据库自动创建的过程及方法详细介绍: n n我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在 n n 很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建 n n 出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数n n 据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手 n n 机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工 n n 方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为n n 我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库n n 版本进行管理来实现前面提出的需求。n -------------------------------------------8.详细介绍: 为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是 n n onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, intn n n newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结n n 构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获n n 取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生 n n 成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用 n n ,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。 n n onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号, n n 而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数n n 据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为n n 了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如 n n 果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本 n n 升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后 n n 作出相应的表结构及数据更新。 getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的 n n SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库n n 的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就 n n 会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了 n n ,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。 ------------------------------------------------------------------------9.创建数据库的代码: n a.创建项目:DBSQLIte n b./DBSQLIte/src/com/credream/service/DBOpenHelter.java n n package com.credream.service; n n import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; n n public class DBOpenHelter extends SQLiteOpenHelper { //父类没有默认构造器,需要显示调用 public DBOpenHelter(Context context) { super (context, "credream.db", null, 1); //数据库创建完成后,默认会保存在<包>/database/文件夹下 //当修改版本号时候,会触发:onUpgrade方法 //第二个:指定数据库名称, //第三个:游标工厂,用来迭代,查询后的结果集,null代表使用系统默认的 n n 游标工厂//版本号,大于0 n } /** n* 这个方法是在数据库第一次被创建的时候调用的 n*/ @Override public void onCreate(SQLiteDatabase db) { //SQLiteDatabase这个类,封装了增删改查操作,也叫做数据库操作实例 db.execSQL("CREATE TABLE person (personid integer primary keyn n n autoincrement, name varchar(20))"); //这里也可以不写name的数据类型,因为sqlite是数据类型无关的,就是写n n 了varchar(20),也可以写入超过20的内容 n n } /** n* 当数据库的版本号变更的时候被调用 n*/ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("alter table person add phone varchar(12) null"); n n } n n } --------------------------------------------------------2.在清单文件中写入测试环境 n n n
SQLite version 3.7.9 2011-11-01 00:52:41 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table students( ...> id integer primary key, ...> name text not null unique, ...> sex int default 1, ...> bak text); sqlite> .tables students sqlite> .help .backup ?DB? FILE Backup DB (default "main") to FILE .bail ON|OFF Stop after hitting an error. Default OFF .databases List names and files of attached databases .dump ?TABLE? ... Dump the database in an SQL text format If TABLE specified, only dump tables matching LIKE pattern TABLE. .echo ON|OFF Turn command echo on or off .exit Exit this program .explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off. With no args, it turns EXPLAIN on. .header(s) ON|OFF Turn display of headers on or off .help Show this message .import FILE TABLE Import data from FILE into TABLE .indices ?TABLE? Show names of all indices If TABLE specified, only show indices for tables matching LIKE pattern TABLE. .load FILE ?ENTRY? Load an extension library .log FILE|off Turn logging on or off. FILE can be stderr/stdout .mode MODE ?TABLE? Set output mode where MODE is one of: csv Comma-separated values column Left-aligned columns. (See .width) html HTML