简介
SQLite是Android系统集成的一个轻量级的数据库。
Android提供了SQLiteDatabase代表一个数据库(底层就是一个数据库文件),一旦应用程序获得了代表指定数据库的SQLiteDatabase对象,接下来可通过SQLiteDatabase对象来管理、操作数据库了。
关键类SQLiteOpenHelper
Android为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper帮助类,通过SQLiteOpenHelper可用于管理数据库的创建和版本更新。一般的用法是创建SQLiteOpenHelper的子类,并重写它的onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion)方法。
SQLiteOpenHelper包含如下常用方法:
- synchronized SQLiteDatabase getReadableDatabase(): 以读写的方式打开数据库对应的SQLiteDatabase对象。一旦数据库的磁盘空间满了,数据库就只能读不能写。否则调用该方法将出现异常。
- synchronized SQLiteDatabase getWritableDatabase(): 以写的方式打开数据库对应的SQLiteDatabase对象。数据库的磁盘空间满了,调用该方法打开失败,失败后会继续尝试以只读的方式打开数据库。
- abstarct void onCreate(SQLiteDatabase db): 当第一次创建数据库时 回调该方法。当调用getReadableDatabase和getWritableDatabase方法用于获取操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,然后调用onCreate方法,该方法在初次创建数据库的时候才会被调用。
- abstract void onUpgrade(SQLiteDatabase db): 当数据库版本更新的时候回调该方法。SQLiteOpenHelper构造函数的中版本值不同,就会调用该方法。
- synchronized void close(): 关闭所有打开的SQLiteDatabase对象。
public class MyDatabaseHelper extends SQLiteOpenHelper {
// 创建一个Book表
public static final String CREATE_BOOK = "create table Book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
private Context mContext;
public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
// on
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
Toast.makeText(mContext, "Create succeed", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
这里我们在onCreate()方法中构建了一个MyDatabaseHelper对象,并且通过构造函数的参数将数据库名指定为BookStore.db,版本号指定为1,然后在Create database按钮的点击事件里调用了getWritableDatabase()方法。这样当第一次点击Create database按钮时,就会检测到当前程序中并没有BookStore.db 这个数据库,于是会创建该数据库并调用MyDatabaseHelper中的onCreate()方法,这样Book表也就得到了创建,然后会弹出一个Toast提示创建成功。再次点击Create database按钮时,会发现此时已经存在BookStore.db数据库了,因此不会再创建一次。
创建数据库
Activity 代码如下;
布局里面 就是一个创建数据库的Button,不在列出
public class SqliteMainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite_main);
/**
* 这个构造方法中接收4个参数,
* 第一个参数是Context,这个没什么好说的,必须要有它才能对数据库进行操作。
* 第二个参数是数据库名,创建数据库时使用的就是这里指定的名称。
* 第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null。
* 第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。
*/
myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
Button create_db_btn = findViewById(R.id.create_db_btn);
create_db_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myDatabaseHelper.getWritableDatabase();
}
});
}
}
创建的数据库文件会存放在/data/data/<package name>/databases/目录下
数据库操作
SQLiteDatabase的execSQL可以执行任何SQL语句,使用特定的方法操作SQLite数据库,也更加方便,接下来演示特定的方法操作数据库。
insert增加数据
SQLiteDatabase的insert方法为long insert(String table, String nullColumnHack,ContentValues values)
插入方法的参数说明如下:
- table:代表想插入的数据的表明
- nullColumnHack: 强行指定插入null值得数据列的列名。一般用不到,传入null即可。
- contentValues对象:类似于Map,提供了一系列的put方法重载,其中key为数据列的列名。
// 插入数据库
insert_btn = findViewById(R.id.insert_btn);
insert_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
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); // 插入第二条数据
}
});
不管第三个参数是否包含数据,执行insert()方法总会添加一条记录,如果第三个参数为空,则会添加一条除主键之外其他字段值都为null的记录。
insert()方法的底层实际上依然是通过构造 insert SQL语句来进行插入的,因此它生成的SQL语句总是形如下面的语句。
// ContentValues里key-value对的数量决定了下面的key-value对
insert into <表名>(key1, key2 ...)
values (value1 , value2 ...)
update方法更新记录
SQLiteDatabase update 方法update(String table, ContentValues values, StringwhereClause, String[] whereArgs),这个更新方法的参数说明如下:
- table:代表想更新数据的表名
- table:代表想更新数据的表名
- whereClause:满足该whereClause子句的记录将会被更新
- whereArgs:用于为whereClause子句传入参数
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);
// ?代表占位符,由第四个参数的字符串数组提供
int result = db.update("Book", values, "name = ?", new String[] { "The Da Vinci Code" });
}
});
该方法返回受此update语句影响的记录的条数
实际上,update方法底层对应的SQL语句如下:
update <table>
set key1=value1, key2=value2...
where <whereCalues>
其中whereArgs参数用于向whereClause中传入参数
使用delete方法删除记录
SQLiteDatabase delete 方法 delete(String table , String whereClause, String]whereArgs),这个删除方法的参数说明如下。
- table:代表想删除数据的表名。
- whereClause:满足该whereClause子句的记录将会被删除。
- whereArgs:用于为 whereClause 子句传入参数。
该方法返回受此 delete语句影响的记录的条数。
Button deleteButton = (Button) findViewById(R.id.delete_data);
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book", "pages > ?", new String[] { "500" });
}
});
实际上,delete方法底层对应的SQL语句如下:文章来源:https://www.toymoban.com/news/detail-579633.html
delete <table>
where <whereClause>
使用query方法查询记录
QLiteDatabase query 方法 Cursor query(boolean distinct, String table, String]columns, String whereClause, String] selectionArgs, String groupBy, String having, String orderBy,String limit),这个query方法的参数说明如下。
QLiteDatabase query 法的签名 Cursor query(boolean distinct, String table, String]columns, String whereClause, String] selectionArgs, String groupBy, String having, String orderBy,String limit),这个query方法的参数说明如下。文章来源地址https://www.toymoban.com/news/detail-579633.html
- table:执行查询数据的表名。
- columns:要查询出来的列名。相当于select 语句 select关键字后面的部分。
- whereClause:查询条件子句,相当于 select 语句where 关键字后面的部分,在条件子句中允许使用占位符“?”。
- selectionArgs:用于为 whereClause子句中的占位符传入参数值,值在数组中的位置与占位符在语句中的位置必须一致;否则就会有异常
- groupBy:用于控制分组。相当于select 语句group by 关键字后面的部分
- having: 用于对分组进行过滤。相当于 select 语句 having关键字后面的部分
- orderBy:用于对记录进行排序。相当于select 语句 order by 关键字后面的部分,如 personiddesc, age asclimit:用于进行分页。相当于 select 语句 limit 关键字后面的部分,如 5,10
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();
}
});
到了这里,关于Android之SQLite数据库使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!