我的学习篇三:Android 数据库操作复习(简单创建,插入数据,查询数据,Cursor 封装)
遇到使用Android 自带数据库SQLiteDatabase的场景
这里再学习一下
++++++++++++++++++++++++++++++++++++++ 漂亮的分割线 ++++++++++++++++++++++++++++++++++++++
基本用法 · 简单操作
(也没有多余的赘述直接干巴巴代码介绍~) 创建类 DBHelper 继承 SQLiteOpenHelper
public class DBHelper extends SQLiteOpenHelper
需要实现两个方法:
onCreate() : 数据库创建过了则不会执行,数据库不存在则会执行
onUpgrade(): 创建数据库时不会执行,增大版本号升级时才会执行到;一般在这里做数据升级时数据迁移操作
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
使用单例获取类 DBHelper 实例,并在构造方法中获取 打开数据库
private static DBHelper helper = null;
private SQLiteDatabase db = null;
public static DBHelper getInstance(Context context) {
if (helper == null) {
helper = new DBHelper(context);
}
return helper;
}
private DBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
if (db == null) {
db = getWritableDatabase();
}
this.context = context;
}
先定义一些名称及变量:
/* db 测试页面包名 */
String DB_TEST_PACHAGE_NAME = "com.example.bianjiangzhou.fristdemo.DBTestActivity";
/* db 测试页面名称 */
String DB_TEST_PAGE_TITLE = "DB测试页面";
//版本号
private static final int DBVERSION = 1;
//数据库名称
private static final String DBNAME = "bian_test.db";
//表名
private static final String TABLE_COMMON = "common_table";
//表名
private static final String TABLE_CONFIG = "config_table";
//表名
private static final String TABLE_PAGE_CONTENT = "page_content_table";
//定义 表 page_content_table 中的字段
private class PAGE_CONTENT_TABLE_FIELD {
/* 页面包名 */
static final String packageName = "packageName";
/* 页面名称 */
static final String pageTitle = "pageTile";
}
//创建表语句
public static final String CREATE_PAGE_CONTENT = "CREATE TABLE " + TABLE_PAGE_CONTENT + "(" +
"id integer PRIMARY KEY AUTOINCREMENT," +
PAGE_CONTENT_TABLE_FIELD.packageName + " text," +
PAGE_CONTENT_TABLE_FIELD.pageTitle + " text)";
//创建表方法
private void creatTable(SQLiteDatabase db) {
db.execSQL(CREATE_PAGE_CONTENT);
}
不会语句的可以看这个大哥的文章:
https://blog.csdn.net/gary__123456/article/details/76718492
https://blog.csdn.net/gary__123456/article/details/76736132
我们在onCreate方法中调用 创建表的方法;
在onUpgrade方法中 做 DROP 重建表操作
/* 数据库创建过了则不会执行,数据库不存在则会执行 */
@Override
public void onCreate(SQLiteDatabase db) {
creatTable(db);
}
/**
* 创建数据库时不会执行,增大版本号升级时才会执行到
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
/* 如果数据库中存在xxx_book表,就把它从数据库中drop掉。备份sql中一般都有这样的语句,
如果是数据库中有这个表,先drop掉,然后create表,然后再进行数据插入。 */
/* 这里实际上应该数据迁移,暂时还不会下面这句是别的大哥写的,然后去查了什么作用... */
db.execSQL("DROP TABLE IF EXISTS " + TABLE_PAGE_CONTENT);
onCreate(db);
}
接下来我们做一下数据初始化:
public void initTestData() {
String sql = "INSERT INTO " + TABLE_PAGE_CONTENT +
"(" + PAGE_CONTENT_TABLE_FIELD.packageName + "," + PAGE_CONTENT_TABLE_FIELD.pageTitle + ")" +
"VALUES" +
"(" + "'" + DB_TEST_PACHAGE_NAME + "'" + "," + "'" + DB_TEST_PAGE_TITLE + "'" + ")";
db.execSQL(sql);
LogUtil.d("db_test", "insert ok");
}
接下来进行测试:
创建一个activity页面调用 initTestData() 方法:
DBHelper.getInstance(this).initTestData();
控制台输出信息:
2019-07-25 00:53:23.156 20350-20350/? I/tm-db_test: insert ok
++++++++++++++++++++++++++++++++++++++ 漂亮的分割线 ++++++++++++++++++++++++++++++++++++++
查询测试
我们接下来查询一下表,验证是否数据存入
public void testDataQuery() {
String sql = "SELECT * FROM " + TABLE_PAGE_CONTENT;
Cursor cursor = db.rawQuery(sql, null);
LogUtil.d("db_test", "cursor json -- " + new Gson().toJson(getData(cursor)));
}
Cursor的用法可以参考这位大哥的博客:
https://www.cnblogs.com/to-creat/p/5189634.html
我封装了将Cursor中的数据去除转化为list集合的方法,不喜欢的直接操作Cursor的同学可以下哈:
/* 我理解的 cursor 中的数据 就是 你查询的字段在上面,查询出的值在下面,跟上方的字段一一对应,然后瀑布下来 */
/* 所以使用List 嵌套 map 集合,map 的k : 查询的字段, v: 对应的值 */
public List<Map<String, String>> getData(Cursor cursor) {
if (cursor == null) {
return null;
}
if (cursor.moveToFirst() == false) {
//为空的Cursor
return null;
}
LogUtil.d("db_test", "cursor line num: " + cursor.getCount());
List<Map<String, String>> list = new ArrayList<>();
/* cursor 指针 moveToFirst 的时候移动了一次,这里需要进行一次 取值*/
list.add(getMapData(cursor));
while (cursor.moveToNext()) {
/* 移动指针,继续取值 */
list.add(getMapData(cursor));
}
return list;
}
private Map<String, String> getMapData(Cursor cursor) {
Map<String, String> map = new HashMap<>();
/* 返回列的总数 */
for (int i = 0; i < cursor.getColumnCount(); i++) {
String k = cursor.getColumnName(i);
int index = cursor.getColumnIndex(k);
String v = cursor.getString(index);
map.put(k, v);
}
return map;
}
好了我们在之前写的测试页面调用方法:
DBHelper.getInstance(this).testDataQuery();
观察控制台输出信息:
2019-07-25 01:45:45.267 24637-24637/? I/tm-db_test: insert ok
2019-07-25 01:45:45.283 24637-24637/? I/tm-db_test: cursor line num: 1
2019-07-25 01:45:45.301 24637-24637/? I/tm-db_test: cursor json -- [{"pageTile":"DB测试页面","id":"1","packageName":"com.example.bianjiangzhou.fristdemo.DBTestActivity"}]
文中代码下载链接:
http://note.youdao.com/noteshare?id=d7f5029aafed6068627d84af61e68e00&sub=013BC8AC674B43D18375310C9AD4C459
ok暂时对于数据库操作的复习就到这里,如果能帮助到您是我的荣幸哦 ~
下一篇: EditText光标始终保持在文字末尾