在学习Android第一行代码的时候,由于电脑卡,运行安卓虚拟机卡,所以一直没有系统学习这方面内容,每次都是看一遍书就过了,现在还是一样的电脑,用的真机测试,发现真机也可以导出数据库表,所以就做了一些demo来系统的学习一下SQLite数据库的使用。
SQLite数据库的使用
- 创建一个类继承继承自SQLiteOpenHelper,并且要实现onCreate和onUpgrade方法,同时也要实现构造方法
public class MySQLite extends SQLiteOpenHelper{
public MySQLite(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
//第一个参数就是调用此类的上下文,第二个参数就是创建数据库的文件目录,第三个参数是系统创建CursorFactory,
//第一行代码里说这个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般传入null
//最后一个参数是版本号
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//初始化数据库,主要建立数据库中的表
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//如果数据库中有数据修改,当newVersion版本号变得时候,就会调用这个方法
}
}
另外SQLite数据类型很简单:integer 整形;real 浮点型;text 文本类型; blob 二进制类型;
2. 执行数据库中表的创建
在onCreate方法中执行创建数据库表的SQL语句
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table text_db(_id integer primary key autoincrement," +
"name varchar(20)," +
"age integer," +
"gender varchar(2))"); }
这个方法只能执行一次,只有在数据库第一次创建的时候才会执行。
接下来就是要操作数据库了
首先要获取SQLiteDatabase对象,因为增删改查操作全在这个类中,那么怎么获取这个对象呢?这个要使用getWritableDatabase(),或者是getReadableDatabase(),当然要调用这两个方法就要获取我们继承自SQLiteOpenHelper定义的类的对象,如:MySQLite db = new MySQLite ();然后调用db.getWritableDatabase()或者db.getReadableDatabase(),这两个方法的区别是,getWritableDatabase()以只读的方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,getReadableDatabase(),getReadableDatabase()方法先以读写方式打开数据库.
倘若使用的数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
在AndroidStudio中可以看看源码,贴一小部分以示友好·······
public SQLiteDatabase getReadableDatabase() {
synchronized (this) {
return getDatabaseLocked(false);
}
}
public SQLiteDatabase getWritableDatabase() {
synchronized (this) {
return getDatabaseLocked(true);
}
}
`
(1) insert操作
插入操作有两种方法,都是调用了SQLiteDatabase中的方法,一个是execSQL(),一个是insert(),如:
String sql = "insert into text_db(_id,name,age,gender)values("+num+",'"+namestr+"',"+agestr+",'"+sex+"')";
database.execSQL(sql);
ContentValues values = new ContentValues();
values.put("_id",num);
values.put("name",namestr);
values.put("age",agestr);
values.put("gender",sex);
database.insert("text_db",null,values);
第二种方法insert需要传入三个参数*public long insert(String table, String nullColumnHack, ContentValues values)
第一个参数就是表的名字,第二个是在未指定添加数据的情况下,给某些可为空的列自动赋值为NULL,一般传入null,第三个参数就是我们要添加的值,是用Hashmap来实现的
public ContentValues() {
// Choosing a default size of 8 based on analysis of typical
// consumption by applications.
mValues = new HashMap<String, Object>(8);
}
(2) delete操作
删除操作同上,也有两种方法,这里只贴出第二种方法
database.delete("text_db","_id=?",new String[]{num});
这几个参数的作用是public int delete(String table, String whereClause, String[] whereArgs)
第一个是要操作的表名,第二个是约束条件,相当于where后面的语句,第三个参数就是第二个参数列的具体的值。
下面源码看一下应该会很清晰了
SQLiteStatement statement = new SQLiteStatement(this, "DELETE FROM " + table +
(!TextUtils.isEmpty(whereClause) ? " WHERE " + whereClause : ""), whereArgs);
(3) update操作
ContentValues values1 = new ContentValues();
values1.put("_id",num);
values1.put("name",namestr);
values1.put("age",agestr);
values1.put("gender",sex);
database.update("text_db",values1,"_id=?",new String[]{num});
更新操作有点类似于插入操作要传入的参数 public int update(String table, ContentValues values, String whereClause, String[] whereArgs)—-第三个和第四个参数表示具体更新哪几行,比如上面的就是更新_id=num的这个一行的_id,name,age和gender属性值。
(4) query操作
这个操作步骤稍微多一点,首先说一下简单的rawQuery的操作
String sql1 = "select * from text_db";
Cursor cursor= database.rawQuery(sql1,null);
第二个参数可以传空值,也可以传数组,
String sql1 = "select * from text_db where _id=?,age=?";
Cursor cursor= database.rawQuery(sql1,new String[]{num,agestr});
使用API 的方法是
Cursor cursor = database.query("text_db",null,null,null,null,null,null);
这个要传入的参数挺多,
public Cursor query(String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having,
String orderBy)
table : from table_name –查询的表名
columns :select column1,column2 —指定查询的列明
selection :where colum = value —约束条件
selectionArgs: 为where中的占位符提供具体的值
groupBy: 指定需要groupby的列
having:根据groupby 的列进行约束
orderBy:指定查询结果的排序方式
有几篇博客写的挺好的这里我先贴出来一个
之后自己忘记的时候可以再看
https://blog.csdn.net/android_zyf/article/details/53420267