前言:
Android为了让我们更加方便的管理数据库,专门提供了SQLiteOpenHelper帮助类,借助这个类可以简单的对数据库进行创建和升级。
下面介绍一下SQLiteOpenHelper:(扩展知识)
SQLiteOpenHelper类介绍 定义:SQLiteOpenHelper是一个辅助类 作用:管理数据库(创建、增、修、删) & 版本的控制。 使用过程:通过创建子类继承SQLiteOpenHelper类,实现它的一些方法来对数据库进行操作。 在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。 SQLiteOpenHelper类的数据库操作方法介绍方法名 | 作用 | 备注 |
---|---|---|
onCreate() | 创建数据库 | 创建数据库时自动调用 |
onUpgrade() | 升级数据库 | |
close() | 关闭所有打开的数据库对象 | |
execSQL() | 可进行增删改操作, 不能进行查询操作 | |
query()、rawQuery() | 查询数据库 | |
insert() | 插入数据 | |
delete() | 删除数据 | |
getWritableDatabase() | 创建或打开可以读/写的数据库 | 通过返回的SQLiteDatabase对象对数据库进行操作 |
getReadableDatabase() | 创建或打开可读的数据库 | 同上 |
我们知道:
SQLiteOpenHelper 是一个抽象类,abstract class.
拥有成员变量,mName(数据库名称),mNewVersion(数据库版本),mDatabase(数据库)等.
构造函数需要传递,context,数据库名称,数据库版本等信息.
SQLiteOpenHelper(Context context, String name, CursorFactory factory,int version)
实现了以下函数:
getDatabaseName
getWritableDatabase
getReadableDatabase
onDowngrade
close
subclass需要实现以下函数:
public abstract void onCreate(SQLiteDatabase db);
public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion);
它是一个抽象类,意味着我们要使用它就需要创建一个自己的类去继承它,两个抽象方法:onCreate()和onUpgrade(),需要重写,实现创建、升级数据库的逻辑。
实例方法:getReadableDatabase()和getWritableDatabase(),如果存在打开,不存在时创建,当磁盘满了,上一个以只读方式打开,writable出现异常。
构造方法:参数:Context,daba_name,Cursor,version
存在位置:/data/data//databases/目录下。
1.创建数据库我们用AS创建一个DatabaseTest项目,先来熟悉建表的相关语句:
建表语句:create table Book{
id integer primary key autoincrement,//组件,id列自增长
author text,//文本类型
price real,//浮点型
pages integer,//整型
name text)
}
新建MyDatabaseHelper类继承SQLiteOpenHelper
public class MyDatabaseHelper extends SQLitePenHelper{
pulic static final String CREATE_BOOK = "create table Book("
+"id integer primary key autonincreament,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)";
private ContextmContext;
public MyDatabaseHelper(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_BOOK);
Toast.makeText(mContext,"Create succeeded",Toast.LENGTH_SHORT)
.show();
}
@Override
public void onUpagrade(SQLiteDatabase db,int oldVersion, int newVersion)
){}
}
用Android Studio创建过程:
首先activity_main.xml
修改MainActivity
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}
查看:
可以使用命令行来查看信息,翻到文末的资料小卡片了解更多->>>
/data/data/com.example.databasetest/databases/
使用ls查看
两个文件,一个BookStore.db,借助sqlite3+数据库名
查看表:.table
.schema查看建表语句
.exit退出
2.升级数据库
如果想添加一张Catagory表用于记录图书的分类
首先:建表语句如下:create table Category (
id integer primary key autoincrement,
category_name text,
category_code integer)
添加到MyDatabaseHelper中
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
版本升级变为2
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}
建表完成之后接下来就是基本操作CRUD(Create,Retrieve,Updata,Delete)
3.添加数据
我们在调用SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法,返回了SQLitaDatabase对象,所以我们借助这个对象进行操作。
操作的方法: insert()方法(表名,null, ContenValues对象:提供put()方法重载以此添加数据)
建立UI
点击事件添加逻辑
Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// 开始组装第一条数据
values.put("name", "The Da Vinci Code");
values.put("author", "Dan Brown");
values.put("pages", 454);
values.put("price", 16.96);
db.insert("Book", null, values); // 插入第一条数据
values.clear();
// 开始组装第二条数据
values.put("name", "The Lost Symbol");
values.put("author", "Dan Brown");
values.put("pages", 510);
values.put("price", 19.95);
db.insert("Book", null, values); // 插入第二条数据
}
});
4.更新数据
update()方法(表名,ContenValues对象,第三,第四约束更新的数据,不指定就是默认更新所有行)
UI
逻辑
Button updateData = (Button) findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price", 10.99);
db.update("Book", values, "name = ?", new String[] { "The Da Vinci
Code" });
}
});
5.删除数据
delete()方法(表名,第二第三约束删除某一行或某几行)
UI
逻辑
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book", "pages > ?", new String[] { "500" });
}
});
6.查询数据
query()方法(表名,指定查询那几列,第三第四约束查询某一行或者某几行,第五指定需要取group by的列,不指定则表示不操作,第六对group by进一步的操作,第七指定查询结果的排序方式)
UI
逻辑
Button queryButton = (Button) findViewById(R.id.query_data);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 查询 Book 表中所有的数据
Cursor cursor = db.query("Book", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
// 遍历 Cursor 对象,取出数据并打印
String name = cursor.getString(cursor.getColumnIndex
("name"));
String author = cursor.getString(cursor.getColumnIndex
("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex
("price"));
Log.d("MainActivity", "book name is " + name);
Log.d("MainActivity", "book author is " + author);
Log.d("MainActivity", "book pages is " + pages);
Log.d("MainActivity", "book price is " + price);
} while (cursor.moveToNext());
}
cursor.close();
}
});
7.展示图片:
例如使用SQL
添加数据的方法如下:
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" });
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Lost Symbol", "Dan Brown", "510", "19.95" });
更新数据的方法如下:
db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99",
"The Da Vinci Code" });
删除数据的方法如下:
db.execSQL("delete from Book where pages > ?", new String[] { "500" });
查询数据的方法如下:
db.rawQuery("select * from Book", null);
资料:
在命令行操作使用SQL语句操作SQLite数据库
1)adb shell 进入
2)在终端输入“sqlite3”进入命令行操作界面
sqlite>
sqlite>
…
3)常用的sqlite3命令
.help
.exit/.quit 退出
ctrl+L//清屏
2 常用SQL语句
2.1 创建数据库
语法:
sqlite3 testDB.db
创建名字为testDB.db数据库文件,然后进入sqlite命令行界面
sqlite> .databases //查看当前操作数据库的信息
2.2 创建表(Table)
语法:
CREATE TABLE table_name(
column1 datatype [PRIMARY KEY],
column2 datatype ,
…);
注:不区分大小写,习惯关键字用大写
PRIMARY KEY:主键,表示该类数据不能重复,可以加快数据库的访问,一张表中只有一列可以声明为主键。
eg:创建company表:ID、姓名、年龄、地址、薪资
sqlite> CREATE TABLE company(
…> id INT PRIMARY KEY,
…> name TEXT,
…> age INT,
…> address TEXT,
…> salary REAL NOT NULL);
.tables :查看当前数据库中存在数据表
.schema:查看数据表的完整信息
2.3删除表
语法:
DROP TABLE table_name;
2.4向数据表中插入数据
语法:
INSERT INTO table_name
(column1,column2,column3,…)
VALUES(value1,value2,value3,…)
eg:
sqlite> INSERT INTO company
…> (id,name,salary)
…> VALUES(10086,“张飞”,12000);
sqlite> SELECT * FROM company; //查询表中全部数据
2.5从数据表删除一条数据
语法:
DELETE FROM table_name WHERE [condition];
参考资料:《第一行代码》《Android权威编程指南》
作者:threecat.up