<Android基础> (六) 数据存储 Part 3 SQLite数据库存储
6.4 SQLite数据库存储
SQLite是一种轻量级的关系型数据库,运算速度快,占用资源少。
6.4.1 创建数据库
Android为了管理数据库,专门提供了SQLiteOpenHelper帮助类,借助这个类可以对数据库进行创建和升级。
SQLiteOpenHelper是一个抽象类,需要创建一个自己的帮助类去继承它。
SQLiteOpenHelper有两个抽象方法,onCreate()和onUpgrade(),分别实现创建、升级数据库的逻辑。
SQLiteOpenHelper的另外两个重要的实例方法:getReadableDatabases()和getWritableDatabases(),这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在在则直接打开,否则则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。当数据库不可写入时(如磁盘已满),getReadableDatabases()方法返回额对象将以只读方式去打开数据库,而getWritable DATabase()方法则出现异常。
a. 新建MyDatabaseHelper类继承SQLiteOpenHelper
SQLiteOpenHelper的构造方法接收四个参数,第一个为Context,第二个为参数为数据库名,第三个为允许在查询数据的时候返回一个自定义的Cursor,一般为null,第四个表示当前数据库的版本号,用于对局库进行升级操作。
public class MyDatabaseHelper extends SQLiteOpenHelper {
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(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 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
b. 布局中加一个button
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <Button
android:id="@+id/create_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Create database"/>
</LinearLayout>
c.在MainActivity中给Button注册事件来创建数据库
构建出SQLiteOpenHelper的实例之后,调用.getWritableDatabase()方法
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dpHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dpHelper = 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) {
dpHelper.getWritableDatabase();
}
});
}
运行程序:

点击按钮就会显示Toast,并创建数据库。
6.4.2 升级数据库
添加一张Category()表
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table Book("
+"id integer primary key autoincrement, "
+"author text, "
+"price real, "
+"pages integer, "
+"name text)";
public static final String CREATE_CATEGORY = "create table CATEGORY("
+"id integer primary key autoincrement, "
+"category_name text, "
+"category_code integer)";
private Context mContext;
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);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
@Override
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);
}
}
在onUpgrade()方法中执行了两条DROP语句,如果发现数据库中已经存在Book表或Category表了,就将两张表删除掉,然后再调用onCreate()方法重建。
需要先将已经存在的表删除掉,若在创建时发现这张表已经存在了,就会直接报错。
在MainActivity中修改代码
dpHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
将版本号改为比1大的数即可,表明对数据库进行升级了。
在adb shell 中打开BookStore.db 数据库

表明创建了Book和Category
6.4.3 添加数据
对数据进行的操作有4种,CRUD,添加(Create),查询(Retrieve),更新(Update),删除(Delete)
SQL语言中,添加数据 insert,查询数据 select,更新数据 update,删除 delete
SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法都会返回一个SQLiteDatabase对象,借助这个对象进行所有的CRUD操作。
添加操作
SQLiteDatabase提供了一个insert()方法来添加数据,接收三个参数,第一个为表的名字,第二个用于在未指定添加数据的情况下给某些可为空的列自动赋值null,一般直接传入null,第三个参数是一个ContentValues对象,提供了一系列的put()方法重载,用于向ContentValues中添加数据,每个列名以及对应的待添加数据传入即可。
a.加一个button,用于添加数据
<Button
android:id="@+id/add_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add data"/>
b.修改MainActivity中的代码
Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dpHelper.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);
Toast.makeText(MainActivity.this, "Add successfully", Toast.LENGTH_SHORT).show();
}
});
运行程序:

点击按钮两次

6.4.4 更新数据
SQLiteDatabase提供了update()方法,接收4个参数。
第一个为表明,第二个是ContentValues对象,把更新的数据在这里装进去。第三、第四个参数用于约束更新某一行或某几行的数据,不指定的话默认就是更新所有行。
a.添加一个button用于更新数据
<Button
android:id="@+id/update_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Update data"/>
b.修改MainActivity中的代码
Button updateData = (Button) findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dpHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price", 10.99);
db.update("Book", values, "name = ?", new String[]{"The Da Vinci Code"});
}
});
value.put("price", 10.99) 表示把价格这一列的数据更新成10.99
update的第三个参数对应的是SQL语句的where部分,表明更新所有name等于?的行,而?是一个占位符,通过第四个参数提供的一个字符串数组为第三个参数中的每个占位符指定相应的内容,意图即为name为The Dat Vinci Code的价格改为10.99

可以看到The Da Vinci Code价格都更新为10.99

6.4.5 删除数据
SQLiteDatabase中提供了delete()方法,接收三个参数。
第一个为表名,第二、第三个参数用于约束删除每一行或某几行的数据,不指定的话默认删除所有。
a.加一个Button,用于删除表中数据
<Button
android:id="@+id/delete_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Delete data"/>
b.修改Mainactivity中的代码
Button deleteData = (Button)findViewById(R.id.delete_data);
deleteData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dpHelper.getWritableDatabase();
db.delete("Booke", "pages > ?", new String[]{"500"});
Toast.makeText(MainActivity.this, "Delete successfully", Toast.LENGTH_SHORT).show();
}
});
第二、第三个参数意思是从表中删除页数大于500的书
运行程序:

发现大于500页的书都已经从表中消失。

6.4.6 查询数据
SQL = Structured Query Language 结构化查询语言,主要功能体现在“查”上
SQLiteDataBase提供了query()方法用于对数据查询,最短的重载需要传入七个元素
| query()方法参数 | 对应SQL部分 | 描述 |
| table | from table_name | 指定查询的表名 |
| columns | select column1, column2 | 指定查询的列名 |
| selection | where column = value | 指定where的约束条件 |
| selectionArgs | - | 为where中的占位符提供具体的值 |
| groupBy | group by column | 指定需要group by的列 |
| having | having column = value | 对group by后的结果进行进一步约束 |
| orderBy | order by column1, comlumn2 | 指定查询结果的排序方式 |
在布局中加入Button query data
<Button
android:id="@+id/query_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Query Data"/>
修改MainAvtivity中的代码
Button queryData = (Button)findViewById(R.id.query_data);
queryData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dpHelper.getWritableDatabase();
//查询Book表中所有的数据
Cursor cursor = db.query("Book", null, null, null, null, null, null);
if(cursor.moveToFirst()){
do{
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 authur is " + author);
Log.d("MainActivity", "book page is " + pages);
Log.d("MainActivity", "book price is " + price);
}while(cursor.moveToNext());
}
cursor.close();
}
});
<Android基础> (六) 数据存储 Part 3 SQLite数据库存储的更多相关文章
- 4、Android-数据存储方案(SQLite数据库存储)
4.4.SQLite数据库存储 这是Android内置的数据库 是一款轻量级的关系型数据库 运算速度非常快.占用资源少.通常只需要几百kb的内存就够了 因而特别适合在移动端设备上使用 SQLite不仅 ...
- <Android基础> (六) 数据存储 Part 1 文件存储方式
第六章 数据存储 6.1 持久化技术 持久化技术指将内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失. 主要有三种方式用于简单地实现数据持久化功能:文件存储.S ...
- <Android基础> (六) 数据存储 Part 2 SharedPreferences方式
6.3 SharedPreferences存储 SharedPreferences使用键值对的方式来存储数据.同时支持多种不同的数据类型. 6.3.1 将数据存储到SharedPreferences中 ...
- Android学习之基础知识九 — 数据存储(持久化技术)之SQLite数据库存储
前面一讲介绍了数据持久化技术的前两种:文件存储.SharedPreferences存储.下面介绍第三种技术:SQLite数据库存储 一.SQLite数据库存储 SQLite数据库是一款轻量级的关系型数 ...
- Android中数据存储(三)——SQLite数据库存储数据
当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢? 数据存储方式 Android 的数据存储有5种方式: 1. Share ...
- android基础---->JSON数据的解析
上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...
- 安卓数据存储(3):SQLite数据库存储
SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级:使用 SQLit ...
- 使用嵌入式关系型SQLite数据库存储数据
除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库—SQLite, 1.SQLite3支持 ...
- android基础---->XMl数据的解析
在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据,JSON的解析可以参见我的博客(android基础---->JSON数据的解析).解析XML 格式 ...
随机推荐
- java 深克隆(深拷贝)与浅克隆(拷贝)详解
java深克隆和浅克隆 基本概念 浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所拷贝的对象,而不复制它所引用的对 ...
- git status 显示中文乱码
场景 在使用git命令行查看当前 状态时, git status 显示中文文件乱码: 解决 修改git配置, git config --global core.quotepath false
- nlp中文分词(jieba和pyltp)
分词是中文自然语言处理的基础.目前常用的分词算法有 1.张华平博士的NShort中文分词算法. 2.基于条件随机场(CRF)的中文分词算法. 这两种算法的代表工具包分别是jieba分词系统和哈工大的L ...
- 浏览器与android移动端视频互播技术实现
手机端与平台之间的视频直播功能,主要通过集成多种开源视频框架以及采购第三方视频直播服务器产品来实现预定业务需求.视频直播对话功能的实现,主要经历了三个阶段:利用开源视频框架实现视频直播.采购第三方视频 ...
- 从零学习Fluter(六):Flutter仿boss直聘v1.0重构
今天继续学习flutter,觉得这个优秀的东西,许多方面还需要完善,作为一个后来者,要多向别人学习.俗话说,“学无先后,达者为师”.今天呢,我又重新把flutter_boss这个项目代码 从头到脚看了 ...
- 简单易懂的单元测试框架-gtest(二)
简介 事件机制用于在案例运行前后添加一些操作(相当于挂钩函数).目前,gtest提供了三种等级的事件,分别: 全局级,所有案例执行的前后 TestSuite级,某一个案例集的前后 TestCa ...
- 十款 Chrome 扩展工具,提高前端编码效率
1. 掘金 Chrome 插件 对于开发者来说,比开发过程更重要的,应该要算平时对于开发资源以及技术文章一点一滴的积累了吧.那么,开发者能够在哪里获取需要的技术内容呢?过去,你可能需要在 GitHub ...
- 如何学好java
今天发现这么一篇文章,对于笔者谈的:"一方面很努力学习,一方面又觉得不踏实",我感同身受.觉得文章写得不错,在此献给一些在java中努力的朋友们,希望能有所收获. 文章原内容: 近 ...
- PowerDesigner 提示 Existence of index、key、reference错误
一.建立一个表后,为何检测出现Existence of index的警告 A table should contain at least one column, one index, one key, ...
- 总结JAVA----IO流中的字节流
对于IO流中字节流的总结 字节流的概念 由于应用程序,经常需要和文件打交道,所以Inputstream专门提供了读写文件的子类:FileInputStream和FileOutputStream类,如果 ...