Android之SqliteDatabase数据库学习笔记
1.SqliteDatabase概述:
大家对sqlite数据库应该是比较了解的,他是一个轻量级的数据库,并且他只是一个嵌入式的数据库引擎,专门适合于资源有限的设备(如手机、PAD等)上存储适量的数据。那么android为我们提供了SqliteDatabase代表一个数据库(底层就是一个数据库文件),只要获取到这个对象,我们就可以对数据库进行操作和管理了。
2.先看看SqliteDatabase为我们提供了如下打开静态方法来打开一个文件对应的数据库:
static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CursorFactoryFactory,int flags) 打开path路径文件所代表的Sqlite数据库
static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabase.CursorFactoryFactory) 打开或创建(如果不存在)file文件所代表的数据库。
static SQLiteDatabase openOrCreateDatabase(String path,SQLiteDatabase.CursorFactoryFactory,int flags) 打开或创建(如果不存在)path路径所代表的数据库。
3.通过上面的静态方法就可以获取SQLiteDatabase实例了,在有了这个对象后,我们就可以通过如下的方法来操作数据库了
execSQL(String sql, Object[] bindArgs):执行带占位符的SQL语句
sql:代表要执行的sql语句 例如查询语句:select * from student where age = ?
bindArgs:占位符的值,如上语句中age = ? 假如我们需要查询年级为20岁的,则我们可以写上
这个参数即可: new Object[]{10}
execSQL(String sql):执行SQL语句
insert(String table, String nullColumnHack, ContentValues values):
向指定的表中插入数据
table:表名
nullColumnHack:如果后面的values参数为null或者不包含任何key-value对时这该参数
有效,表示强行插入该数值
values:一行的记录值
update(String table, ContentValues values, String whereClause, String[] whereArgs):更新指定表中的特定数据
table:表名
values:想更新的值
whereClause:满足该参数子句的记录将会被更新
whereArgs:用于为子句的占位符传入参数
delete(String table, String whereClause, String[] whereArgs):删除指定表中的特定数据
table:表名
whereClause:满足该参数子句的记录将会被删除
whereArgs:用于为子句的占位符传入参数
query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy):对指定的数据表进行查询
table:表名
colnums:要查询出来的列名,相当于select语句select关键字后面的部分
selection:查询条件子句,相当于select语句where关键字后面的部分,
该子句中允许占位符?
seletctionArgs:查询子句selection的占位符的参数
gropBy:用于控制分组,相当于select语句group by关键字后面的部分
having:用于对分组进行过滤。相当于select语句having关键字后面的部分
orderBy:用于对记录进行排序,相当于select语句order by关键字后面的部分,
如name desc 、age
asc。 desc(表示降序,从大到小)asc(表示升序,从小到大)
query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit):对指定的数据表执行查询,limit参数控制最多查询几条记录(用于控制分页的参数)
limit:用于进行分页。相当于select语句limit关键字后面的部分,如 2,5(表示从第3条数据开始
查询,查询5条数据)
query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit):对指定的数据表执行查询。其中第一个参数控制是否除去重复值
distinct:指定是否去除重复的记录
rawQuery(String sql, String[] selectionArgs):执行带占位符的SQL语句。
sql:sql语句
selectionArgs:占位符的参数
beginTransaction():开始事务
endTransaction():结束事务
4.如何创建数据库和表
//创建数据库,如果该文件下不存在数据库就创建,存在就打开,
//getFilesDir()获取的路径是:/data/data/对应你的包名(com.itrealman.sqlitedatabase)/files
SqliteDatabase db = SQLiteDatabase.openOrCreateDatabase(getFilesDir() + “/” + DBNAME,null);
//创建person表
db.execSQL(“create table person(_id integer primary key autoincrement, perName varchar(20) not null,perAge int check(perAge >= 0 and perAge <= 150))”);
5.下面通过使用SQL语句来操作Sqlite数据库
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.itrealman.contentprovide.MainActivity">
<TextView
android:id="@+id/mTvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="请输入姓名:"
android:textSize="20sp" />
<EditText
android:id="@+id/mEdtName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/mTvName"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/mTvAge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/mEdtName"
android:layout_marginTop="20dp"
android:text="请输入年龄:"
android:textSize="20sp" />
<EditText
android:id="@+id/mEdtAge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/mTvAge"
android:layout_marginTop="10dp" />
<LinearLayout
android:id="@+id/mLin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/mEdtAge"
android:layout_marginTop="10dp"
android:gravity="center">
<Button
android:id="@+id/mBtnCreate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="创建表" />
<Button
android:id="@+id/mBtnInsert"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="插入" />
<Button
android:id="@+id/mBtnDelete"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="删除" />
<Button
android:id="@+id/mBtnUpdate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="更新" />
<Button
android:id="@+id/mBtnQuery"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="查询" />
</LinearLayout>
<TextView
android:id="@+id/mTvResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/mLin"
android:layout_marginTop="50dp"
android:text="查询的数据为:"
android:textSize="20sp" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//数据库对象
private SQLiteDatabase db;
//数据库名
public final String DBNAME = "test.db";
//数据库表名
public final String TABLENAME = "person";
private EditText mEdtName;
private EditText mEdtAge;
private TextView mTvResult;
private Button mBtnInsert;
private Button mBtnDelete;
private Button mBtnUpdate;
private Button mBtnQuery;
private Button mBtnCreate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
event();
//创建person表
}
/**
* 初始化事件
*/
private void event() {
mBtnDelete.setOnClickListener(this);
mBtnInsert.setOnClickListener(this);
mBtnUpdate.setOnClickListener(this);
mBtnQuery.setOnClickListener(this);
mBtnCreate.setOnClickListener(this);
}
/**
* 初始化控件
*/
private void init() {
//创建数据库,如果该文件下不存在数据库就创建,存在就打开,
//getFilesDir()获取的路径是:/data/data/对应你的包名(com.itrealman.sqlitedatabase)/files
db = SQLiteDatabase.openOrCreateDatabase(getFilesDir() + "/" + DBNAME, null);
mBtnInsert = (Button) findViewById(R.id.mBtnInsert);
mBtnDelete = (Button) findViewById(R.id.mBtnDelete);
mBtnUpdate = (Button) findViewById(R.id.mBtnUpdate);
mBtnQuery = (Button) findViewById(R.id.mBtnQuery);
mBtnCreate = (Button)findViewById(R.id.mBtnCreate);
mEdtAge = (EditText) findViewById(R.id.mEdtAge);
mEdtName = (EditText) findViewById(R.id.mEdtName);
mTvResult = (TextView)findViewById(R.id.mTvResult);
}
@Override
public void onClick(View v) {
String name = null;
int age = 0;
switch (v.getId()) {
case R.id.mBtnDelete:
name = mEdtName.getText().toString().trim();
deleteData(name);
break;
case R.id.mBtnUpdate:
name = mEdtName.getText().toString().trim();
age = Integer.parseInt(mEdtAge.getText().toString().trim());
updateData("newName", age, name);
break;
case R.id.mBtnInsert:
name = mEdtName.getText().toString().trim();
age = Integer.parseInt(mEdtAge.getText().toString().trim());
insertData(name, age);
break;
case R.id.mBtnQuery:
queryAllData();
break;
case R.id.mBtnCreate:
createTable();
break;
}
}
/**
* 插入数据
* @param name
* @param age
*/
private void insertData(String name, int age) {
db.execSQL("insert into " + TABLENAME + "(name,age) values(?,?)", new Object[]{name, age});
Toast.makeText(this, "插入数据", Toast.LENGTH_SHORT).show();
}
/**
* 删除数据
* @param name
*/
private void deleteData(String name) {
db.execSQL("delete from " + TABLENAME + " where name = ?", new Object[]{name});
Toast.makeText(this, "删除数据", Toast.LENGTH_SHORT).show();
}
/**
* 更新数据
* @param name 更新数据的名字
* @param age 更新数据年龄
* @param name1 需要跟新的条件
*/
private void updateData(String name, int age, String name1) {
db.execSQL("update " + TABLENAME + " set name = ? ,age = ? where name = ?", new Object[]{name, age, name1});
Toast.makeText(this, "更新数据", Toast.LENGTH_SHORT).show();
}
/**
* 查询所有数据
*/
private void queryAllData() {
Cursor cursor = db.rawQuery("select * from " + TABLENAME,null);
StringBuilder sb = new StringBuilder();
sb.append("查询的数据为:");
while (cursor.moveToNext()) {
sb.append("name = " + cursor.getString(cursor.getColumnIndex("name"))).append(" age = " + cursor.getInt(cursor.getColumnIndex("age"))).append(" ");
}
mTvResult.setText(sb.toString());
}
/**
* 创建表,如果表存在就不创建,这也是一个小细节,如果说不加if not exists语句,那么
* 这个表就只能创建一次,后面的每次创建都会导致程序崩溃,加上这条语句后,起码创建
* 表按钮不会导致程序崩溃
*/
private void createTable(){
db.execSQL("create table if not exists " + TABLENAME + "(_id integer primary key autoincrement, name varchar(20) not null,age int check(age >= 0 and age <= 150))");
Toast.makeText(this,"创建表",Toast.LENGTH_SHORT).show();
}
/**
* 每次结束程序时关闭数据库,防止内存泄露问题
*/
@Override
protected void onDestroy() {
super.onDestroy();
if(db != null){
db.close();
}
}
}
上面的代码都是采用都是使用SQL语句的形式对数据库操作的,也许对于初学者来说会觉得这些SQL语句写起来非常繁琐,一不小心SQL语句就写错了,但是作为一个程序员,这些基本的语句还是要掌握的。当然我们还有更方便的方法来对数据库进行操作,为了防止SQL语句一不留神就写错了,安卓直接为我们提供针对表名的形式进行增删改查操作,而通过这些方法,我们只需要传递对应的表名、查询条件、值、参数等。
注意,初次启动必须点击一次创建表按钮,或者为了方便起见,可以把创建表语句放到onCreate方法中,每次初始化时让其自动创建表即可。
配上效果图吧,只做了简单的操作 ,其他操作都一样,只是没做这些效果:
ps:对应上面的代码,是让初学者掌握基本的SqliteDatabase的操作,平时在安卓中都不会使用这些代码做基本操作,有关SqliteDatabase数据库的封装操作会在后面学习中讲解。