Android入门:SQLite


一、SQLite介绍


SQLite是一个小型的内嵌于Android的数据库;我们不需要引入驱动即可访问它;

SQLite可视化工具:SQLite Expert Professional 3;

下载地址:http://www.kuaipan.cn/file/id_125546433842511875.htm


二、预备阶段


在本节中,我们会为操作数据库做准备,即本节并不会实际操作数据库,只是做一些前提步骤。下节中,我们将会对操作数据库进行讲解。

主要步骤:

(1)创建某个类(通常称为DatabaseHelper)继承SQLiteOpenHelper,并重写以下三个方法:

  • public DatabaseHelper(Context context);//带Context参数的构造函数,用来创建数据库
  • public void onCreate(SQLiteDatabase db);//在创建数据库时调用
  • public void onUpgrade(SQLiteDatabase db,int old,int newversion);  //数据库版本更改时调用
(2)创建数据库:
  • SQLiteOpenHelper helper = new new DatabaseOpenHelper(this.getContext());
  • SQLiteDatabase db = helper.getWritableDatabase();
(3)SQL语句:db.execSQL(String sql);


具体模板代码如下:


import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper{
	private static final String TAG = "DatabaseHelper";
	private static  int VERSION = 1;
	public DatabaseHelper(Context context) {
		super(context, "test.db", null, VERSION);
	}
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table 语句");
	}
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		Log.i(TAG, "版本更新...");
	}
}

当创建数据库时,database存放在/data/data/package/databases 目录中;

问题1:测试数据库是否能够成功创建

如果你想要测试创建数据库是否成功(你自己写的创建语句是否正确),只需要在AndroidTestCase中写入2行代码:

  • SQLiteOpenHelper helper = new new DatabaseOpenHelper(this.getContext());
  • SQLiteDatabase db = helper.getWritableDatabase();
运行测试文件后,即可在/data/data/package/databases中生成db文件,export到本地电脑后,用SQLite可视化工具看下就可以知道。

问题2:如何在onUpdate中完成版本更新

如果想要在版本更新时更新数据库,可以使用以下技巧:

  • db.execSQL("drop table if exists Table1");//如果存在Table1表,则删除这张表,可以重复执行多次,将全部的表删光。
  • onCreate(db); //再次创建数据库的表结构

这样能够比较圆满的完成版本更新。


三、增删改查操作


本节将会讲解到怎样进行增删改查,首先要注意的是:

  • db.execSQL() 是执行“修改操作SQL”的。
  • db.rawQuery() 是执行“查询SQL”的。

这些CRUD操作都是封装在SQLiteDatabase类中的。下面分别介绍:

1)获得SQLiteDatabase对象

2)插入操作

3)删除操作

4)查询操作

5)更新操作


1.获得SQLiteDatabase对象


SQLiteOpenHelper helper = new DatabaseHelper(this.getContext());
SQLiteDatabase db = helper.getWritableDatabase();
SQLiteDatabase db = helper.getReadableDatabase();//此函数内部其实也调用了getWritableDatabase()函数,即调用了此函数,也可以写数据

2.insert操作


插入操作有三种方法完成:
  1. (一般)用原始SQL语句完成:即db.execSQL("INSERT 语句"); 很显然,这种方法是有缺陷的,通常都是从用户界面获得一些数据,然后插入数据库,因此很不灵活,组拼SQL语句是很累人的事。
  2. (推荐)将插入记录用参数数组来表示:db.execSQL("insert into person(name,age) values(?,?)",new Object[]{"xiazdong",20}); 这里类似于JDBC中的PreparedStatement,第一个参数是SQL语句,里面可以有占位符“?”,第二个参数是占位符填入的内容组成的对象数组。
  3. (如果对SQL不熟悉,可以用这个)使用内置的insert函数:db.insert(String "tablename",String "nullColums", ContentValues values);  第一个参数是插入的表名;第二个参数是null值的列,即哪些列是有null值的,如果没有列是null值,则直接在第二个参数处写上null即可;第三列是存放数据的对象,数据库的表中有很多的列,比如name,age,我们将列名作为key,对应的数据作为value,将<key,value>插入ContentValues即可。
举例:

第一种方法:

db.insert("INSERT INTO person(name,age) VALUES('xiazdong',20);");

第二种方法:

db.insert("INSERT INTO person(name,age) VALUES(?,?);", new Object[]{"xiazdong",20});

第三种方法:

ContentValues values = new ContentValues();
values.put("name","xiazdong");
values.put("age",20);
db.insert("tablename",null,values);

有些人肯定想不通为什么第一种方法很累人,这里举个例子:

比如界面要求输入一个name值,如果用户输入了a'b'c'e,那么组拼的SQL语句需要对其中的单引号转义,这比较麻烦,因为需要人工慢慢转才行。

3.delete操作


Android提供了3种方法执行delete操作,其实和INSERT操作差不多。
  1. 原始SQL语句:db.execSQL("delete 语句");
  2. 带占位符SQL语句:db.execSQL("delete from person where id=?",new Object[]{id});
  3. 内置的delete函数:db.delete("tablename","id=?",new String[]{id+""}); 第一个参数用于指定表名,第二个参数写出SQL中where后面的条件,第三个参数为参数字符串数组,存放where子句中占位符的信息。

4.update语句


Android提供了3种方法执行update操作,其实和INSERT操作差不多。
  1. 原始SQL语句:db.execSQL("update 语句");
  2. 带占位符SQL语句:db.execSQL("update person set age=? where name=?",new Object[]{30,"xiazdong"});
  3. 内置的update函数:db.update("tablename",ContentValues values,String"where 子句", new String[]{"where子句的参数"}); 第一个参数用于指定表名,第二个参数指定set子句更新的数据,第三个参数为where子句,第四个参数存放where子句中占位符的信息。
由于第三个方法比较难理解,因此给出一个例子:

ContentValues values = new ContentValues();
values.put("age",30);/*set子句*/
db.update("tablename",values,"name=?"/*where子句*/,new String[]{"xiazdong"}/*where子句参数*/);


5.query语句


(1)
Cursor cursor = db.rawQuery("select * from person where name=?",new Object[]{"xiazdong"});
while(cursor.moveToNext()){
    //int index = cursor.getColumnIndex(String name);//根据name获得索引
    //String name = cursor.getString(int index);    //根据索引获得值
    String name = cursor.getString(cursor.getColumnIndex("name")); 
}

(2)
Cursor cursor = db.query("tablename",null/*表示select * */,"name=?"/*where语句*/,new String[]{"xiazdong"},null/*group by 语句*/,null/*having 语句*/,null/*order by语句*/,null/*limit 语句*/);

6.分页语句


Cursor cursor = db.rawQuery("select * from person limit ?,?",new Object[]{5,5});    //第一个5表示跳过5条记录,下一个5为查询结果的记录个数
while(cursor.moveToNext()){
    String name = cursor.getString(cursor.getColumnIndex("name")); 
}

7.获得记录个数语句


(1)
Cursor cursor = db.rawQuery("select count(*) from person", null);
cursor.moveToFirst();
int count = cursor.getInt(0);

(2)
db.query("person",new String[]{"count(*)"},null,null,null,null,null,null);

三、事务操作


模板代码如下:

db.beginTransaction();
try{
	//事务操作
	db.setTransactionSuccessful();//此句必须要有,不然db.endTransaction()默认为回滚
}
finally{
	db.endTransaction();
}



评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值