1.SQLite数据库的特点
安卓手机自带, 小巧, 适合在手机中使用
不区分数据类型(主键除外)
SQL语句和MySQL几乎相同
SQLite不使用JDBC连接, 使用的是Android自有的API
每个数据库对应一个文件
* 2.创建数据库
定义类继承SQLiteOpenHelper, 实现onCreate(), onUpgrade()
创建该类对象, 调用getWritableDatabse()或者getReadableDatabse()
情况1: 数据库文件不存在, 创建文件, 打开数据库连接(得到SQLiteDatabase对象), 执行onCreate()方法
情况2: 数据库文件存在, 版本号没变, 打开数据库连接
情况3: 数据库文件存在, 版本号提升, 升级数据库, 打开数据库连接,执行onUpgrade()方法
SQLiteDatabase类的execSQL()方法可以执行一条SQL语句
如果希望创建数据库的时候就创建一些表, 那么这个操作就可以在onCreate()方法中执行
如果希望在数据库升级的时候做类似修改表添加表的操作, 可以在onUpgrade()方法中执行
*** 4.增删改查
execSQL()方法可以进行增删改操作
rawQuery()执行查询操作, 得到Cursor, 调用moveToNext()判断是否包含数据, 调用getString(), getInt()等方法获取数据
insert(), delete(), update(), query() 四个方法内部也是调用execSQL()和rawQuery()的, 它们在ContentProvider中使用更方便(明天讲)
* 5.事务管理
beginTransaction() 开启事务
setTransactionSuccessful() 设置事务成功标记
endTransaction() 结束事务.
AccountDao.java
安卓手机自带, 小巧, 适合在手机中使用
不区分数据类型(主键除外)
SQL语句和MySQL几乎相同
SQLite不使用JDBC连接, 使用的是Android自有的API
每个数据库对应一个文件
* 2.创建数据库
定义类继承SQLiteOpenHelper, 实现onCreate(), onUpgrade()
创建该类对象, 调用getWritableDatabse()或者getReadableDatabse()
情况1: 数据库文件不存在, 创建文件, 打开数据库连接(得到SQLiteDatabase对象), 执行onCreate()方法
情况2: 数据库文件存在, 版本号没变, 打开数据库连接
情况3: 数据库文件存在, 版本号提升, 升级数据库, 打开数据库连接,执行onUpgrade()方法
情况4: 数据库文件存在, 版本号降低, 执行onDowngrade()方法, 方法中默认会抛出一个异常
代码:MySQLiteOpenHelper.java
package com.oterman.mysqlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
/**
* 由于父类没有默认的无参数的构造函数,故需要显示的写出构造函数,然后去调用父类有参数的构造函数;
* 参数1:context表示应用程序的环境,用来确定数据库文件的位置;
* 参数2:数据库文件的名字;
* 参数3:用来创建结果集Cursor的工厂,默认传入null;
* 参数4:数据的版本号,从1开始;
* @param context
* @param version
*/
public MySQLiteOpenHelper(Context context,int version) {
super(context,"myfirstdb.db",null,version);
}
public MySQLiteOpenHelper(Context context) {
super(context,"myfirstdb.db",null,1);
}
/**
* 如果数据库文件不存在,调用该方法;
*/
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("数据库创建啦");
db.execSQL("create table account(_id Integer primary key autoincrement,name varchar(40))");
}
/**
* 数据库文件存在,版本号发生变化,会调用该方法;
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("数据库升级啦");
}
}
SQLiteDatabase类的execSQL()方法可以执行一条SQL语句
如果希望创建数据库的时候就创建一些表, 那么这个操作就可以在onCreate()方法中执行
如果希望在数据库升级的时候做类似修改表添加表的操作, 可以在onUpgrade()方法中执行
*** 4.增删改查
execSQL()方法可以进行增删改操作
rawQuery()执行查询操作, 得到Cursor, 调用moveToNext()判断是否包含数据, 调用getString(), getInt()等方法获取数据
insert(), delete(), update(), query() 四个方法内部也是调用execSQL()和rawQuery()的, 它们在ContentProvider中使用更方便(明天讲)
* 5.事务管理
beginTransaction() 开启事务
setTransactionSuccessful() 设置事务成功标记
endTransaction() 结束事务.
事务结束的时候, 会把最后一个成功标记之前的操作提交, 成功标记之后的操作回滚
代码:Accout.java
package domain;
public class Account {
private Integer id ;
private String name;
private Integer balance ;
public Account(Integer id, String name, Integer balance) {
super();
this.id = id;
this.name = name;
this.balance = balance;
}
public Account() {
super();
}
public Integer getId() {
return id;
}
public Account(String name, Integer balance) {
super();
this.name = name;
this.balance = balance;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getBalance() {
return balance;
}
public void setBalance(Integer balance) {
this.balance = balance;
}
@Override
public String toString() {
return "Account [id=" + id + ", name=" + name + ", balance=" + balance + "]";
}
}
AccountDao.java
package com.oterman.dao;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.oterman.mysqlite.MySQLiteOpenHelper;
import domain.Account;
public class AccountDao {
private Context context;
public AccountDao(Context context) {
this.context = context;
}
public void insert(Account a){
//获取数据库;
MySQLiteOpenHelper helper=new MySQLiteOpenHelper(context);
SQLiteDatabase db=helper.getWritableDatabase();
//操作数据库;
db.execSQL("insert into account values(null,?,?)",new Object[]{a.getName(),a.getBalance()});
//关闭数据库;
db.close();
}
//删除记录;
public void delete(int i) {
MySQLiteOpenHelper helper=new MySQLiteOpenHelper(context);
SQLiteDatabase db=helper.getWritableDatabase();//获取数据库;
db.execSQL("delete from account where _id=?",new Object[]{i});
db.close();
}
//修改数据库;
public void update(){
MySQLiteOpenHelper helper=new MySQLiteOpenHelper(context);
SQLiteDatabase db=helper.getWritableDatabase();
db.execSQL("update account set balance=? where _id<?",new Object[]{1000,9});
db.close();
}
//查询数据库;
public Account query(int i) {
//获取数据库;
MySQLiteOpenHelper helper=new MySQLiteOpenHelper(context);
SQLiteDatabase db=helper.getWritableDatabase();
//执行查询语句;获取结果集;
Cursor c=db.rawQuery("select name,balance from account where _id=?", new String[]{i+""});
Account a=null;
while(c.moveToNext()){
String name=c.getString(0);
int balance=c.getInt(1);
a=new Account(i,name,balance);
}
return a;
}
//查询所有;
public List<Account> queryAll(){
MySQLiteOpenHelper helper=new MySQLiteOpenHelper(context);
SQLiteDatabase db=helper.getWritableDatabase();
List<Account> list=new ArrayList<Account>();
String sql="select * from account";
Cursor c=db.rawQuery(sql, null);
while(c.moveToNext()){
int id=c.getInt(0);
String name=c.getString(c.getColumnIndex("name"));
int balance=c.getInt(c.getColumnIndex("balance"));
list.add(new Account(id,name,balance));
}
c.close();
db.close();
return list;
}
//演示事务
public void trans(int fromId,int toId, int amount) {
MySQLiteOpenHelper helper=new MySQLiteOpenHelper(context);
SQLiteDatabase db=helper.getWritableDatabase();
String sql1="update account set balance=balance-? where _id=?";
String sql2="update account set balance=balance+? where _id=?";
try{
db.beginTransaction();//开启事务;
db.execSQL(sql1, new Object[]{amount,fromId});
db.execSQL(sql2, new Object[]{amount,toId});
db.setTransactionSuccessful();//可以设置多个标记点;分组提交;如果在标记点之前未出现异常,则之前的所有的sql操作提交;
db.execSQL(sql1, new Object[]{amount,fromId});
db.execSQL(sql2, new Object[]{amount,toId});
db.setTransactionSuccessful();
db.execSQL(sql1, new Object[]{amount,fromId});
int i=1/0;
db.execSQL(sql2, new Object[]{amount,toId});
db.setTransactionSuccessful();//标记点;出现异常时,该标记点至上一个标记点的所有内容被回滚;
}finally{
db.endTransaction();
db.close();
}
}
}