SQLite数据库是Android系统内置的自带的数据库,是一款轻量级的关系型数据股,运算速度快,占用资源少,适合在移动设备上使用。SQLite支持标准的SQL语法,还遵循了数据库的ACID事务。
数据库的创建
Android提供了一个SQLiteOpenHelper帮助类,借助这个类可以非常简单的对数据库进行创建和升级。SQLiteOpenHelper是一个抽象类,如果使用的话需要创建一个类去继承它,并重写其中的两个抽象方法,然后在这个方法中去实现创建、升级数据库的逻辑。
SQLiteOpenHelper中有两个构造方法可以重写,一般使用参数少一点。这个构造方法中接收四个参数,第一个参数是Context,即上下文,第二个参数是数据库名,第三个参数是在查询数据的时候返回一个自定义的Cursor,一般传入null,第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。
SQLiteOpenHelper中还有两个实力方法,getReadableDatabase()和getWitableDatabase()。这两个方法都可以创建或者打开一个而现有的数据库,并返回一个可对数据库进行读写操作的对象。不同的是当数据库不可写入的时候(磁盘存储已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法将会出现异常。
首先创建一个继承自SQLiteOpenHelper的类并重写其构造方法和其他两个抽象方法。
package com.example.administrator.mysqllite.database;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by Administrator on 2015/9/7.
*/
public class FirstSqlLiteopenHelper extends SQLiteOpenHelper {
public FirstSqlLiteopenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public FirstSqlLiteopenHelper(Context context,String name){
this(context,name,null,1);//由于后边两个参数基本不变,所以再写一个简单的构造方法来调用上边的构造方法。
}
@Override
public void onCreate(SQLiteDatabase db) {
String create="create table if not exists user(id int(10),name varchar(20)not null primary key autoincrement," +
"sex varchar(10)not null,age int(5))";
db.execSQL(create);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
修改MainActivity中的代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private SQLiteDatabase database;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FirstSqlLiteopenHelper sqlLiteopenHelper=new FirstSqlLiteopenHelper(getApplicationContext(),"firstDatabase");
database=sqlLiteopenHelper.getWritableDatabase();
}
数据库的插入数据
SQLiteDatebase中提供了一个insert()方法用来专门添加数据,它接收三个参数,第一个参数是表名,第二个参数是用于在未指定添加数据的情况下给某些可为空的列自动赋值null,一般直接传入null,第三个参数是ContentValues对象,它提供了一系列的put()方法重载,用于向ContentValues中添加数据,只需将表中的每个列名以及相应的待添加的数据传入即可。
在XML中定义三个输入框和一个按钮,通过点击事件将输入框中的信息插入到数据库中
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/editext_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="姓名"/>
<EditText
android:id="@+id/editext_sex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="性别"/>
<EditText
android:id="@+id/editext_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="年龄"/>
</LinearLayout>
<Button
android:id="@+id/button_insert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="插入数据"/>
在MainActivity中添加点击事件,添加数据,在此之前要开启数据库
FirstSqlLiteopenHelper sqlLiteopenHelper=new FirstSqlLiteopenHelper(getApplicationContext(),"firstDatabase");
database=sqlLiteopenHelper.getWritableDatabase();
private void insert() {
ContentValues values=new ContentValues();
//values.put("id",1);
values.put("name",mEdittext_name.getText().toString());
values.put("sex",mEdittext_sex.getText().toString());
values.put("age",mEdittext_age.getText().toString());
database.insert("user", null, values);
Toast.makeText(getApplicationContext(), "插入数据", Toast.LENGTH_LONG).show();
}
数据库的修改数据
SQLiteDatabase中提供了一个update()方法用于对数据进行更新,这个方法接收四个参数,第一个参数是表名,第二个参数是ContentValues对象,要把更新的数据在这里组装进去。第三个第四个参数用于去约束更新某一行或几行中的数据,不指定的话默认就是更新所有行。
同样定义一个按钮,通过点击时间来更新数据库,XML定义按钮很简单,这里只写点击事件
private void update() {
ContentValues values=new ContentValues();
values.put("sex","女");
database.update("user",values,"name=?",new String[]{"zhangsan"});
}
这里第三第四个参数传的值是定义name为zhangsan的所在行进行更新。
数据库的删除数据
SQLiteDatabase中提供了一个delete()方法用于对数据进行删除,这个方法接收三个参数,第一个参数为表名,第二个第三个参数用于去约束删除某一行或某几行的数据,不指定的话就默认删除所有行
private void delete() {
database.delete("user","name=?",new String[]{"lisi"});
}
这里删除name为lisi的所在行的数据
数据库的查看数据
SQLiteDatabase中提供了一个query()方法用于对数据进行数据查询,这个方法的参数比较复杂,最短的一个方法重载也需要传入七个参数,第一个参数是表名,第二个参数用于指定去查询哪几列,如果不指定则查询所有列。第三第四参数用于去约束查询某一行或某几行的数据,不指定则是所有行,第五个参数是指定需要去group by的列,第六个参数适用于对group by之后的数据进行进一步的过滤,第七个参数用于指定查询结果的排序方式。
还有一个方法 rawQuery()方法,第一个参数是sql语句,第二个参数是约束条件。
private void select() {
//Cursor cursor=database.rawQuery("select * from user",null);
Cursor cursor=database.query("user",null,null,null,null,null,"age DESC"," 1 , 2");
cursor.moveToFirst();
while(!cursor.isAfterLast()){
String name=cursor.getString(cursor.getColumnIndex("name"));
String sex=cursor.getString(cursor.getColumnIndex("sex"));
String age=cursor.getString(cursor.getColumnIndex("age"));
Log.d("selectInformation", "姓名 :"+name +" 性别:"+sex+" 年龄:"+age);
cursor.moveToNext();
}
}
使用SQL操作数据库
Android提供了一系列的方法,使得可以直接通过SQL来操作数据库。
添加数据:
database.execSQL("insert into user(name,sex,age)values(?,?,?)",new String[]{"zhangsan","nan","19"});
更新数据
database.execSQL("update user set age=? where name=?",new String[]{"19","zhangsan"});
删除数据
database.execSQL("delete from user where name=?",new String[]{"zhangsan"});
查询数据
database.rawQuery("select * from user",null);