一.为什么要用SQLite
1.SharedPreferences是以XML形式存储数据的,只适合存储基本数据类型的数据
2.文件存储的内容在提取数据时,相对复杂
3.当数据量大,结构复杂时,如果使用SharedPreference和文件存储对数据的操作将变得非常复杂,容易出错,效率低下,Android中提供了SQLite数据存储,帮助我们解决问题
简单来说SQLite就是用来解决存储数据量大和数据复杂
二.什么是SQLite
1.SQLite数据库存储时Android系统提供的数据存储方式之一
2.SQLite时专为嵌入式设备设计的一款轻量级数据库
3.SQLite占用资源非常低,在嵌入式设备中,只需要几百k的内存
4.SQLite支持标准的SQL语法,遵循数据库的ACID的事务
5.SQLite不需要安装,不需要用户名密码就可以使用
三.如何创建数据库和数据表
创建数据库
1.新建类继承SQLiteOpenHelper
SQLiteOpenHelper构造方法
父类中未提供默认构造方法,必须显示调用父类的构造方法
需要传递创建数据库名称以及数据库版本号
构造方法
public MySqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
SQLiteOpenHelper类的常用方法:onCreate方法 onUpgrade方法
2.实现构造方法
3.重写onCreate方法
- 此方法只会在第一次创建时执行,只会执行一次
- 在此方法中使用标准的SQL语句创建数据表
- onCreate方法有一个SQLiteDatabase对象参数,通过调用execSQL方法执行建表SQL语句
4.重写onUpgrade方法
- 此方法用来升级数据库表结构时触发
- 当需要增加表字段或增加表时,传递进来一个新的数据库版本号,就会触发此方法
5.实例化SQLiteOpenHelper的子类对象,例如本例的DBHelp类
创建数据表
create table 表名(
列名 数据类型 主键(primary key) 依次递增(autoincrement) 不为空(not null),
列名 数据类型 ,
列名 数据类型
);
每条数据一定要用英文逗号隔开
数据类型 | 作用 |
---|---|
NULL | 空值 |
REAL | 浮点型 |
TEXT | 文本 |
INTEGER | 整型 |
6.调用getReadableDatabase方法或getWritableDatabase方法。
四.如何添加数据
新建一个方法继承SQLiteOpenHelper类,里面写上sql语句,在onCreate方法通过调用execSQL方法执行建表SQL语句
package com.example.myapplication;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by lyj on 2018/6/13.
*/
public class MySqliteHelper extends SQLiteOpenHelper {
//注意此处每个列名用逗号隔开,要用英文的逗号
private String sql = "create table student(" +
"id integer primary key autoincrement not null ," +
"name text ," +
"age integer" +
")";
public MySqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
写一个添加的方法
通过sqLiteDatabase.insert("student", null, values);
添加
private void addStudent() {
String name = sql_name.getText().toString();
int age = Integer.parseInt(sql_age.getText().toString());
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", age);
//第二参数是数据名
MySqliteHelper mySqliteHelper = new MySqliteHelper(this, "student_db", null, 1);
SQLiteDatabase sqLiteDatabase = mySqliteHelper.getWritableDatabase();
sqLiteDatabase.insert("student", null, values);
}
五.如何删除数据
同上新建一个方法继承SQLiteOpenHelper类,不做改动
写一个删除的方法
通过sqLiteDatabase.delete("student","name=? and age=?",new String[]{name,age});
删除
private void delStudent() {
String name=sql_name.getText().toString();
String age=sql_age.getText().toString();
MySqliteHelper mySqliteHelper = new MySqliteHelper(this, "student_db", null, 1);
SQLiteDatabase sqLiteDatabase = mySqliteHelper.getWritableDatabase();
sqLiteDatabase.delete("student","name=? and age=?",new String[]{name,age});
}
六.如何修改数据
同上新建一个方法继承SQLiteOpenHelper类,不做改动
写一个修改的方法
通过sqLiteDatabase.update("student",values,"name=? and age=?",new String[]{name,age});
修改
/*
第一个参数:表名
第二个参数:需要更新的数据
第三个参数:修改条件
第四个参数:占位符填充值
*/
sqLiteDatabase.update("student",values,"name=? and age=?",new String[]{name,age});
private void modifyStudent() {
String name=sql_name.getText().toString();
String age=sql_age.getText().toString();
MySqliteHelper mySqliteHelper = new MySqliteHelper(this, "student_db", null, 1);
SQLiteDatabase sqLiteDatabase = mySqliteHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("name","小泽");
values.put("age","20");
/*
第一个参数:表名
第二个参数:需要更新的数据
第三个参数:修改条件
第四个参数:占位符填充值
*/
sqLiteDatabase.update("student",values,"name=? and age=?",new String[]{name,age});
}
七.如何查询数据
同上新建一个方法继承SQLiteOpenHelper类,不做改动
写一个查询的方法
通过游标获取
private void listStudent() {
MySqliteHelper mySqliteHelper = new MySqliteHelper(this, "student_db", null, 1);
SQLiteDatabase sqLiteDatabase = mySqliteHelper.getWritableDatabase();
//获取游标
Cursor cursor = sqLiteDatabase.query("student", null, null, null, null, null, null);
//游标置顶
cursor.moveToFirst();
do {
int id=cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
int age=cursor.getInt(cursor.getColumnIndex("age"));
SQLite sqLite=new SQLite(id,name,age);
sqLiteList.add(sqLite);
adapter=new SQLiteAdapter(sqLiteList,this);
sql_lv.setAdapter(adapter);
} while (cursor.moveToNext());
下面是完整代码
package com.example.myapplication;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import com.amitshekhar.DebugDB;
import com.example.myapplication.adapter.SQLiteAdapter;
import java.util.ArrayList;
import java.util.List;
public class MySQLiteActivity extends AppCompatActivity implements View.OnClickListener {
private EditText sql_id, sql_name, sql_age;
private Button add_btn, select_btn, update_btn, delete_btn;
private List<SQLite> sqLiteList=new ArrayList<>();
private SQLiteAdapter adapter;
private ListView sql_lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_sqlite);
bindID();
DebugDB.getAddressLog();
}
private void bindID() {
sql_id = findViewById(R.id.sql_id);
sql_name = findViewById(R.id.sql_name);
sql_age = findViewById(R.id.sql_age);
add_btn = findViewById(R.id.add_btn);
add_btn.setOnClickListener(this);
select_btn = findViewById(R.id.select_btn);
select_btn.setOnClickListener(this);
update_btn = findViewById(R.id.update_btn);
update_btn.setOnClickListener(this);
delete_btn = findViewById(R.id.delete_btn);
delete_btn.setOnClickListener(this);
sql_lv=findViewById(R.id.sql_lv);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.add_btn:
addStudent();
break;
case R.id.select_btn:
sqLiteList.clear();
listStudent();
break;
case R.id.update_btn:
modifyStudent();
case R.id.delete_btn:
delStudent();
break;
default:
break;
}
}
private void delStudent() {
String name=sql_name.getText().toString();
String age=sql_age.getText().toString();
MySqliteHelper mySqliteHelper = new MySqliteHelper(this, "student_db", null, 1);
SQLiteDatabase sqLiteDatabase = mySqliteHelper.getWritableDatabase();
sqLiteDatabase.delete("student","name=? and age=?",new String[]{name,age});
}
private void modifyStudent() {
String name=sql_name.getText().toString();
String age=sql_age.getText().toString();
MySqliteHelper mySqliteHelper = new MySqliteHelper(this, "student_db", null, 1);
SQLiteDatabase sqLiteDatabase = mySqliteHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("name","小泽");
values.put("age","20");
/*
第一个参数:表名
第二个参数:需要更新的数据
第三个参数:修改条件
第四个参数:占位符填充值
*/
sqLiteDatabase.update("student",values,"name=? and age=?",new String[]{name,age});
}
private void listStudent() {
MySqliteHelper mySqliteHelper = new MySqliteHelper(this, "student_db", null, 1);
SQLiteDatabase sqLiteDatabase = mySqliteHelper.getWritableDatabase();
//获取游标
Cursor cursor = sqLiteDatabase.query("student", null, null, null, null, null, null);
//游标置顶
cursor.moveToFirst();
do {
int id=cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
int age=cursor.getInt(cursor.getColumnIndex("age"));
SQLite sqLite=new SQLite(id,name,age);
sqLiteList.add(sqLite);
adapter=new SQLiteAdapter(sqLiteList,this);
sql_lv.setAdapter(adapter);
} while (cursor.moveToNext());
}
private void addStudent() {
String name = sql_name.getText().toString();
int age = Integer.parseInt(sql_age.getText().toString());
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", age);
//第二参数是数据名
MySqliteHelper mySqliteHelper = new MySqliteHelper(this, "student_db", null, 1);
SQLiteDatabase sqLiteDatabase = mySqliteHelper.getWritableDatabase();
sqLiteDatabase.insert("student", null, values);
}
}