Android开发——数据持久存储_SQLite数据库

SQLite是一款轻量级的关系型数据库。Android提供了SQLiteOpenHelper类用于管理数据库。


SQLiteOpenHelper类

SQLiteOpenHelper是抽象类。

构造函数

SQLiteOpenHelper(Context, String, CursorFactory, int):
参数:
    Context:
    String:数据库名,创建数据库时使用这个名称
    CursorFactory:Cursor对象,允许在查询数据的时候返回一个自定义的Cursor,一般传入null
    int:当前数据库的版本号,在升级数据库的时候会用到

实例方法

getReadableDatabase():可以创建或者打开或者升级已有的数据库,并返回可对数据库进行读写操作的SQLiteDatabase对象。此方法首先判断当前程序中是否有同名数据库,如果没有的话,创建数据库并调用onCreate()方法;如果有的话,判断版本号,版本号增加则升级,否则直接打开。
getWritableDatabase():同上。和getReadableDatabase()不同的是,当数据库不可写入时,getWritableDatabase()将出现异常,getReadableDatabase()返回只可以读数据库的对象。

抽象方法

onCreate(SQLiteDatabase):创建数据库的逻辑,比如在此函数中添加创建表的语句 db.execSQL(create_table_string),建表语句写成字符串create_table_string
onUpgrade(SQLiteDatabase, int, int):升级数据库的逻辑,在其中添加删除表的语句db.execSQL("drop table if exists table_name"),并调用onCreate()方法


SQLiteOpenHelper类按如下步骤使用

定义继承自SQLiteOpenHelper的类MySQLHelper
public class MySQLHelper extends SQLiteOpenHelper{
    public static final String CREATE_STUDENT = "create table Student ("
            + "id integer primary key autoincrement, "
            + "name text, "
            + "age integer)";
    private Context mContext;

    public MySQLHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL(CREATE_STUDENT);
        Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onUpgrage(SQLiteDatabase db, int oldVersion, int newVersion){

    }
}
得到MySQLHelper的一个实例
MySQLHelper dbHelper = new MySQLHelper(this, "School.db", null, 1);
调用getWritableDatabase()返回可对数据库读写的对象
dbHelper.getWritableDatabase();

对表中数据的操作

SQLiteDatabase对象可以对数据库进行操作。

db.insert(String, , ContentValues)
参数:
    String:表名
    :一般传入null
    ContentValues:要插入的记录。通过调用其put方法,并传入表中的列名以及对应的数据值。

dbHelper = new MySQLHelper(this, "School.db", null, 2);
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues record = new ContentValues();
record.put("name", "V");
record.put("age", 12);
db.insert("Student", null, record);
record.clear();
record.put("name", "John");
record.put("age", 15);
db.insert("Student", null, record);

db.delete(String, , ):
参数:
    String:表名
    后两个参数用于约束删除某一行或者某几行的数据,不指定的话删除所有行

db.delete("Student", "age>?", new String [] {"12"})

db.query(String table, String[] columns, String selections, String[] selectionArgs, String groupBy, String having, String orderBy):
参数:
    table:表名
    columns:查询哪几列,不指定的话查询所有列
    第三个和第四个参数用于约束查询某一行或者几行的数据,不指定的话查询所有行;
    第五个参数指定需要对查询结果进行group by的列,不指定的话不对查询结果进行group by;
    第六个参数对group by之后的结果进一步过滤,不指定的话表示不过滤;
    第七个参数指定查询结果的排序方式。

Cursor cursor = db.query("Student", null, null, null, null, null, null);#查询Student中所有数据
if (cursor.moveToFirst()){
    do {
        String name = cursor.getString(cursor.getColumnIndex("name"));
        int age = cursor.getInt(cursor.getColumnIndex("age"));
    }while (cursor.moveToNext());
}
cursor.close();

db.update(String, ContentValues, String, String []):
参数:
    String:表名
    ContentValues:更新数据
    最后两个参数用于约束修改某一行或者几行的数据,不指定的话修改所有行。第三个参数对应SQL语句的where。

ContentValues record = new ContentValues();
record.put("age", 13);
db.update("Student", record, "name=?", new String [] {"V"});//?是占位符,第四个参数提供的字符串数组中的每个字符串去填充?,应该在内部执行了一个for循环。

还可以通过SQL语句进行增删查改。


其他

onCreate方法的使用

假设要向数据库中再添加一个表,在onCreate()方法中添加一条建表语句,但是由于同名数据库已经存在,并不会再次执行onCreate()。这里就需要用到onUpgrade()方法。但是如何让onUpgrade()方法执行?既然问这个问题,就表明和onCreate()方法一样并不是开发者显式调用。秘密在数据库的版本号上。只要修改构建MySQLHelper实例时传入的版本号,使其比之前大,就会执行onUpgrade()方法。

public class MySQLHelper extends SQLiteOpenHelper{
    public static final String CREATE_STUDENT = "create table Student ("
            + "id integer primary key autoincrement, "
            + "name text, "
            + "age integer)";
    public static final String CREATE_TEACHER = "create table Teacher ("
            + "id integer primary key autoincrement, "
            + "name text, "
            + "age integer)";
    private Context mContext;

    public MySQLHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL(CREATE_STUDENT);
        db.execSQL(CREATE_TEACHER);
        Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onUpgrage(SQLiteDatabase db, int oldVersion, int newVersion){
        db.execSQL("drop table if exists Student");
        db.execSQL("drop table if exists Teacher");
        onCreate(db);
    }
}
MySQLHelper dbHelper = new MySQLHelper(this, "School.db", null, 2);
数据库的位置

/data/data/com.example.victoria.mediaplayer/databases/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值