一、为什么要用SQLite
前面的博客中已经讲过了sharedpreferences的用法,大家也都看到了,sharedpreferences使用简单,但同时也有局限性,因为它是xml存储形式的,所以在排序、筛选等方面略显不足。
提到排序、筛选、比较等需求,我们自然而然会想到数据库,这也正是android自带数据库——SQLite的来由。
二、SQLite是什么
- SQLite数据库存储是Android系统提供的数据存储方式之一
- SQLite是专为嵌入式设备设计的一款轻量级数据库
- SQLite占用资源非常低,在嵌入式设备中,只需要几百K的内存
- SQLite支持标准的SQL语法,遵循数据库的ACID事务
- SQLite是android系统自带,不需要单独安装,不需要用户名密码就可以使用
三、SQLite怎么用
step1:新建类继承SQLiteOpenHelper
新建一个类(类名自定义)继承SQLiteOpenHelper,并实现构造方法、重写oncreate和onupgrade方法。
public class DBHelper extends SQLiteOpenHelper {
private String createSQL = "create table student("
+ "id integer primary key autoincrement not null ,"
+ "name varchar(20) not null,"
+ "age integer not null ,"
+ "gender varchar(2) not null)";
/**
*
* @param context
* @param name 数据库名字
* @param factory 数据库进行查询的时候会返回一个cursor,这个cursor就是在上面的factory中产生的。
如果有需求,可以自定义factory,这样返回的cursor就会符合自己的需求!
* @param version 数据库版本号
*/
public DBHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createSQL);
}
/**
* 该方法会在数据库需要升级的时候调用
*
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("ALTER TABLE student ADD COLUMN other TEXT");
}
}
step2:创建SQLiteDatabase对象
这里有两种创建方式,分别是:
1、只读模式
SQLiteDatabase sqldb = dbhelper.getReadableDatabase();
2、读写模式
SQLiteDatabase sqldb = dbhelper.getWritableDatabase();
step3:通过实现增删改查操作
1、增
private void insert() {
String name = nameEdit.getText().toString();
//获得SQLiteDatabase对象,读写模式
sqldb = dbhelper.getWritableDatabase();
//ContentValues类似HashMap,区别是ContentValues只能存简单数据类型,不能存对象
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", 20);
values.put("gender", "男");
//执行插入操作
sqldb.insert(TABLE_NAME, null, values);
}
2、删
private void delete() {
sqldb = dbhelper.getWritableDatabase();
//第二个参数是WHERE语句(即执行条件,删除哪条数据)
//第三个参数是WHERE语句中占位符(即"?"号)的填充值
sqldb.delete(TABLE_NAME, "name=?", new String[]{"jack"});//删除name的值是jack的那条记录
}
3、改
private void modify() {
SQLiteDatabase sqldb = dbhelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "Jet");
//第二个参数是修改的字段及修改的值(已经存放到ContentValues中)
//第三个参数是WHERE语句
//第四个参数是WHERE语句中占位符的填充值
//如果第三四个参数为null,那就将每条记录都改掉
sqldb.update(TABLE_NAME, values, null, null);
}
4、查
private void show() {
//得到数据库对象
sqldb = dbhelper.getReadableDatabase();
//创建游标
Cursor mCursor = sqldb.query(TABLE_NAME, new String[] { "id", "name", "age", "gender" }, "age>?", new String[]{"10"}, null, null,
null);
//游标置顶
mCursor.moveToFirst();
//遍历
do{
String name = mCursor.getString(mCursor.getColumnIndex("name"));
System.out.println(name);
}while(mCursor.moveToNext());
}
四、示例代码
DBHelper类代码
public class DBHelper extends SQLiteOpenHelper {
private String createSQL = "create table student("
+ "id integer primary key autoincrement not null ,"
+ "name varchar(20) not null,"
+ "age integer not null ,"
+ "gender varchar(2) not null)";
/**
*
* @param context
* @param name 数据库名字
* @param factory 数据库进行查询的时候会返回一个cursor,这个cursor就是在上面的factory中产生的。
如果有需求,可以自定义factory,这样返回的cursor就会符合自己的需求!
* @param version 数据库版本号
*/
public DBHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createSQL);
}
/**
* 该方法会在数据库需要升级的时候调用
*
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("ALTER TABLE student ADD COLUMN other TEXT");
}
}
MainActivity类代码
public class MainActivity extends Activity implements OnClickListener {
private Button addBtn;
private Button deleteBtn;
private Button modifyBtn;
private Button showBtn;
private EditText nameEdit;
private DBHelper dbhelper;
private SQLiteDatabase sqldb;
private static final String TABLE_NAME = "student";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindID();
dbhelper = new DBHelper(this, "demodb", null, 1);
}
/**
* 绑定ID和监听事件
*/
private void bindID() {
addBtn = (Button) findViewById(R.id.addBtn);
deleteBtn = (Button) findViewById(R.id.deleteBtn);
modifyBtn = (Button) findViewById(R.id.modifyBtn);
showBtn = (Button) findViewById(R.id.showBtn);
nameEdit = (EditText) findViewById(R.id.nameEdit);
addBtn.setOnClickListener(this);
deleteBtn.setOnClickListener(this);
modifyBtn.setOnClickListener(this);
showBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.addBtn:
insert();
break;
case R.id.deleteBtn:
delete();
break;
case R.id.modifyBtn:
modify();
break;
case R.id.showBtn:
show();
break;
default:
break;
}
}
private void insert() {
String name = nameEdit.getText().toString();
//获得SQLiteDatabase对象,读写模式
sqldb = dbhelper.getWritableDatabase();
//ContentValues类似HashMap,区别是ContentValues只能存简单数据类型,不能存对象
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", 20);
values.put("gender", "男");
//执行插入操作
sqldb.insert(TABLE_NAME, null, values);
}
private void delete() {
sqldb = dbhelper.getWritableDatabase();
//第二个参数是WHERE语句(即执行条件,删除哪条数据)
//第三个参数是WHERE语句中占位符(即"?"号)的填充值
sqldb.delete(TABLE_NAME, "name=?", new String[]{"jack"});
}
private void modify() {
SQLiteDatabase sqldb = dbhelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "Jet");
//第二个参数是修改的字段及修改的值(已经存放到ContentValues中)
//第三个参数是WHERE语句
//第四个参数是WHERE语句中占位符的填充值
//如果第三四个参数为null,那就将每条记录都改掉
sqldb.update(TABLE_NAME, values, null, null);
}
private void show() {
//得到数据库对象
sqldb = dbhelper.getReadableDatabase();
//创建游标
Cursor mCursor = sqldb.query(TABLE_NAME, new String[] { "id", "name", "age", "gender" }, "age>?", new String[]{"10"}, null, null,
null);
//游标置顶
mCursor.moveToFirst();
//遍历
do{
String name = mCursor.getString(mCursor.getColumnIndex("name"));
System.out.println(name);
}while(mCursor.moveToNext());
}
@Override
protected void onDestroy() {
super.onDestroy();
//退出程序后,关闭数据库资源
sqldb.close();
}
}
布局文件代码
<LinearLayout 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"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >
<EditText
android:id="@+id/nameEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入学生姓名"
/>
<Button
android:id="@+id/addBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="新增"
/>
<Button
android:id="@+id/deleteBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除"
/>
<Button
android:id="@+id/modifyBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="修改"
/>
<Button
android:id="@+id/showBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示"
/>
</LinearLayout>