写给初学者25_android_数据持久化_slqlite
来源:互联网 发布:gif制作 知乎 编辑:程序博客网 时间:2024/06/10 16:33
安卓25_数据持久化-SQLite
文件和共享参数的持久化能够帮助我们对一些简单,基本的信息进行一个储存,但是功能也是有局限性的,这个时候就需要数据库了。
安卓系统内置了一个SQLite数据库,一种轻量级的关系型数据库,如果你用过MySQL,或者Oracle这样的关系型数据库就能很快的上手了。对初学者来讲,最难得地方莫过于数据库语句不熟悉,而且系统原生的SQLite操作方式还是挺让人头大的,不过还好的就是有比较多第三方支持库,不过还是建议从基本的了解开始。
基本的一些类
- SQLiteOpenHelper
- SQLiteDatabase
- Cursor
- ContentValues
SQLiteOpenHelper用于对数据库的创建和更新,以及返回SQLiteDatabase对象,SQLiteDatabase主要负责的是数据库的增删改查操作,ContentValues用于增加和修改时的值操作,Cursor代表着查询结果集。
SQLiteOpenHelper 创建 更新数据库
- SQLiteOpenHelper是个抽象类
- 参数较多的构造方法
- onCreate()创建数据库时回调
- onUpgrade()数据库升级回调
- 返回SQLiteDatabase的getReadableDatabase()和getWritableDatabase()
继承
public class MySQLiteOpenHelper extends SQLiteOpenHelper { public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}
构造摘要
- context 上下文对象
- name 数据库名称
- fcatory 自定义结果集 一般使用默认的就好 传入null
- version 数据库版本号
onCreate() 创建数据库
一般在这儿执行一些新建表的操作。比如我们在这里新建一张表。
// 创建表的数据库语句public static final String TABLE_PERSON = "create table Person (" + "id integer primary key autoincrement, " +// id(主键) 整数类型 并且唯一 "name text, " +// name text 代表文本类型 "age integer, " + "height real" +// 身高 real 代表小数类型 ")";@Overridepublic void onCreate(SQLiteDatabase db) { // 回调返回SQLiteDatabase 进行数据库创建 db.execSQL(TABLE_PERSON);}
只要对数据库语句有一个基本的了解,这些语句其实很好搞定,如果不太熟悉可以在网上查阅,也给一个SQLite语法网站在这里http://www.runoob.com/sqlite/sqlite-syntax.html
另外我们接下来只需要执行任何的操作,系统就会回调onCreate,比如:
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MySQLiteOpenHelper openHelper = new MySQLiteOpenHelper(this,"DataDemo",null,1); openHelper.getReadableDatabase();}
直接获取一个Database对象,也会触发回调。
查看数据库文件
- 数据库文件的存放路径data/data//database/目录下
- SQLite可视化工具
- adb工具(初学者可以后面掌握)
1.使用ADM导出数据库文件
2.使用可是话工具查看数据库,我这里使用的是FireFox插件
可以看到我们的数据库已经创建成功。
需要注意的是,之后我们再执行相关操作的时候会发现onCreate不会再调用了,涉及到更新的时候我们再说。
更新数据库
如果我们有新建表,或者对表做了一次全新的升级,这个时候我们就需要回调onUpgrade了,这里很多人会犯一个错误,普遍会去再onCreate当中多执行一次SQL语句,达到创建表,会修改表的目的,但是当数据创建过了以后,数据库是不会再回调onCreate的。这个时候需要我们更改版本,回调我们的onUpgrade方法了。
比如我们这里在原有了的数据库上新建一张数据库表。
// 创建表的数据库语句public static final String TABLE_PERSON = "create table Person (" + "id integer primary key autoincrement, " +// id(主键) 整数类型 并且唯一 "name text, " +// name text 代表文本类型 "age integer, " + "height real" +// 身高 real 代表小数类型 ")";// 创建表的数据库语句public static final String TABLE_PET = "create table Pet (" + "id integer primary key autoincrement, " + "name text, " + "age integer, " + "weight real" + ")";@Overridepublic void onCreate(SQLiteDatabase db) { // 回调返回SQLiteDatabase 进行数据库创建 db.execSQL(TABLE_PERSON); db.execSQL(TABLE_PET);}
这是第一步,接着我们应该在创建SQLiteOpenHelper的时候将版本提升,用来回调到onUpgrade()方法
MySQLiteOpenHelper openHelper = new MySQLiteOpenHelper(this,"DataDemo",null,2);// 提升版本号 openHelper.getReadableDatabase();
更重要的是onUpgrade方法当中的实现。这里我们创建表的操作放到了onCreate中,我们可以直接调用,但是我们有过一张表,这个时候再创建就会出错,当然可以先删除后再创建,这么看起来是很鸡肋的。
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table if exists Bool"); onCreate(db);// 删除后再执行创建 }
数据库的基本操作-增删改查
增加数据
后面的操作,ContentValues和Corsor将逐渐使用到。大致的方式有两种:
1.insert方法
2.执行数据库插入语句
public void addData(){ SQLiteDataBase db = openHelper.getWritableDatabase(); ContentValues values = new ContentValues(); // 使用values装载数据 values.put("name","xxx"); values.put("age",19); values.put("height",190.5); // 执行插入方法 db.insert("Person",null,values); // 直接使用数据库语句插入数据 db.execSQL("insert into Person(name,age,height) values (?,?,?)" ,new String[]{"yyy","20","111"});}
相信两种方式对初学者都不会特别喜欢,令人抓狂的是,后面的操作更加让人疯狂。
更新数据
SQLiteDataBase db = openHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("age",29);db.update("Person",values,"name = ?",new String[]{"xxx"});
整段代码的意思是修改name为xxx的年级为29岁。下面是直接使用数据库语句的:
db.execSQL("update Person set age = ? where name = ? , new String[]{"29" , "xxx"}");
删除数据
SQLiteDataBase db = openHelper.getWritableDatabase();db.delete("Person","age > ?",new String[]{"15"});// 删除年纪大于15岁的人db.execSQL("delete from Person where age > ?",new String[]{"15"});
查询数据
掉用的方法是query,返回的是Cursor结果集。关键是query方法的参数有点多,初学者不太好理解。
先看最简单的查询所有
SQLiteDataBase db = openHelper.getWritableDatabase();// 得到返回结果集 这里是查询所有Cursor cursor = db.query("Person",null,null,null,null,null,null,);// 游标来到第一个if(cursor.moveToFirst()){ do{ // 进行取值 String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getString(cursor.getColumnIndex("age")); float height = cursor.getString(cursor.getColumnIndex("height")); }while(cursor.moveToNext());// 如果有下一个就一直取}cursor.close();// 关闭游标
可以看到就传递一长串的null,如果我们需要做精准一些的查询,这个时候这些参数就会派上用场了。你只需要根据参数类型和参数用途传递合适的值就Ok了。
基本的数据库操作要会,最好能熟练数据库语句
- 写给初学者25_android_数据持久化_slqlite
- 写给初学者23_android_数据持久化_文件
- 写给初学者24_android_数据持久化_共享参数_SharedPreferences
- 写给初学者26_android_数据持久化_LitePal_更简单的数据库操作
- 写给初学者02_android_常用工具
- 写给初学者01_android_什么是安卓
- 写给初学者03_android_第一个安卓程序
- 写给初学者03_android_第一个安卓程序
- 写给初学者14_android_界面代码优化
- 写给初学者16_android_常用控件_ListView
- 写给初学者17_Android_四大组件-Activity
- 写给初学者18_android_四大组件_Service
- 写给初学者20_android_四大组件_BroadCastReciver
- 写给初学者22_android_百分比布局
- 写给初学者04_android_安卓的视图
- 写给初学者08_android_一些常用的控件
- 写给初学者09_android_效果标签_shape_形状标签
- 写给初学者12_android_界面总结_初步
- python 对文件夹内的文件排序编号
- 前言
- WOJ 656 最小生成树 Prim
- 文章标题
- Python 备忘录
- 写给初学者25_android_数据持久化_slqlite
- 我们应该知道的<a>标签
- ZOJ 3494 BCD Code(数位dp+AC自动机)
- python使用selenium调用edge浏览器webdriver
- 【MySQL-性能优化】--MySQL外键约束简述
- bzoj 3709: [PA2014]Bohater 贪心
- 基于tp5文件上传到七牛云的插件
- 写给初学者26_android_数据持久化_LitePal_更简单的数据库操作
- JavaSE学习之IO流使用技巧