1、为何要会点SQLite?android
SQLite做为一款轻量级的关系型数据库,占用的资源特别少,因此其应用场景也是特别的多。在移动开发中,咱们常常会有将数据存储在本地的需求,此时SQLite将是咱们最佳的选择。 可喜的是,SQLite已经被完美的集成在Android系统中,因此对于开发者而言,上手SQLite的难度又下降了很多。sql
2、开始玩玩SQLite数据库
首先来讲说在Android中操做SQLite数据库的总体思路:app
一、自定义数据库操做辅助类,并继承自SQLiteOpenHelper类;
二、在Application中初始化SQLiteOpenHelper对象,并公开一个方法供其余类调用获取该对象;
三、根据SQLiteOpenHelper对象实例化SQLiteDatabase对象;
四、最后,咱们拿SQLiteDatabase对象便可进行SQLite数据库的常规操做了。
复制代码
其实整个流程并不复杂,稍微来点耐心,动动手指头,再回头瞧瞧SQLite,“哇哦,操做你如此简单!”ide
一、自定义数据库操做辅助类,并继承自SQLiteOpenHelper类ui
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* author:silencezwm on 16/6/20 06:43
* email:silencezwm@gmail.com
* description:数据库操做辅助类
*/
public class DBHelper extends SQLiteOpenHelper {
//数据库名称
private static final String DBName = "study.db";
//数据库版本号
private static final int DBVersion = 1;
//构造方法
public DBHelper(Context context) {
super(context, DBName, null, DBVersion);
}
@Override
public void onCreate(SQLiteDatabase db) {
//建立表---study
db.execSQL("CREATE TABLE study ( _id integer PRIMARY KEY AUTOINCREMENT NOT NULL, bookName varchar, bookDesc varchar)");
}
/**
* 数据库版本更新
* @param db 数据库实例
* @param oldVersion 旧版本号
* @param newVersion 新版本号
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS study");
onCreate(db);
}
}
复制代码
该类继承了SQLiteOpenHelper,并实现了三个方法,其中onCreate()在数据库初始化时会调用,onUpgrade()方法只有在数据库新版本号大于旧版本号时才会调用,即进行数据库的更新操做。其中涉及到了经常使用SQL语句的书写,看不懂的童鞋得抽空脑补一下这方面的知识哦。this
SQLiteOpenHelper有什么用?spa
该SQLiteOpenHelper是Android平台提供给咱们的数据库辅助类,用于建立或打开数据库。
复制代码
二、在Application中初始化SQLiteOpenHelper对象,并公开一个方法供其余类调用获取该对象.net
考虑到整个应用中的不一样地方都有可能涉及到数据库的操做,因此咱们有必要将该类的初始化放在咱们自定义的Application类中。就像该下:code
public class MyApp extends Application {
//数据库辅助类实例
private static DBHelper mDBHelper;
@Override
public void onCreate() {
super.onCreate();
mDBHelper = new DBHelper(getApplicationContext());
}
//返回DBHelper实例,
public static DBHelper getmDBHelper(){
return mDBHelper;
}
}
复制代码
咱们来看看初始化SQLiteOpenHelper类源码的实现方式
public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
this(context, name, factory, version, null);
}
复制代码
参数含义解析:
context:上下文对象,这里咱们传入了ApplicationContext;
name:数据库名称,这里咱们定义为"study.db";
factory:操做数据库后返回的默认Cursor对象,这里咱们默认为null,后续须要保存返回的Cursor对象时,本身再进行构造;
version:数据库的版本号,初始版本号必须大于1,不然系统会抛IllegalArgumentException("Version must be >= 1, was " + version)异常。
复制代码
三、根据SQLiteOpenHelper对象实例化SQLiteDatabase对象
该操做将会让咱们获得SQLiteDatabase对象,而一旦有了该对象,咱们就能够进行数据库的增删改查操做了。该操做咱们能够单独封装在某个类,一样也能够直接在某个Activity中实现。 核心代码以下:
//获取的数据库对象
//其中 getWritableDatabase() 和 getReadableDatabase() 区别???
SQLiteDatabase db = MyApp.getmDBHelper().getWritableDatabase();
//SQLiteDatabase db = MyApp.getmDBHelper(). getReadableDatabase();
复制代码
获得SQLiteDatabase实例有以上两种方法,两种方法的主要区别在于:
在数据库仅开放只读权限或磁盘已满时,getReadableDatabase只会返回一个只读的数据库对象。
复制代码
另外在咱们每次初始化SQLiteDatabase对象时,系统都会进行数据库版本号的判断,该判断的核心代码以下(有兴趣的童鞋能够研究下getWritableDatabase()、getReadableDatabase()的源码实现):
//获取数据库版本号,默认为0
final int version = db.getVersion();
//若是老版本号与新版本号不一样
if (version != mNewVersion) {
//若是数据库为只读,系统则会抛出"SQLiteException"异常
if (db.isReadOnly()) {
throw new SQLiteException("Can't upgrade read-only database from version " +
db.getVersion() + " to " + mNewVersion + ": " + mName);
}
//数据库开启事务
db.beginTransaction();
try {
//表示数据库第一次建立,则会进入咱们文章最上面自定义DBHelper类的onCreate()方法
if (version == 0) {
onCreate(db);
} else {
//若是旧版本号大于新版本号,数据库会”降级“,不然数据库会”升级“
if (version > mNewVersion) {
onDowngrade(db, version, mNewVersion);
} else {
onUpgrade(db, version, mNewVersion);
}
}
//设置数据库的最新版本号
db.setVersion(mNewVersion);
//事务成功完成
db.setTransactionSuccessful();
} finally {
//最后结束事务
db.endTransaction();
}
}
复制代码
四、拿SQLiteDatabase对象进行SQLite数据库的常规操做
该下简略介绍两种操做方法:
一、使用SQL语句
二、使用Android封装好的方法
复制代码
咱们在初始化SQLiteDatabase对象的时候,建立了一个数据库:study.db,并在数据库中建立了一个表:study,表中包含主键自增 _id , 还有两个字段:bookName、bookDesc。 该下代码实现了往数据库中插入、更新、查询、删除四种经常使用操做,此时你应该亲自动手试试...
//插入数据
case R.id.btn_insert:
//使用SQL语句
if (useSQL) {
db.execSQL("insert into study values(null, ?, ?)",
new Object[]{et_insert_book_name.getText().toString(), et_insert_book_desc.getText().toString()});
//使用Android封装的方法
} else {
//其中cv为ContentValues的实例
cv.put("bookName", et_insert_book_name.getText().toString());
cv.put("bookDesc", et_insert_book_desc.getText().toString());
long isOK = db.insert("study", null, cv);
//-1表明操做失败
if (isOK == -1) {
Toast.makeText(DBDemoActivity.this, "插入失败", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(DBDemoActivity.this, "插入成功", Toast.LENGTH_SHORT).show();
}
}
break;
//更新数据
case R.id.btn_update:
if (useSQL) {
db.execSQL("update study set bookName = ? where bookName = ?", new String[]{et_update_new_book_name.getText().toString(), et_update_book_name.getText().toString()});
} else {
cv.put("bookName", et_update_new_book_name.getText().toString());
int updateCount = db.update("study", cv, "bookName = ?", new String[]{et_update_book_name.getText().toString()});
//更新后更新的个数,"0"表示更新失败
if (updateCount != 0) {
Toast.makeText(DBDemoActivity.this, "更新成功,共更新个数:" + updateCount, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(DBDemoActivity.this, "更新失败", Toast.LENGTH_SHORT).show();
}
}
break;
//查询操做
case R.id.btn_query:
if (useSQL) {
Cursor cursor = db.rawQuery("select * from study", null);
StringBuilder sb = new StringBuilder();
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
sb.append("总数:" + cursor.getCount() + "\\\\n" + "书名:" + cursor.getString(cursor.getColumnIndex("bookName"))
+ "----该书简介:" + cursor.getString(cursor.getColumnIndex("bookDesc")));
text_query_result.setText(sb.toString());
}
//记得进行关闭哦
cursor.close();
} else {
//查询该表中全部数据
Cursor c = db.query("study", null, null, null, null, null, null);
StringBuffer sb = new StringBuffer();
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
sb.append("总数:" + c.getCount() + "\\\\n" + "书名:" + c.getString(c.getColumnIndex("bookName"))
+ "----该书简介:" + c.getString(c.getColumnIndex("bookDesc")));
text_query_result.setText(sb.toString());
}
//记得进行关闭哦
c.close();
}
break;
//删除操做
case R.id.btn_del:
if (useSQL) {
db.execSQL("delete from study where bookName = ?", new String[]{et_del_book_name.getText().toString()});
} else {
db.delete("study", "bookName = ?", new String[]{et_del_book_name.getText().toString()});
}
break;
复制代码
3、SQLite说
”555...又被你看穿了“