您的位置:首页 > 移动开发 > Android开发

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

2017-02-14 18:25 393 查看
SQLiteOpenHelper类
构造函数

实例方法

抽象方法

SQLiteOpenHelper类按如下步骤使用
定义继承自SQLiteOpenHelper的类MySQLHelper

得到MySQLHelper的一个实例

调用getWritableDatabase返回可对数据库读写的对象

对表中数据的操作








其他
onCreate方法的使用

数据库的位置

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: