一,SQLite数据库存储
应用运行需要保存一系列有一定结构的数据,比如:公司员工信息。
文件类型:.db
数据保存的路径:/data/data/projectPackage/databases/xxx.db
默认情况下其他应用不能访问,当前应用可以通过ContentProvider提供其他应用操作。
二,SQLite数据库命令行
adb shell 进入系统根目录
cd /data/data/projectPackage/databases 进入包含数据库文件的文件夹
sqlite3 xxx.db 使用sqlite3命令连接指定的数据库文件,进入连接模式
help 查看命令列表
tables 查看所有表的列表
exit 退出数据库连接模式
Ctrl+C 直接退出shell模式
三,SQLite建表语句,增删改查sql语句
可以不指定字段类型,可以自动转换,但除varchar类型外最好指定类型。
主键名称:_id
增: insert into tablename(属性1,属性2,...) values(value1,value2,...)
删:delete from tablename where 条件
改:update tablename set ... where 条件
查:select * from tablename where 条件
四,SQLite相关API
SQLiteOpenHelper:数据库操作的抽象帮助类
SQLiteDatabase:代表与数据库连接的类
Cursor:包含所有查询结果记录的结果集对象(光标,游标)
五,看代码
activity_db.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".DBActivity">
<Button
android:id="@+id/create_db_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testCreateDB"
android:text="Create DB" />
<Button
android:id="@+id/update_db_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testUpdateDB"
android:text="Update DB" />
<Button
android:id="@+id/insert_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testInsert"
android:text="Insert" />
<Button
android:id="@+id/update_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testUpdate"
android:text="Update" />
<Button
android:id="@+id/delete_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testDelete"
android:text="Delete" />
<Button
android:id="@+id/query_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testQuery"
android:text="Query" />
<Button
android:id="@+id/transaction_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="testTransaction"
android:text="Test Transaction" />
</LinearLayout>
DBHelper
//继承SQLiteOpenHelper抽象类
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(@Nullable Context context, int version) {//构造器,因为父类没有无参构造,所以必须要写
super(context, "xiao.db", null, version);
}
/**
* 问题1:此方法什么时候调用?
* 数据库文件创建时调用(1次)
* 问题2:此方法主要做什么?
* 1.建表
* 2.插入一些初始化数据
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {//db相当于Connection
//建表
String sql = "create table xiao(_id integer primary key autoincrement, name varchar, age int)";
db.execSQL(sql);//执行sql语句
//插入初始化数据
db.execSQL("insert into xiao (name,age) values ('renxiao',21)");
db.execSQL("insert into xiao (name,age) values ('xiaoxiao',22)");
db.execSQL("insert into xiao (name,age) values ('laoxiaoxiao',80)");
}
//当传入的版本号大于数据库的版本号时调用
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
System.out.println("onUpgrade的方法已运行");
}
}
DBActivity
public class DBActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_db);
}
/**
* 创建库
* @param view
*/
public void testCreateDB(View view) {
DBHelper dbHelper = new DBHelper(this,1);
//获取连接
SQLiteDatabase database = dbHelper.getReadableDatabase();
}
/**
* 更新库
* @param view
*/
public void testUpdateDB(View view) {
DBHelper dbHelper = new DBHelper(this,2);
//获取连接
SQLiteDatabase database = dbHelper.getReadableDatabase();
}
/**
* 添加记录
* @param view
*/
@SuppressLint("WrongConstant")
public void testInsert(View view) {
//1.得到连接
DBHelper dbHelper = new DBHelper(this,2);//这里的版本号必须“>=”testUpdateDB里面的版本号
SQLiteDatabase database = dbHelper.getReadableDatabase();
//2.执行insert insert into xiao (name,age) values ('renxiao',21)
ContentValues values = new ContentValues();//为了实现属性与值的映射关系,Map类型
values.put("name","renxiao");
values.put("age",21);
long id = database.insert("xiao", null, values);//表名 可选择的参数 值
//3.关闭
database.close();
Toast.makeText(this, "id="+id, Toast.LENGTH_LONG).show();
}
/**
* 更新
* @param view
*/
public void testUpdate(View view) {
//1.得到连接
DBHelper dbHelper = new DBHelper(this,2);//这里的版本号必须“>=”testUpdateDB里面的版本号
SQLiteDatabase database = dbHelper.getReadableDatabase();
//2.执行update update xiao set name = jack,age = 13,where _id = 4;
ContentValues values = new ContentValues();//为了实现属性与值的映射关系,Map类型
values.put("name","Jack");
values.put("age",13);
int updateCount = database.update("xiao", values, "_id=?", new String[]{"4"});
//3.关闭
database.close();
Toast.makeText(this, "updateCount="+updateCount, Toast.LENGTH_LONG).show();
}
/**
* 删除记录
* @param view
*/
public void testDelete(View view) {
//1.得到连接
DBHelper dbHelper = new DBHelper(this,2);//这里的版本号必须“>=”testUpdateDB里面的版本号
SQLiteDatabase database = dbHelper.getReadableDatabase();
//2.执行delete delete from xiao where _id = 2;
int deleteCount = database.delete("xiao","_id = 2",null);
//3.关闭
database.close();
Toast.makeText(this, "deleteCount="+deleteCount, Toast.LENGTH_LONG).show();
}
/**
* 查询
* @param view
*/
public void testQuery(View view) {
//1.得到连接
DBHelper dbHelper = new DBHelper(this,2);//这里的版本号必须“>=”testUpdateDB里面的版本号
SQLiteDatabase database = dbHelper.getReadableDatabase();
//2.执行Query select * from xiao
Cursor cursor = database.query("xiao",null,null,null,null,null,null);
//得到匹配的总记录数
int count = cursor.getCount();
//取出cursor中所有的数据
while(cursor.moveToNext()){
//_id
int id = cursor.getInt(0);
//name
String name = cursor.getString(1);
//age
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.e("TAG",id+"-"+name+"-"+age);
}
//3.关闭
cursor.close();
database.close();
Toast.makeText(this, "count="+count, Toast.LENGTH_LONG).show();
}
/**
* 测试事务处理
* update xiao set age=13 where _id=1;
* update xiao set age=15 where _id=3;
* @param view
*
*
* 一个功能中对数据库进行多个操作,要么都成功,要么都失败
*
*事务处理的三步:
* 1.开启事务(获得连接后)
* 2.设置事务成功(在全部正常执行完后)
* 3.结束事务(finally中)
*/
public void testTransaction(View view) {
SQLiteDatabase database = null;
try {
//1.得到连接
DBHelper dbHelper = new DBHelper(this,2);//这里的版本号必须“>=”testUpdateDB里面的版本号
database = dbHelper.getReadableDatabase();
//开启事务(获得连接后)
database.beginTransaction();
//2.执行update update xiao set age = 15,where _id = 1;
ContentValues values = new ContentValues();//为了实现属性与值的映射关系,Map类型
values.put("age",15);
int updateCount = database.update("xiao", values, "_id=?", new String[]{"1"});
Log.e("TAG","updateCount="+updateCount);
//出了异常
boolean flag = true;
if (flag) {
throw new RuntimeException("出异常了");
}
//执行update xiao set age = 17,where _id = 3;
values = new ContentValues();//为了实现属性与值的映射关系,Map类型
values.put("age",17);
int updateCount2 = database.update("xiao", values, "_id=?", new String[]{"3"});
Log.e("TAG","updateCount2="+updateCount2);
//设置事务成功(在全部正常执行完后)
database.setTransactionSuccessful();
}catch (Exception e){
Toast.makeText(this, "出异常了", Toast.LENGTH_LONG).show();
} finally {
//结束事务(finally中)
if(database != null){
database.endTransaction();
}
//3.关闭
database.close();
}
}
}