SQLite是一种轻量级的数据库,存取数据非常快,非常适合移动设备的本地化存取数据。(Android系统中已经内置了SQLite数据库)
数据库的创建:
- SQLiteOpenHelper,该类是Android提供给我们的便于管理数据库的一个抽象类,里面有两个主要的抽象方法需要我们在继承时进行重写。分别是onCreate():数据库创建时会调用;onUpgrade():数据库升级时调用。另外还提供数据库连接的方法:getReadableDatabase()、getWritableDatabase().上述方法在调用时,如果数据库不存在,则会创建新的数据库,调用onCreate()方法。如果已经存在,则只返回一个当前数据库的SQLiteDatabase对象,onCreate()方法不会调用。
- getReadableDatabase():该方法得到的数据库对象,可以对其进行读写操作,磁盘空间不足时,数据库将会是只读状态。
- getWritableDatabase():该方法得到的数据库对象同样可以进行读写操作,磁盘空间不足时,将抛出异常。
- SQLiteDatabase,该类是一个数据库访问类,用于对数据库增删改查的操作。
具体使用方法:
1、创建SQLite工具类:(初始化操作)
/**
* SQLite 工具类
*
* 数据库操作的帮助类
*/
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(@Nullable Context context, int version) {
super(context, "feige.db", null, version);
}
/**
* 什么时候才会创建建数据库文件?
* 1)数据库文件不存在
* 2)连接数据库
*
*
* 什么时候调用?
* 当数据库文件创建时调用(1次)
* 在此方法中做什么?
* 建表、插入一些初始化数据
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.e("TAG","DBHelper onCreate()");
//建表
String sql = "create table person( _id integer primary key autoincrement, name varchar, age int)";
db.execSQL(sql);
//插入一些数据
//直接sql语句操作数据库表
db.execSQL("insert into person(name,age) values('章散',25)");
db.execSQL("insert into person(name,age) values('李四',30)");
}
/**
* 当传入的版本号大于数据库库版本号时调用
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e("TAG","DBHelper onUpgrade()");
}
}
2、增删改查等操作
public class TestSQliteActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_sqlite);
}
/**
* 创建库
*/
public void testCreateDB(View v) {
DBHelper dbHelper = new DBHelper(this, 1);
//空间满的场合, 没法写入,也不报错(正常不会出现)
//获取连接
SQLiteDatabase database = dbHelper.getReadableDatabase();
//dbHelper.getWritableDatabase();
//提示
Toast.makeText(this, "创建数据库", Toast.LENGTH_SHORT).show();
}
/**
* 更新库
*/
public void testUpdateDB(View v) {
DBHelper dbHelper = new DBHelper(this, 2);
//获取连接
SQLiteDatabase database = dbHelper.getReadableDatabase();
//提示
Toast.makeText(this, "更新数据库", Toast.LENGTH_SHORT).show();
}
/**
* 添加记录
*/
public void testInsert(View v) {
//1、得到连接
DBHelper dbHelper = new DBHelper(this, 2);
SQLiteDatabase sqLiteDatabase = dbHelper.getReadableDatabase();
//2、执行insert insert into person(name,age) values('Tom',30)
ContentValues values = new ContentValues();
values.put("name", "Marry");
values.put("age", 26);
long id = sqLiteDatabase.insert("person", null, values);
//直接sql语句操作数据库表
//db.execSQL("insert into person(name,age) values('章散',25)");
//3、关闭连接
sqLiteDatabase.close();
//4、提示
Toast.makeText(this, "id = " + id, Toast.LENGTH_LONG).show();
}
/*
* 更新
*/
public void testUpdate(View v) {
//1、获取连接
DBHelper dbHelper = new DBHelper(this, 2);
SQLiteDatabase database = dbHelper.getReadableDatabase();
//2、执行update
// SQL语句:updata person set name = 'Jack',age=32 where _id =4;
ContentValues values = new ContentValues();
values.put("name", "Jack");
values.put("age", 33);
int updateCount = database.update("person", values, "_id=?", new String[]{"4"});
//3、关闭连接
database.close();
//4、提示
Toast.makeText(this, "更新数据---> updateCount = " + updateCount, Toast.LENGTH_LONG).show();
}
/*
* 删除
*/
public void testDelete(View v) {
//1、获取连接
DBHelper dbHelper = new DBHelper(this, 2);
SQLiteDatabase database = dbHelper.getReadableDatabase();
//2、执行delete
// SQL语句:delete from person where _id =4;
// int deleteCount = database.delete("person", "_id=?", new String[]{"4"});
//效果同上
int deleteCount = database.delete("person", "_id = 4", null);
//3、关闭连接
database.close();
//4、提示
Toast.makeText(this, "删除数据---> deleteCount = " + deleteCount, Toast.LENGTH_LONG).show();
}
/*
* 查询
*/
public void testQuery(View v) {
//1、获取连接
DBHelper dbHelper = new DBHelper(this, 2);
SQLiteDatabase database = dbHelper.getReadableDatabase();
//2、执行select
// Cursor cursor = database.rawQuery("select * from person where _id=? and name=?",new Object[]{id,name});
// SQL语句:select * from person ;
Cursor cursor = database.query("person", null, null, null, null, null, null);
// Cursor cursor= database.query("person",null,"_id=?",new String[]{"3"},null,null,null);
//得到匹配的总记录数
int selectCount = cursor.getCount();
//取出cursor的数据
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.e("TAG", id + " - " + name + " - " + age);
}
//3、关闭连接
cursor.close();
database.close();
//4、提示
Toast.makeText(this, "查询数据---> selectCount = " + selectCount, Toast.LENGTH_LONG).show();
}
/*
* 测试事务处理
*/
public void testTransaction(View v) {
SQLiteDatabase database = null;
try {
// 获取连接
DBHelper dbHelper = new DBHelper(this, 2);
database = dbHelper.getReadableDatabase();
//1、开启事务(获取连接后)
database.beginTransaction();
// SQL语句:updata person set name = 'Jack',age=32 where _id =4;
ContentValues values = new ContentValues();
values.put("age", 15);
int updateCount = database.update("person", values, "_id=?", new String[]{"1"});
Log.e("TAG", "updateCount = " + updateCount);
boolean flag = true;
if (flag) {
throw new RuntimeException("运行异常");
}
values = new ContentValues();
values.put("age", 43);
int updateCount2 = database.update("person", values, "_id=?", new String[]{"3"});
Log.e("TAG", "updateCount2 = " + updateCount2);
//2、设置事务成功(在全部正常执行后)
database.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
Toast.makeText(this, "出异常了。。。", Toast.LENGTH_LONG).show();
if (database != null) {
//关闭事务
database.endTransaction();
//关闭连接
database.close();
}
}
}
}
TestSQliteActivity.java布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testCreateDB"
android:text="Create DB" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testUpdateDB"
android:text="Update DB" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testInsert"
android:text="Insert" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testUpdate"
android:text="Update" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testDelete"
android:text="Delete" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testQuery"
android:text="query" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testTransaction"
android:text="Test Transaction" />
</LinearLayout>