1.SQLite数据库的特点
安卓手机自带, 小巧, 适合在手机中使用
不区分数据类型(主键除外)
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("数据库升级啦"); } }
* 3.创建表或修改表
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(); } } }