项目源码地址: https://github.com/JackLittlePig/NewsApp
简单创建:
String STUDUENT_TABLE_NAME = "student"; //学生表名
String CREATE_STUDENT_TABLE = "create table "
+ STUDUENT_TABLE_NAME
+ "("
+ "id integer primary key autoincrement "
+ ","
+ "name varchar(20)"
+ ","
+ "age integer"
+ ","
+ "classname varchar(20)"
+ ")";
public class SysDBHelper extends SQLiteOpenHelper {
public SysDBHelper(Context context) {
super(context, "defult_test.db", null, 2);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQLiteCommand.CREATE_STUDENT_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
一个Helper就够了
在 构造方法 中填写数据库名,以及数据库的版本
insert数据:
SQLiteDatabase db = mDBHelper.getReadableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", student.name);
contentValues.put("age", student.age);
contentValues.put("classname", student.className);
db.insert(SQLiteCommand.STUDUENT_TABLE_NAME, null, contentValues);
db.close();
可以通过 ContentValues put数据,然后根据表名,将数据插入进去
db.insert第二个参数的意思是:当你知道插入进去的时候是空的时候,那么至少,要指定一个列名,数据库自动插入null字符.因为SQLite不允许插入一条 完全空 的数据进去,这个参数一般是 用不到 的.
delete数据:
SQLiteDatabase db = mDBHelper.getWritableDatabase();
int delete = db.delete(SQLiteCommand.STUDUENT_TABLE_NAME
, "name = ?", new String[]{name});
db.close();
通过第二个参数,编写删除条件,?是占位符,第三个参数是占位符的数据,根据顺序替代占位符.可以删除
返回值是删除的数量
Update数据:
ContentValues contentValues = new ContentValues();
contentValues.put("classname", className);
SQLiteDatabase db = mDBHelper.getWritableDatabase();
int update = db.update(SQLiteCommand.STUDUENT_TABLE_NAME
, contentValues
, "name = ?"
, new String[]{name}
);
db.close();
是个增删的结合体,通过 ContentValues 将要修改的字段put进去,然后第三第四个参数,写 update 条件.用法与删除一样
Query数据:
SQLiteDatabase db = mDBHelper.getReadableDatabase();
Cursor cursor = db.query(
SQLiteCommand.STUDUENT_TABLE_NAME
, new String[]{"studentId", "name", "age", "classname"} //查询的列
, null //查询条件 如:name = ?
, null //查询条件的值 如 张三
, null
, null
, null);
List<Student> students = new ArrayList<>();
while (cursor.moveToNext()) {
Student student = new Student();
student.studentId = cursor.getInt(cursor.getColumnIndex("studentId"));
student.name = cursor.getString(cursor.getColumnIndex("name"));
student.age = cursor.getInt(cursor.getColumnIndex("age"));
student.className = cursor.getString(cursor.getColumnIndex("classname"));
students.add(student);
}
查询相对来说复杂点.第二个参数是要查询的结果字段.如果需要条件查询第三个参数和第四个参数用来写查询条件.用法与delete和update一样的.就不重复写了.
查询结果返回的是个 Cursor .
通过循环,将 Cursor 中的每条数据取出,并存储到需要的容器中
数据库升级:
public SysDBHelper(Context context) {
super(context, SQL_FILE_NAME, null, DB_VERSION);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d(TAG, "onUpgrade oldVersion = " + oldVersion + " , newVersion = " + newVersion);
db.execSQL(SQLiteCommand.CREATE_TEACHER_TABLE);
db.execSQL(SQLiteCommand.CREATE_CLASS_TABLE);
db.close();
}
数据库升级需要2个操作.
第一步: 在 SQLiteOpenHelper 的 构造方法中 ,改变第三个参数.是版本号,只可以改大不可以改小
第二步: 将数据库升级的代码,写在 onUpgrade 方法中, oldVersion 和 newVersion 是用来做检查判断的.根据新老版本号的不通,决定执行哪些内容.
需要注意的是: SQLite 数据库, 不支持列名修改 与 删除 ,只能 增加.
如果一定要解决这个问题.方案如下:
1. 修改表名
2. 新建表
3. 将之前的表数据都挪到新表中